STM32 USB設計原理
1.usb描述符配置
1.1設備描述符
const u8 Joystick_DeviceDescriptor[JOYSTICK_SIZ_DEVICE_DESC] =
{
}
設備描述符兩個重要參數是生產商ID和產品ID,主機將根據以上兩個ID為設備選擇相應驅動程序。在我們的應用中,我們一般只需修改例子中的這兒兩個參數即可完成設備描述符的設置。
1.2配置描述符
const u8 Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC] =
{
}
還有一些其他配置可以參可相關資料與例子加以理解。
2.USB通訊的執行過程。
SetEPType(ENDP1, EP_INTERRUPT);
SetEPRxAddr(ENDP1, ENDP1_RXADDR);
SetEPRxCount(ENDP1, 8);
SetEPType(ENDP1, EP_INTERRUPT);
SetEPTxAddr(ENDP1, ENDP1_TXADDR);
SetEPTxCount(ENDP1, 64);
SetEPTxStatus(ENDP1, EP_TX_NAK);
在定義完端點后,我們就可以使用端點進行數據傳輸了。
向主機輸入數據(in):IN傳輸過程是
1.向緩沖區填入數據;
2.設定USB數據計數器:
3.設置USB輸出有效。
XXX_send()
{
UserToPMABufferCopy(sendBuffer, ENDP1_TXADDR, 2);
SetEPTxValid(ENDP1);
}
注意一般情況下,端點的輸入輸出緩沖區地址沒有定義,須在usb_conf.h中定義具體定義可以參考端點0的定義。
讀從主機輸出的數據(out):out傳輸過程是
1.定義out回調函數;
2.從緩沖區讀出數據:
3.設置USB輸入有效。
void EP1_OUT_Callback(void)
{
u8 DataLen;
DataLen = GetEPRxCount(ENDP1);
PMAToUserBufferCopy(rcvData, ENDP1_RXADDR, DataLen);
SetEPRxValid(ENDP1);
}
評論