STM32 USB設(shè)計(jì)原理
1.usb描述符配置
1.1設(shè)備描述符
const u8 Joystick_DeviceDescriptor[JOYSTICK_SIZ_DEVICE_DESC] =
{
}
設(shè)備描述符兩個(gè)重要參數(shù)是生產(chǎn)商ID和產(chǎn)品ID,主機(jī)將根據(jù)以上兩個(gè)ID為設(shè)備選擇相應(yīng)驅(qū)動(dòng)程序。在我們的應(yīng)用中,我們一般只需修改例子中的這兒兩個(gè)參數(shù)即可完成設(shè)備描述符的設(shè)置。
1.2配置描述符
const u8 Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC] =
{
}
還有一些其他配置可以參可相關(guān)資料與例子加以理解。
2.USB通訊的執(zhí)行過程。
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);
在定義完端點(diǎn)后,我們就可以使用端點(diǎn)進(jìn)行數(shù)據(jù)傳輸了。
向主機(jī)輸入數(shù)據(jù)(in):IN傳輸過程是
1.向緩沖區(qū)填入數(shù)據(jù);
2.設(shè)定USB數(shù)據(jù)計(jì)數(shù)器:
3.設(shè)置USB輸出有效。
XXX_send()
{
UserToPMABufferCopy(sendBuffer, ENDP1_TXADDR, 2);
SetEPTxValid(ENDP1);
}
注意一般情況下,端點(diǎn)的輸入輸出緩沖區(qū)地址沒有定義,須在usb_conf.h中定義具體定義可以參考端點(diǎn)0的定義。
讀從主機(jī)輸出的數(shù)據(jù)(out):out傳輸過程是
1.定義out回調(diào)函數(shù);
2.從緩沖區(qū)讀出數(shù)據(jù):
3.設(shè)置USB輸入有效。
void EP1_OUT_Callback(void)
{
u8 DataLen;
DataLen = GetEPRxCount(ENDP1);
PMAToUserBufferCopy(rcvData, ENDP1_RXADDR, DataLen);
SetEPRxValid(ENDP1);
}
評(píng)論