請教當發(fā)生 USB? ?錯誤USTS c00000012?,時USB的上傳端口就會被掛起,無法再次發(fā)送任何數(shù)據(jù)。因為無法完全杜絕產(chǎn)生這個錯誤,那么在usb的中斷里面是否有相應的中斷,然后在中斷里面去處理?
您好,該問題應該是由于電腦識別到上傳的數(shù)據(jù)不對產(chǎn)生的,麻煩你可以將完整的抓包數(shù)據(jù)發(fā)至我的郵箱(lzs@wch.cn)這邊看一下,其次麻煩你告知一下模擬的是一個什么設備,此外你可以檢查一下枚舉過程中設置的端點包大小是否和數(shù)據(jù)實際上傳過程中的一致。后續(xù)若有問題,也可通過郵箱和我溝通。
是這樣的,比如上位機從端口4發(fā)送一幀命令,然后監(jiān)聽端口2
正常的情況下,下位機應該返回4個字節(jié)的應答幀,但是因為一些其他原因返回了3個字節(jié)的數(shù)據(jù),這個時候就會觸發(fā)這個錯誤。并且usb的端口再也無法發(fā)送任何數(shù)據(jù)到電腦。
用BUS HOUND 模擬的情況也是如此,比如下位機上傳的是3個字節(jié)讀數(shù)據(jù),但是讀取的時候讀4個字節(jié)就會發(fā)生這樣的錯誤。
現(xiàn)在是如果發(fā)生錯誤了,下位機這邊在也無法上傳任何數(shù)據(jù),接收是正常的。該怎么判斷發(fā)送了這錯誤是否有相應的中斷。
你好,出現(xiàn)這種錯誤的原因大概是,MCU上傳的數(shù)據(jù)不符合某種標準,導致上位機報錯,可以檢查MCU部分的代碼是否有錯誤,MCU沒有辦法產(chǎn)生這種錯誤中斷。
如果下位機無法避免這種問題,上位機出現(xiàn)報錯之后,可以查找是否有相關API處理。
可以將相關上位機軟件和MCU的代碼發(fā)送到郵箱zc@wch.cn
void USB_SendData2 (uint8_t bEpNum, uint8_t *p_data, uint32_t num)
{
? ? uint32_t remain = num;
? ? uint32_t index? ?= 0;
? ? while (remain >= 64)? ? ? ? ? ? ? ? ? ? ? ? //??????64??
? ? {
? ? ? ?// while (SendOverFlag != 1);? SendOverFlag = 0;? ?
USB_SendData(bEpNum,(p_data+index),64);
? ? ? ? index? += 64;? ? ? ? ? ? ? ? ? ? ? ? ? ?//??????????
? ? ? ? remain -= 64;
? //delay_us(500);//等待發(fā)送完成
? ? }
? ? //while (SendOverFlag != 1); SendOverFlag = 0;
USB_SendData(bEpNum,(p_data+index),remain);
}
這個是我USB 上傳的函數(shù),usb的最大包64個字節(jié),經(jīng)常出現(xiàn)實際只上傳了1個字節(jié)就不能再上傳了。(電腦USB監(jiān)聽軟件看到)。?
板子上傳超過最大的緩沖區(qū)64字節(jié)循環(huán)發(fā)送直到發(fā)送完數(shù)據(jù)包,有時候發(fā)現(xiàn)原來是要發(fā)送0x1ff個字節(jié)的數(shù)據(jù)包,結(jié)果只發(fā)送了第一個字節(jié)比如只發(fā)送了上圖中的0X53 第一個字節(jié),之后USB 就在也不能上傳任何數(shù)據(jù)了必須從其CPU
就像這樣,通信協(xié)議是上位機發(fā)送21 0D 0A 2A 0D 0A 后下位機上傳數(shù)據(jù)包,不知道什么原因有時候就只能上傳一個字節(jié)
上傳的是0X1FF字節(jié) 實際只上傳了一個字節(jié)
這是發(fā)送問題時仿真時看到的數(shù)據(jù),所以問題應該出在usb的上傳函數(shù)部分
USB的傳輸機制和注意事項可以參考這兩個帖子
https://www.cnblogs.com/wchmcu/p/17913838.html
https://www.cnblogs.com/wchmcu/p/17508110.html