|
在stm32f103 usbcdc庫函數(shù)中有這樣一段代碼:
void SOF_Callback(void)
{
static uint32_t FrameCount = 0;
if(bDeviceState == CONFIGURED)
{
if (FrameCount++ == VCOMPORT_IN_FRAME_INTERVAL)
{
FrameCount = 0;
EP1_IN_Callback();
//Handle_USBAsynchXfer();
}
}
}
SOF,其實(shí)是START OFFRAME的簡(jiǎn)寫,就是幀首的意思,全速設(shè)備,主機(jī)5ms會(huì)發(fā)送一次,當(dāng)然這個(gè)5ms并不是固定的,與你的描述符有關(guān):例如,我的描述符定義如下:
const uint8_t Virtual_Com_Port_ConfigDescriptor[] =
{
0x09,
USB_CONFIGURATION_DESCRIPTOR_TYPE,
VIRTUAL_COM_PORT_SIZ_CONFIG_DESC,
0x00,
0x02,
0x01,
0x00,
0xC0,
0x32,
0x09,
USB_INTERFACE_DESCRIPTOR_TYPE,
0x00,
0x00,
0x01,
0x02,
0x02,
0x01,
0x00,
0x05,
0x24,
0x00,
0x10,
0x01,
0x05,
0x24,
0x01,
0x00,
0x01,
0x04,
0x24,
0x02,
0x02,
0x05,
0x24,
0x06,
0x00,
0x01,
0x07,
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x82,
0x03,
VIRTUAL_COM_PORT_INT_SIZE,
0x00,
0xFF,
0x09,
USB_INTERFACE_DESCRIPTOR_TYPE,
0x01,
0x00,
0x02,
0x0A,
0x00,
0x00,
0x00,
0x07,
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x03,
0x02,
VIRTUAL_COM_PORT_DATA_SIZE,
0x00,
0x00,
0x07,
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x81,
0x02,
VIRTUAL_COM_PORT_DATA_SIZE,
0x00,
0x00
};
就是配置描述符里紅色字體部分,這個(gè)確定了主機(jī)每次發(fā)送SOF幀的間隔時(shí)間,所以我們?cè)谑褂胾sb往主機(jī)上推送數(shù)據(jù)時(shí),可以直接調(diào)用這個(gè)函數(shù):
EP1_IN_Callback();在EP1_IN_Callback()函數(shù)里寫入響應(yīng)的代碼,另外一種就是調(diào)用
下面這個(gè)函數(shù)直接發(fā)送
void usb_SendBuf(uint8_t *_pTxBuf, uint8_t _ucLen)
{
UserToPMABufferCopy(_pTxBuf, ENDP1_TXADDR, _ucLen);
SetEPTxCount(ENDP1, _ucLen);
SetEPTxValid(ENDP1);
}
這是開發(fā)過程中的一點(diǎn)見解,如果有什么問題,請(qǐng)及時(shí)聯(lián)系!
|
|