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

posted @ 2019-08-19 13:18  得一寸  阅读(2090)  评论(0编辑  收藏  举报