打印

STM32 USB虚拟串口问题!

[复制链接]
2610|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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中断不太了解。
求大神,感激不尽。
void EP1_IN_Callback (void)
{
  uint16_t USB_Tx_ptr;
  uint16_t USB_Tx_length;
  
  if (USB_Tx_State == 1)
  {
    if (USART_Rx_length == 0)
    {
      USB_Tx_State = 0;
    }
    else
    {
      if (USART_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE){
        USB_Tx_ptr = USART_Rx_ptr_out;
        USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;
        
        USART_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;
        USART_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;   
      }
      else
      {
        USB_Tx_ptr = USART_Rx_ptr_out;
        USB_Tx_length = USART_Rx_length;
        
        USART_Rx_ptr_out += USART_Rx_length;
        USART_Rx_length = 0;
      }
      UserToPMABufferCopy(&USART_Rx_Buffer[USB_Tx_ptr], ENDP1_TXADDR, USB_Tx_length);
      SetEPTxCount(ENDP1, USB_Tx_length);
      SetEPTxValid(ENDP1);
    }
  }
}
void SOF_Callback(void)
{
  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();
    }
  }  
}
/*******************************************************************************
* Function Name  : Handle_USBAsynchXfer.
* Description    : send data to USB.
* Input          : None.
* Return         : none.
*******************************************************************************/
void Handle_USBAsynchXfer (void)
{
  
  uint16_t USB_Tx_ptr;
  uint16_t USB_Tx_length;
  
  if(USB_Tx_State != 1)
  {
    if (USART_Rx_ptr_out == USART_RX_DATA_SIZE)
    {
      USART_Rx_ptr_out = 0;
    }
   
    if(USART_Rx_ptr_out == USART_Rx_ptr_in)
    {
      USB_Tx_State = 0;
      return;
    }
   
    if(USART_Rx_ptr_out > USART_Rx_ptr_in) /* rollback */
    {
      USART_Rx_length = USART_RX_DATA_SIZE - USART_Rx_ptr_out;
    }
    else
    {
      USART_Rx_length = USART_Rx_ptr_in - USART_Rx_ptr_out;
    }
   
    if (USART_Rx_length > VIRTUAL_COM_PORT_DATA_SIZE)
    {
      USB_Tx_ptr = USART_Rx_ptr_out;
      USB_Tx_length = VIRTUAL_COM_PORT_DATA_SIZE;
      
      USART_Rx_ptr_out += VIRTUAL_COM_PORT_DATA_SIZE;       
      USART_Rx_length -= VIRTUAL_COM_PORT_DATA_SIZE;       
    }
    else
    {
      USB_Tx_ptr = USART_Rx_ptr_out;
      USB_Tx_length = USART_Rx_length;
      
      USART_Rx_ptr_out += USART_Rx_length;
      USART_Rx_length = 0;
    }
    USB_Tx_State = 1;
    UserToPMABufferCopy(&USART_Rx_Buffer[USB_Tx_ptr], ENDP1_TXADDR, USB_Tx_length);
    SetEPTxCount(ENDP1, USB_Tx_length);
    SetEPTxValid(ENDP1);
  }  
  
}

相关帖子

沙发
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****/

使用特权

评论回复
5
zjwyczj| | 2014-12-24 16:00 | 只看该作者
你可以参考下我的程序,我把写数据都放在EP3_OUT_Callback()中了,当然我是为了实现一接收到usb主机的数据,就做处理,然后返回处理过的数据。发送数据放哪按照需求来

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

21

帖子

0

粉丝