USB读到了OUT事务 的长度,但是读到的数据都是乱码。
找了半天错误,发现手册里这段地址的有效区域是512,但是占用了1024B地址。
并且数据空间是这样的:两个随机数,两个0。
USB读到了OUT事务 的长度,但是读到的数据都是乱码。
找了半天错误,发现手册里这段地址的有效区域是512,但是占用了1024B地址。
并且数据空间是这样的:两个随机数,两个0。
这里有一个坑。
这段寄存器是16位的,数据在连续的地址空间中,是2byte有效数据 2byte0。
这样:
D0 D1 00 00 D2 D3 00 00 D4 D5 00 00 ……
这么关键的问题手册里没写~或者是写在不知道哪个角落里了,找不到。
你们公司要好好写手册呀,手册必须一直有人维护,改错误更新版本。
现在的手册写的太差了。
这里是手册的位置和版本:
你好,手册的意思是0x40006400-0x40006000=0x400即1024,高16位保留,所以整个缓冲区是512字节,可能没有明显的文字描述,导致理解上有偏差,推荐用我们例程中的库,可以比较方便的使用。
是的,这个图里这样写我以为只是缓冲区描述表的高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 ……
这样的代码是无法工作的,写入后读取缓冲区的值存在异常:
必须每次都写入16位