• 資料介紹
    • 問(wèn)題提出
    • 解決思路及原理
    • 驗(yàn)證測(cè)試
    • 小結(jié)
  • 資料預(yù)覽
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

LAT1242 如何讓CDC類USB設(shè)備批量接收64字節(jié)以上數(shù)據(jù)

03/25 14:15
745
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

LAT1242 如何讓CDC類USB設(shè)備批量接收64字節(jié)以上數(shù)據(jù)

741.96 KB

問(wèn)題提出

STM32 開(kāi)發(fā)者在實(shí)現(xiàn) CDC 類虛擬串口與 PC 主機(jī)通信過(guò)程中,有時(shí)會(huì)遇到點(diǎn)麻煩而不得其解。那就是當(dāng)主機(jī)端單次發(fā)送的數(shù)據(jù)不超過(guò) 64 字節(jié)時(shí),接收正常。一旦發(fā)送數(shù)據(jù)量大于 64 字節(jié)時(shí)就接收失敗,總是出現(xiàn)丟包現(xiàn)象,似乎只能接收 64 字節(jié)以內(nèi)的數(shù)據(jù)。網(wǎng)上有人干脆建議主機(jī)每次發(fā)送不要超過(guò) 64字節(jié),當(dāng)然,也有人提及要作分包處理但沒(méi)具體實(shí)現(xiàn)代碼可以參考。

解決思路及原理

作為 CDC 類的 USB 設(shè)備,到底能不能正確接收來(lái)自主機(jī) 64 字節(jié)以上的批量數(shù)據(jù)呢?其實(shí)是可以的,只是當(dāng)我們一次傳輸?shù)臄?shù)據(jù)大于當(dāng)前端點(diǎn)所支持的最大包長(zhǎng)時(shí)【這里端點(diǎn)使用 BULK 傳輸,最大包長(zhǎng)默認(rèn)設(shè)置為 64 字節(jié)】,USB 模塊會(huì)做分包傳輸,將一批數(shù)據(jù)傳輸分成多個(gè)處理[或稱事務(wù)],即多個(gè) transaction 來(lái)完成,每個(gè) Transaction 里的數(shù)據(jù)包傳輸?shù)淖?a class="article-link" target="_blank" href="/tag/%E5%A4%A7%E6%95%B0%E6%8D%AE/">大數(shù)據(jù)量為 64 字節(jié)。

驗(yàn)證測(cè)試

下面我利用 HAL 庫(kù),基于 STM32F429 芯片演示實(shí)現(xiàn)過(guò)程,重點(diǎn)在接收處理代碼。我使用 STM32F429Discovery 開(kāi)發(fā)板,使用 HS USB 模塊并令其工作在 FS MODE,這樣我們就可以方便地使用片內(nèi) USB FSPHY。

我使用 STM32CubeMx 工具進(jìn)行配置,生成基于 STM32 HAL 庫(kù)的工程。使用 ST 提供的 STM32CubeIDE進(jìn)行編譯調(diào)試。有關(guān)配置就不截圖了。

另外,我還配置了 1 個(gè)按鍵并開(kāi)啟相應(yīng)外部中斷。每發(fā)生按鍵事件時(shí),F(xiàn)429 USB 設(shè)備向 PC 主機(jī)發(fā)送一段打招呼的字符串,并通過(guò)串口助手顯示出來(lái)。

小結(jié)

其實(shí),我上面分享的接收處理代碼也有很好的通用性,并不局限于 Bulk 傳輸端點(diǎn)。我們知道,不同傳輸類型的端點(diǎn)的最大包長(zhǎng)往往并不一樣,如果使用上面的參考代碼,我們只需調(diào)整那個(gè)最大包長(zhǎng)參數(shù)【Max_Pack_Size】,并根據(jù)應(yīng)用適當(dāng)調(diào)整 Rx_buffer[]數(shù)組的大小就可以使用了。數(shù)據(jù)個(gè)數(shù)、傳輸包個(gè)數(shù)這些變量定義及使用都可以保留參考。

資料預(yù)覽

相關(guān)推薦