STM32 USB虚拟串口问题!

[复制链接]
 楼主| Evanss 发表于 2014-11-30 20:03 | 显示全部楼层 |阅读模式
有大神能帮我解释下这几段程序吗。
问题1:发送数据到底在那个程序里面发送的?是EP1_IN_Callback()还是SOF_Callback()
问题2:为什么EP1_IN_Callback()中的判断是 if (USB_Tx_State == 1),正在发送还继续发?
问题3:EP1_IN_Callback()是在正确传输时调用的吗?还是对SOF中断不太了解。
求大神,感激不尽。
  1. void EP1_IN_Callback (void)
  2. {
  3.   uint16_t USB_Tx_ptr;
  4.   uint16_t USB_Tx_length;
  5.   
  6.   if (USB_Tx_State == 1)
  7.   {
  8.     if (USART_Rx_length == 0)
  9.     {
  10.       USB_Tx_State = 0;
  11.     }
  12.     else
  13.     {
  14.       if (USART_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE){
  15.         USB_Tx_ptr = USART_Rx_ptr_out;
  16.         USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;
  17.         
  18.         USART_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;
  19.         USART_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;   
  20.       }
  21.       else
  22.       {
  23.         USB_Tx_ptr = USART_Rx_ptr_out;
  24.         USB_Tx_length = USART_Rx_length;
  25.         
  26.         USART_Rx_ptr_out += USART_Rx_length;
  27.         USART_Rx_length = 0;
  28.       }
  29.       UserToPMABufferCopy(&USART_Rx_Buffer[USB_Tx_ptr], ENDP1_TXADDR, USB_Tx_length);
  30.       SetEPTxCount(ENDP1, USB_Tx_length);
  31.       SetEPTxValid(ENDP1);
  32.     }
  33.   }
  34. }
  35. void SOF_Callback(void)
  36. {
  37.   static uint32_t FrameCount = 0;
  38.   
  39.   if(bDeviceState == CONFIGURED)
  40.   {
  41.     if (FrameCount++ == VCOMPORT_IN_FRAME_INTERVAL)
  42.     {
  43.       /* Reset the frame counter */
  44.        FrameCount = 0;
  45.       
  46.       /* Check the data to be sent through IN pipe */
  47.       Handle_USBAsynchXfer();
  48.     }
  49.   }  
  50. }
  51. /*******************************************************************************
  52. * Function Name  : Handle_USBAsynchXfer.
  53. * Description    : send data to USB.
  54. * Input          : None.
  55. * Return         : none.
  56. *******************************************************************************/
  57. void Handle_USBAsynchXfer (void)
  58. {
  59.   
  60.   uint16_t USB_Tx_ptr;
  61.   uint16_t USB_Tx_length;
  62.   
  63.   if(USB_Tx_State != 1)
  64.   {
  65.     if (USART_Rx_ptr_out == USART_RX_DATA_SIZE)
  66.     {
  67.       USART_Rx_ptr_out = 0;
  68.     }
  69.    
  70.     if(USART_Rx_ptr_out == USART_Rx_ptr_in)
  71.     {
  72.       USB_Tx_State = 0;
  73.       return;
  74.     }
  75.    
  76.     if(USART_Rx_ptr_out > USART_Rx_ptr_in) /* rollback */
  77.     {
  78.       USART_Rx_length = USART_RX_DATA_SIZE - USART_Rx_ptr_out;
  79.     }
  80.     else
  81.     {
  82.       USART_Rx_length = USART_Rx_ptr_in - USART_Rx_ptr_out;
  83.     }
  84.    
  85.     if (USART_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE)
  86.     {
  87.       USB_Tx_ptr = USART_Rx_ptr_out;
  88.       USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;
  89.       
  90.       USART_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;       
  91.       USART_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;       
  92.     }
  93.     else
  94.     {
  95.       USB_Tx_ptr = USART_Rx_ptr_out;
  96.       USB_Tx_length = USART_Rx_length;
  97.       
  98.       USART_Rx_ptr_out += USART_Rx_length;
  99.       USART_Rx_length = 0;
  100.     }
  101.     USB_Tx_State = 1;
  102.     UserToPMABufferCopy(&USART_Rx_Buffer[USB_Tx_ptr], ENDP1_TXADDR, USB_Tx_length);
  103.     SetEPTxCount(ENDP1, USB_Tx_length);
  104.     SetEPTxValid(ENDP1);
  105.   }  
  106.   
  107. }
 楼主| Evanss 发表于 2014-12-1 14:15 | 显示全部楼层
