CH32V203 的USBD外设

1691295597587325.jpg

USB读到了OUT事务 的长度,但是读到的数据都是乱码。


找了半天错误,发现手册里这段地址的有效区域是512,但是占用了1024B地址。


[N%O)2D6AWY$4X[BCXG}C0W.jpg

并且数据空间是这样的:两个随机数,两个0。


这里有一个坑。

这段寄存器是16位的,数据在连续的地址空间中,是2byte有效数据  2byte0。

这样:

 D0 D1 00 00 D2 D3 00 00 D4 D5 00 00 ……


这么关键的问题手册里没写~或者是写在不知道哪个角落里了,找不到。






你们公司要好好写手册呀,手册必须一直有人维护,改错误更新版本。

现在的手册写的太差了。


这里是手册的位置和版本:image.png


你好,手册的意思是0x40006400-0x40006000=0x400即1024,高16位保留,所以整个缓冲区是512字节,可能没有明显的文字描述,导致理解上有偏差,推荐用我们例程中的库,可以比较方便的使用。image.png


是的,这个图里这样写我以为只是缓冲区描述表的高16位保留,实际上,整个缓冲区都是高16位保留的。


我还注意到,这段缓冲区的写入必须按照16位写入。也就是说,不能先写D0再写D1,必须一次写入。

D0 D1 00 00 D2 D3 00 00 D4 D5 00 00 ……


这样的代码是无法工作的,写入后读取缓冲区的值存在异常:

????????static?void?writeInData_O(int?diff_in_buf,?const?byte*?from_ptr,?int?len)?{
????????????byte*?to_ptr?=?(byte*)USBD_BUF_BASE;//也就是0x40006000
????????????to_ptr?+=?(diff_in_buf?*?2);//加上偏移量
????????????int?mov_count?=?0;
????????????while?(true)?{
????????????????*(to_ptr++)?=?*(from_ptr++);//写入一个byte
????????????????mov_count++;
????????????????if?(mov_count?==?len)????break;
????????????????*(to_ptr++)?=?*(from_ptr++);//写入一个byte
????????????????mov_count++;
????????????????if?(mov_count?==?len)????break;
????????????????to_ptr?+=?2;//跳过两个byte
????????????}
????????}

必须每次都写入16位

????????static?void?writeInData(int?diff_in_buf,?const?byte*?from_ptr,?int?len)?{
????????????int?len_u16?=?(len?+?1)?/?2;
????????????uint16*?to_ptr?=?(uint16*)USBD_BUF_BASE;
????????????to_ptr?+=?diff_in_buf?*?2?/?2;
????????????const?uint16*?from_ptr_16?=?(const?uint16*)from_ptr;
????????????for?(int?i?=?0;i?<?len_u16;i++)?{
????????????????*(to_ptr++)?=?*(from_ptr_16++);
????????????????to_ptr++;
????????????}
????????}



是的,这个图里这样写我以为只是缓冲区描述表的高16位保留,实际上,整个缓冲区都是高16位保留的。


我还注意到,这段缓冲区的写入必须按照16位写入。也就是说,不能先写D0再写D1,必须一次写入。

D0 D1 00 00 D2 D3 00 00 D4 D5 00 00 ……


这样的代码是无法工作的,写入后读取缓冲区的值存在异常:

image.png

必须每次都写入16位

image.png



只有登录才能回复,可以选择微信账号登录