打印

STM32F207 USB DEVICE 只能发送64倍数的字节

[复制链接]
4248|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
easylwl|  楼主 | 2013-4-10 15:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我采用了ST的 OTG-FS LIB,里面的VCP例子,修改了描述符,定义为USB自定义设备,并设置了IN ,和OUT端点的最大包字节为64字节,
但是当我向电脑发送数据时,用bushound监测。当我发送64倍数的字节(例如64,128,256...)时可以正常发送。但当我发送不是64倍数时,最后的剩余字节就发送不了?
例如我发送65个字节,就会出现发送64字节后,剩下的1个字节就没有发送,BUSHOUND只看到前面的64个字节。
这是为什么呢???
沙发
easylwl|  楼主 | 2013-4-10 15:29 | 只看该作者
,这就奇怪了.我看了一下STM32的资料说可以一个包的字节是maximum-packet-size packets 或者是a single short packet.为什么只能发送 maximum-packet-size (64字节)的数据包呢?
我的发送函数:
uint16_t VCP_DataTx (uint8_t* Buf, uint32_t Len)
{
uint8_t i;
for (i=0;i<64;i++)      //这里如果不是64,就不能发送成功,必须是64的倍数,
        {
        APP_Rx_Buffer[APP_Rx_ptr_in] = g_ucaHeartbeat;
        APP_Rx_ptr_in++;
         
          /* To avoid buffer overflow */
          if(APP_Rx_ptr_in == APP_RX_DATA_SIZE)
          {
            APP_Rx_ptr_in = 0;
          }  
        }
return USBD_OK;
}


usb_cdc_core.c里面的代码我没修改,使用的是ST公司的USB库2.0版本.
/**
  * @brief  usbd_audio_SOF
  *         Start Of Frame event management
  * @param  pdev: instance
  * @param  epnum: endpoint number
  * @retval status
  */
static uint8_t  usbd_cdc_SOF (void *pdev)
{      
  static uint32_t FrameCount = 0;
  
  if (FrameCount++ == CDC_IN_FRAME_INTERVAL)
  {
  
    FrameCount = 0;

    /* Check the data to be sent through IN pipe */
    Handle_USBAsynchXfer(pdev);
  }
  
  return USBD_OK;
}





/**
  * @brief  Handle_USBAsynchXfer
  *         Send data to USB
  * @param  pdev: instance
  * @retval None
  */
static void Handle_USBAsynchXfer (void *pdev)
{
  uint16_t USB_Tx_ptr;
  uint16_t USB_Tx_length;
  
  if(USB_Tx_State != 1)
  {
    if (APP_Rx_ptr_out == APP_RX_DATA_SIZE)
    {
      APP_Rx_ptr_out = 0;
    }
   
    if(APP_Rx_ptr_out == APP_Rx_ptr_in)
    {
      USB_Tx_State = 0;
      return;
    }
   
    if(APP_Rx_ptr_out > APP_Rx_ptr_in) /* rollback */
    {
      APP_Rx_length = APP_RX_DATA_SIZE - APP_Rx_ptr_out;
   
    }
    else
    {
      APP_Rx_length = APP_Rx_ptr_in - APP_Rx_ptr_out;
     
    }
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
     APP_Rx_length &= ~0x03;
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */
   
    if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE)
    {
      USB_Tx_ptr = APP_Rx_ptr_out;
      USB_Tx_length = CDC_DATA_IN_PACKET_SIZE;
      
      APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE;        
      APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE;
    }
    else
    {
      USB_Tx_ptr = APP_Rx_ptr_out;
      USB_Tx_length = APP_Rx_length;
      
      APP_Rx_ptr_out += APP_Rx_length;
      APP_Rx_length = 0;
    }
    USB_Tx_State = 1;

    DCD_EP_Tx (pdev,
               VL8461_IN_EP,
               (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr],
               USB_Tx_length);       //这里的 USB_Tx_length 只要不是 64,就发送不成功????
  }  
  
}

使用特权

评论回复
板凳
cjhk| | 2013-4-10 18:33 | 只看该作者
这一块不是很了解   帮你顶起来   呵呵   希望有高手能解决这个问题   呵呵  顶一个

使用特权

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

本版积分规则

11

主题

28

帖子

0

粉丝