HK32F103x/C/D/E是深圳市航順芯片技術(shù)研發(fā)有限公司推出的中大容量的32位MCU芯片,內(nèi)部集成豐富且強大的外設,如SPI/IIC/UART/USB/FSMC/SDIO等。有客戶在快速替換使用過程中,遇到過使用HAL庫的USB枚舉失敗的情況:VID/PID值等設備描述符內(nèi)容不正確。使用bus hound捕獲USB包,觀察設備描述符內(nèi)容,如下紅色箭頭所指IN包數(shù)據(jù)部分,大多數(shù)時候是不對的,即不是預期值,偶發(fā)是對的。
通過分析客戶代碼,且使用邏輯分析儀+DSview跟蹤USB通信數(shù)據(jù),發(fā)現(xiàn)是在枚舉過程中,第三次獲取設備描述符的時候出錯,如下:
進一步分析發(fā)現(xiàn)并確認(根本原因):
USB設備在收到STALL之后的下一條SETUP的情況下,硬件會設置Tx狀態(tài)為Valid,這導致接下來IN包來了之后,USB直接就把還未準備好的數(shù)據(jù)發(fā)送給主機,即發(fā)送的數(shù)據(jù)不是預設值/亂碼,例如一部分為本次要發(fā)送的數(shù)據(jù),另外一部分為上一次的數(shù)據(jù)。
解決方案:
屏蔽掉軟件設置STALL的代碼,例如在HAL庫的HID類,屏蔽下圖處。