×
单片机 > 单片机程序设计 > 详情

STM32 LibUsbDotNet 开发CDC记录

发布时间:2020-05-18 发布时间:
|

1,一定要注意端点是分方向的,在ST的USB库中使用类似如下方式来表示端点。


第7bit为1,0x80表示IN端点。为0表示OUT端点。

这里千万不要看到IN OUT 端点都是EP1就认为EP1是一个双向端点。按照USB规范,只有EP0是双向端点,其他都只能是单向端点,所以实际上,如下表示是两个不同的端点,这里千万不要混淆了。

#define CDC_IN_EP                                   0x81  /* EP1 for data IN */

#define CDC_OUT_EP                                  0x01  /* EP1 for data OUT */


2,LibUsbDotNet在调用Read Write后出错,或者在USB总线上无数据活动,先检查一下LibUsbDotNet的IN OUT端点配置正确了没。在LibUsbDotNet中使用枚举ReadEndpointID,WriteEndpointID表示端点。千万不要混淆了。


3,ST的CDC库存在一些不完整的地方。


在CDC_Control_HS 或者CDC_Control_FS中,里面的指令的收发全是空的,这里必须要添加上对应的实现代码。否则,当USB主机发起一个GET的请求时,device会返回随机的数据。所以最好把CDC中常用的一些指令的收发给添加完整,这里主要是CDC_SET_LINE_CODING, CDC_GET_LINE_CODING两个指令,如果不处理,看返回的随机值情况,有可能在枚举阶段就会出错。

4,ST的USB库在使用DMA时,存在BUG,此BUG从V1.15版本的库函数开始存在,到最新的1.21.0依然存在。表现为当使用了usb的DMA功能后,USB EP0 IN传输出错。这会导致枚举出错,因为枚举使用EP0传输。原因如下:以1.21.0库函数举例说明:


在USB_EP0StartXfer函数中,官方的函数在IN传输时先开启了EP,后使能的DMA,导致传输出错。代码需要修改如下,这里必须要在配置好DMA后才能使能端点。


if (dma == 1) {

USBx_INEP(ep->num)->DIEPDMA = (uint32_t) ( ep->dma_addr );

} else {

/* Enable the Tx FIFO Empty Interrupt for this EP */

if (ep->xfer_len > 0U) {

USBx_DEVICE->DIEPEMPMSK |= 1U << ( ep->num );

}

}

//注意:这里经过修改,必须要配置好DMA后才能使能EP,否则传输会出错

/* EP enable, IN data in FIFO */

USBx_INEP(ep->num)->DIEPCTL |= ( USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA );




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈msp430f5529入门(2)----时钟配置.例程分析