stm32f4,CDC迁移为Bulk设备
搞懂以下问题,来理解USB
主机发送2字节时,小于端点的容量,怎么标志包的结束
内部自动完成,发送几个数都可以。是底层自动完成的
主机发送513字节时,大于端点的容量,怎么分包?
txFifo空中断中,将数据拷贝到FIFO,调整指针。
数据如何从stm32发给电脑:
app调用usbd_cdc_if.c中的CDC_Transmit_HS();
CDC_Transmit_HS调用usbd_cdc.c中的USBD_CDC_TransmitPacket();
USBD_CDC_TransmitPacket调用usbd_conf.c中的USBD_LL_Transmit();
USBD_LL_Transmit调用 stm32f4_hal_pcd.c中的HAL_PCD_EP_Transmit();
HAL_PCD_EP_Transmit调用stm32f4_ii_usb.c中的USB_EPStartXfer();
USB_EPStartXfer设置了发送数据大小,并使能IN端点; 要发送的数据时怎么让USB外设知道的:
CDC_Transmit_HS调用usbd_cdc.c中的USBD_CDC_SetTxBuffer
USBD_CDC_SetTxBuffer中设置hcdc->TxBuffer,hcdc->TxLength
HAL_PCD_EP_Transmit中设置ep->xfer_buff,ep->xfer_len
stm32f4_ii_usb.c中的USB_EPStartXfer设置打开TX FIFO空中断;
stm32f4xx_hal_pcd.c中的HAL_PCD_IRQHandler,IN端点中断调用PCD_WriteEmptyTxFifo();
PCD_WriteEmptyTxFifo调用stm32f4_ii_usb.c中的USB_WritePacket,并调整buff指针和len;
USB_WritePacket将数据搬运到usb的fifo中
注意,数据传输完的总中断:
programmed size(全部数据)传输完毕后,stm32f4_hal_pcd.c中的HAL_PCD_IRQHandler()中断调用usbd_conf.c中的HAL_PCD_DataInStageCallback
HAL_PCD_DataInStageCallback调用usbd_core.c中的USBD_LL_DataInStage ,其中调用了pdev->pClass->DataIn()
实际usbd_cdc.c中的USBD_CDC_DataIn通过注册已经绑定为pdev->pClass->USBD_CDC_DataIn;
USBD_CDC_DataIn中判断长度如果时整数包长度,就发送一个0长度的包,否则不发送。
一次发送至此,结束。
综上,stm32发给电脑,完全是主动方式,期间不需要电脑的参与。
数据如何从电脑发给stm32:
电脑发给stm32一个包;
stm32进入中断的RXFIFO noEmpty中断,其中GRXSTSP中指明是哪个out端点中断
中断的是out数据包,且个数不为0,调用stm32f4_ii_usb.c中的USB_ReadPacket();
USB_ReadPacket将FIFO数据读入ep->xfer_buff,
usbd_cdc.c中的USBD_CDC_Init、和usbd_cdc_if.c中的USBD_CDC_ReceivePacket调用USBD_LL_PrepareReceive()已经设置了缓冲区指针,上一步相当于直接写入用户自定义数组中。
要接收的大小,一旦这个programmed大小传输完,就会进入out中断XFRC,标志所有数据传输完毕,接着调用用户程序,然后再次调用prepare,准备好下一次接收。
怎么理解数据都是由主机发送的?从机不能主动发送数据给从机,在主机没发起的情况下?
修改VID,PID,即能识别为光谱仪
usbd_conf.c中包含bsp.h文件,设定中断vect
uc/osiii不能够设置断点调试,解决方式:https://blog.csdn.net/qq_24276421/article/details/52461061
串口中断的优先级需要调整,大于0
USB只能接收一次,
USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum,uint8_t *pdata)
端点0在内部处理
其它端点通过回调函数处理:pdev->pClass->DataIn(pdev, epnum);
在usb_conf中,这个函数调用的:void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
HAL_PCD_DataInStageCallback
在stm32f4xx_hal_pcd.c的,void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)中调用
HAL_PCD_IRQHandler_HS
在usb_conf.c的void HAL_PCD_IRQHandler_HS(void)中调用
HAL_PCD_IRQHandler_HS
BSP_IntVectSet(BSP_INT_ID_OTG_HS, HAL_PCD_IRQHandler_HS);
在osIII的中断向量表映射至OTG_HS
DOEPTSIZx
PKTCNT是组成XFRSIZE需要多少数据包
XFRSIZE是传输的总数据,可以设置为max packet size of EP,这样每个数据包都会XFRC中断,可以进行处理;也可以设置大于max packet size,这样core会自动把多个数据包存入memory,最后一个包进入XFRC中断;XFRC中断的条件:1,XFRSIZE=0;2,size<max packet size