63 USB复合设备多设备数据乱码问题及ENDP0_RXADDR起始地址计算方式
Posted Chasing_Chasing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了63 USB复合设备多设备数据乱码问题及ENDP0_RXADDR起始地址计算方式相关的知识,希望对你有一定的参考价值。
1.引言
最近又往usb设备中添加了虚拟串口功能,使用的usb端点从三个增长到了5个。很巧合,例程给的恰好是小于3个端点的,所以在前面的移植过程中并未出现什么错误,所以当时也就迷糊的过去了,未研究ENDP0_RXADDR为何是0x18。
然后今天发现在多个usb设备情况下,数据虚拟串口数据发送出现乱码,所以才引起问题的查找。
现在我使用到的端点个数已经达到5个,出现了usb 的虚拟串口发数据给PC,PC端收到的数据是乱码的,对比例程的代码,自己跟例程代码差别没有,所以迫使寻找问题。幸好看到了 下帖,才解决了自己的疑惑。
帖子链接:
STM32 USB 复合设备 多路虚拟串口乱码问题 - *USB* - 论坛-意法半导体STM32/STM8技术社区
2.ENDP0_RXADDR起始计算依据
首先stm32单片机有512字节大小的USB buffer,然后USB中存在一张Buffer Description Table,就是我们在usb_conf.h头文件中看到的一个宏定义。
/* buffer table base address */
/* buffer table base address */
#define BTABLE_ADDRESS (0x00)
这个Buffer Description Table表,一般就存在单片机的USB 512字节大小的buffer中,且一般是存在USB buffer 的起始位置,所以我们看到上面的BTABLE_ADDRESS 宏定义的是0x00,也就是USB buffer起始的位置。
然后再来谈谈这个Buffer Description Table的内容还有作用。
这个表存在的是,每个端点的缓存区地址addr和缓存长度length,也就是一个端点就会对应一个addr+length,即占用8个字节大小。
而Buffer Description Table,和我们USB的发送和接收是共用这512字节的buffer的,所以当这个表发生变化时,我们能使用的端点的发送和接收缓存区大小将会发生变化。
由上图看,使用的端点越多,表越大,剩下的缓存区域越小。
stm32USB例程,使用的是2个或3个端点,所以它们将ENDP0_RXADDR定义为0x18(等于24字节),当使用2个端点是,Buffer Description Table占用 2*(4+4) = 16Byte;当使用3个端点时Buffer Description Table占用3*(4+4) = 24Byte(也就是0x18)。也就是例程里面给的。
我现在使用了8个端点,所以通过计算ENDP0_RXADDR = 0x40 = 8*8= 64。
/*-------------------------------------------------------------*/
/* EP_NUM */
/* defines how many endpoints are used by the device */
/*-------------------------------------------------------------*/
#define EP_NUM (5) //用到5组
/*-------------------------------------------------------------*/
/* -------------- Buffer Description Table -----------------*/
/*-------------------------------------------------------------*/
/* buffer table base address */
/* buffer table base address */
#define BTABLE_ADDRESS (0x00)
/* EP0 */
/* rx/tx buffer base address */
#define ENDP0_RXADDR (0x40)//这个起始地址= (4+4)*端点个数 = 8*8 = 64 = 0x40
#define ENDP0_TXADDR (0x80)//依次递增64Byte就系,也就是0x40
/* EP1 */
/* tx buffer base address */
#define ENDP1_TXADDR (0xc0)
/* EP2 */
/* tx buffer base address */
#define ENDP2_TXADDR (0xE0) //因为Ep1我实际只是用了8字节发送的,所以就不用64字节大小
#define ENDP2_RXADDR (0x120)
/* EP3 */
/* tx buffer base address */
#define ENDP3_TXADDR (0x160)
/* EP4 */
/* tx buffer base address */
#define ENDP4_TXADDR (0x170) //因为EP3实际没有数据通信,所以就不用64字节大小了
#define ENDP4_RXADDR (0x1B0) //最后一个地址 +64 应该小于0x200,否则接收数据有问题
修改完这个后,接解决了USB多路虚拟串口乱码的问题。
感谢该文档的介绍:
STM32F103 USB Packet Buffer 512:STM32F103 USB包缓冲区512 - 豆丁网
over!
以上是关于63 USB复合设备多设备数据乱码问题及ENDP0_RXADDR起始地址计算方式的主要内容,如果未能解决你的问题,请参考以下文章
63 USB复合设备多设备数据乱码问题及ENDP0_RXADDR起始地址计算方式