唉,求大神啊。
zjwyczj 发表于 2014-12-24 15:56 | 显示全部楼层
问题1:发送数据到底在那个程序里面发送的?是EP1_IN_Callback()还是SOF_Callback()
发送数据给主机可以在while循环中,看你自己怎么弄了。EP1_IN_Callback()函数是因为你发送的数据已经被usb主机读走了,产生的中断,进入这个函数。SOF_Callback()函数是你接收到SOF帧的时候进到这里。最好不要再这两个函数中,你在EP1_IN_Callback()发送的话就不停的发数据给主机了。
问题2:为什么EP1_IN_Callback()中的判断是 if (USB_Tx_State == 1),正在发送还继续发?
这个函数里面的代码都可以删了,按自己的需要写。
问题3:EP1_IN_Callback()是在正确传输时调用的吗?还是对SOF中断不太了解。
同问题1,sof的话你百度一下就知道,usb主机会每个多长时间发一个sof帧的。
zjwyczj 发表于 2014-12-24 15:57 | 显示全部楼层
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/*******************************************************************************
* Function Name  : EP1_IN_Callback
* Description    :
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void EP1_IN_Callback (void)
{

}

/*******************************************************************************
* Function Name  : EP3_OUT_Callback
* Description    :
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
/*数据接口的输出端点*/
void EP3_OUT_Callback(void)//EP3 OUT的回调函数,当EP3接收到数据时候中断调用该函数
{
  uint16_t USB_Rx_Cnt;
  uint8_t len;
  
  /* Get the received data buffer and update the counter */
  USB_Rx_Cnt = USB_SIL_Read(EP3_OUT, USB_Rx_Buffer);//获得接收到的数据长度,同时将数据从USB EP3 RX的缓冲区拷贝到用户指定的数组中
  /* USB data will be immediately processed, this allow next USB traffic being
  NAKed till the end of the USART Xfer */
  len=USBHostDataProcess((USBHOSTDATA*)USB_Rx_Buffer);//读写数据处理
  SetEPRxValid(ENDP3);
  //SetEPRxValid(ENDP3);
  /*返回数据给usb主机*/
  USB_SIL_Write(EP1_IN, USB_Rx_Buffer,len);
  SetEPTxValid(ENDP1);
}


/*******************************************************************************
* Function Name  : SOF_Callback / INTR_SOFINTR_Callback
* Description    :
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void SOF_Callback(void)/*SOF是帧首,对于全速设备来说,每1毫秒有1个帧首信号,因此,每1毫秒会调用1次这个帧首中断回调函数*/
{
  static uint32_t FrameCount = 0;
  
  if(bDeviceState == CONFIGURED)
  {
    if (FrameCount++ == VCOMPORT_IN_FRAME_INTERVAL)
    {
      /* Reset the frame counter */
      FrameCount = 0;
      
      /* Check the data to be sent through IN pipe */
      //Handle_USBAsynchXfer();
    }
  }  
}
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
zjwyczj 发表于 2014-12-24 16:00 | 显示全部楼层
你可以参考下我的程序,我把写数据都放在EP3_OUT_Callback()中了,当然我是为了实现一接收到usb主机的数据,就做处理,然后返回处理过的数据。发送数据放哪按照需求来
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

21

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部