打印
[STM32F4]

USB虚拟串口

[复制链接]
1529|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
besthuman|  楼主 | 2016-6-7 12:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 besthuman 于 2016-6-7 12:25 编辑

我在stm32f439上做USB虚拟串口的开发。之前在stm32f407开发时用的全速内置PHY,没有问题。因为在f439上需要做U盘和USB虚拟串口两个功能,所以VCP采用的是高速模式下的全速核,结果发现以下问题,求高手或有相关开发经验的帮忙分析一下。我用的St的Cube库 V11.0:
    1.刚开始枚举时发现驱动有一个黄色感叹号,后来发现是VCP枚举时需要手动malloc申请内存,是我堆空间设的小所致。解决后,发现我多次插拔USB,差不多十次左右,黄色感叹号又出现了。再次插拔又恢复正常
    2.用VCP传输文件时,发现txt和hex文件都能成功,唯独传输bin文件(700多K)时,大概只能传输100多k,串口设备就报“写文件被意外中断”的错误
    3.VCP写数据时调用了官方API后,由cube库去发送数据。发现API返回成功,但数据却没发出去。调用的API为          USBD_CDC_SetTxBuffer(&USBD_Device, pSrc, len);
if(USBD_CDC_TransmitPacket(&USBD_Device) == USBD_OK)
{}
我的硬件配置如下,请大神帮忙啊
void HAL_PCD_MspInit(PCD_HandleTypeDef *hpcd)
{
        GPIO_InitTypeDef  GPIO_InitStruct;
        if(hpcd->Instance == USB_OTG_HS)
         {
           /* Configure USB FS GPIOs */
           __HAL_RCC_GPIOB_CLK_ENABLE();
           /* Configure DM DP Pins */
           GPIO_InitStruct.Pin = (//GPIO_PIN_13 |
                                  GPIO_PIN_14 | GPIO_PIN_15);
           GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
           GPIO_InitStruct.Pull = GPIO_NOPULL;
           GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
           GPIO_InitStruct.Alternate = GPIO_AF12_OTG_HS_FS;//GPIO_AF10_OTG_HS;//
           HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
           
        
           __HAL_RCC_GPIOG_CLK_ENABLE();
           GPIO_InitStruct.Pin = GPIO_PIN_3;
           GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
           GPIO_InitStruct.Pull = GPIO_PULLUP;
           GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
           HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
           HAL_GPIO_WritePin(GPIOG, GPIO_PIN_3, GPIO_PIN_RESET);
        
           /* Enable USB FS Clocks */
           __HAL_RCC_USB_OTG_HS_CLK_ENABLE();
           
           /* Set USBFS Interrupt priority */
           HAL_NVIC_SetPriority(OTG_HS_IRQn, 6, 0);
           
           /* Enable USBFS Interrupt */
           HAL_NVIC_EnableIRQ(OTG_HS_IRQn);
           
           HAL_GPIO_WritePin(GPIOG, GPIO_PIN_3, GPIO_PIN_SET);
         }
}
USBD_StatusTypeDef  USBD_LL_Init (USBD_HandleTypeDef *pdev)
{
  /* Change Systick prioity */
  NVIC_SetPriority (SysTick_IRQn, 0);  
  #ifdef USE_USB_HS  
  /*Set LL Driver parameters */
  hpcd.Instance = USB_OTG_HS;
  hpcd.Init.dev_endpoints = 4;
  hpcd.Init.use_dedicated_ep1 = 0;
  hpcd.Init.ep0_mps = 0x40;  
  hpcd.Init.dma_enable = 0;
  hpcd.Init.low_power_enable = 0;
  hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
  hpcd.Init.Sof_enable = 0;
  hpcd.Init.speed = PCD_SPEED_FULL;
  hpcd.Init.vbus_sensing_enable = 1;//DISABLE;//1;
  /* Link The driver to the stack */
  hpcd.pData = pdev;
  pdev->pData = &hpcd;
  /*Initialize LL Driver */
  HAL_PCD_Init(&hpcd);
  
  HAL_PCDEx_SetRxFiFo(&hpcd, 0x80);
  HAL_PCDEx_SetTxFiFo(&hpcd, 0, 0x40);
  HAL_PCDEx_SetTxFiFo(&hpcd, 1, 0x80);
//  HAL_PCDEx_SetRxFiFo(&hpcd, 0x200);
//  HAL_PCDEx_SetTxFiFo(&hpcd, 0, 0x80);
//  HAL_PCDEx_SetTxFiFo(&hpcd, 1, 0x174);

#endif
return USBD_OK;
}
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

12

帖子

1

粉丝