USB讀到了OUT事務(wù) 的長(zhǎng)度,但是讀到的數(shù)據(jù)都是亂碼。
找了半天錯(cuò)誤,發(fā)現(xiàn)手冊(cè)里這段地址的有效區(qū)域是512,但是占用了1024B地址。
并且數(shù)據(jù)空間是這樣的:兩個(gè)隨機(jī)數(shù),兩個(gè)0。
USB讀到了OUT事務(wù) 的長(zhǎng)度,但是讀到的數(shù)據(jù)都是亂碼。
找了半天錯(cuò)誤,發(fā)現(xiàn)手冊(cè)里這段地址的有效區(qū)域是512,但是占用了1024B地址。
并且數(shù)據(jù)空間是這樣的:兩個(gè)隨機(jī)數(shù),兩個(gè)0。
這里有一個(gè)坑。
這段寄存器是16位的,數(shù)據(jù)在連續(xù)的地址空間中,是2byte有效數(shù)據(jù)? 2byte0。
這樣:
?D0 D1 00 00 D2 D3 00 00 D4 D5 00 00 ……
這么關(guān)鍵的問題手冊(cè)里沒寫~或者是寫在不知道哪個(gè)角落里了,找不到。
你們公司要好好寫手冊(cè)呀,手冊(cè)必須一直有人維護(hù),改錯(cuò)誤更新版本。
現(xiàn)在的手冊(cè)寫的太差了。
這里是手冊(cè)的位置和版本:
你好,手冊(cè)的意思是0x40006400-0x40006000=0x400即1024,高16位保留,所以整個(gè)緩沖區(qū)是512字節(jié),可能沒有明顯的文字描述,導(dǎo)致理解上有偏差,推薦用我們例程中的庫(kù),可以比較方便的使用。
是的,這個(gè)圖里這樣寫我以為只是緩沖區(qū)描述表的高16位保留,實(shí)際上,整個(gè)緩沖區(qū)都是高16位保留的。
我還注意到,這段緩沖區(qū)的寫入必須按照16位寫入。也就是說(shuō),不能先寫D0再寫D1,必須一次寫入。
D0 D1 00 00 D2 D3 00 00 D4 D5 00 00 ……
這樣的代碼是無(wú)法工作的,寫入后讀取緩沖區(qū)的值存在異常:
????????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++);//寫入一個(gè)byte ????????????????mov_count++; ????????????????if?(mov_count?==?len)????break; ????????????????*(to_ptr++)?=?*(from_ptr++);//寫入一個(gè)byte ????????????????mov_count++; ????????????????if?(mov_count?==?len)????break; ????????????????to_ptr?+=?2;//跳過兩個(gè)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++; ????????????} ????????}
是的,這個(gè)圖里這樣寫我以為只是緩沖區(qū)描述表的高16位保留,實(shí)際上,整個(gè)緩沖區(qū)都是高16位保留的。
我還注意到,這段緩沖區(qū)的寫入必須按照16位寫入。也就是說(shuō),不能先寫D0再寫D1,必須一次寫入。
D0 D1 00 00 D2 D3 00 00 D4 D5 00 00 ……
這樣的代碼是無(wú)法工作的,寫入后讀取緩沖區(qū)的值存在異常:
必須每次都寫入16位