0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

USB發(fā)送數(shù)據(jù)時(shí)出現(xiàn)遲滯現(xiàn)象

jf_pJlTbmA9 ? 來(lái)源:STM32單片機(jī) ? 作者:STM32單片機(jī) ? 2023-09-27 15:19 ? 次閱讀

問(wèn)題描述

客戶反饋,使用STM32F446的高速USB外設(shè),即USB_OTG_HS外設(shè),且使用內(nèi)置全速PHY。客戶的產(chǎn)品USB用做device,自定義HID類,當(dāng)連接帶UOS操作系統(tǒng)的HOST時(shí),會(huì)發(fā)現(xiàn)當(dāng)前數(shù)據(jù)并沒(méi)有成功發(fā)送,但是會(huì)發(fā)送上一次的數(shù)據(jù),即發(fā)送數(shù)據(jù)出現(xiàn)”遲滯”現(xiàn)象。但在Windows下卻沒(méi)有出現(xiàn)此類問(wèn)題。另外,客戶同時(shí)還使用了STM32F446上的USB_OTG_FS外設(shè),且此外設(shè)做同樣的事一切正常,目前此問(wèn)題只出現(xiàn)在USB_OTG_HS外設(shè)上。

問(wèn)題查找

剛開(kāi)始猜測(cè)是長(zhǎng)度問(wèn)題,即發(fā)送最大包長(zhǎng)需要再發(fā)送一次空包。但客戶反饋他們的發(fā)送長(zhǎng)度為62個(gè)字節(jié)。于是去客戶現(xiàn)場(chǎng)使用USB協(xié)議分析儀采數(shù)分析,發(fā)現(xiàn)一切通信正常。

通過(guò)查看客戶演示重現(xiàn)問(wèn)題的過(guò)程,發(fā)現(xiàn)在正常時(shí)是一切OK的,只在進(jìn)行USB拔插時(shí)才發(fā)送問(wèn)題。應(yīng)用程序不斷發(fā)送數(shù)據(jù)的過(guò)程中拔掉USB線,然后再次插上,在此過(guò)程中應(yīng)用程序一直嘗試發(fā)送數(shù)據(jù)。當(dāng)USB線重新連接上且重新枚舉成功后,“遲滯”現(xiàn)象則重現(xiàn)了,即每次應(yīng)用程序調(diào)用發(fā)送接口實(shí)現(xiàn)發(fā)送的是上一次嘗試發(fā)送的內(nèi)容。

調(diào)試客戶的程序,發(fā)現(xiàn)當(dāng)USB線拔掉后,應(yīng)用程序還會(huì)往USB IP對(duì)應(yīng)的發(fā)送FIFO內(nèi)寫入數(shù)據(jù),這其實(shí)是不對(duì)的。按理USB線拔掉后USB的狀態(tài)應(yīng)該恢復(fù)到默認(rèn)狀態(tài),

即pdev->dev_state=USBD_STATE_DEFAULT. 但實(shí)際上,通過(guò)調(diào)試發(fā)現(xiàn)此狀態(tài)在USB線拔掉后是suspend狀態(tài)。

那么為什么會(huì)是這樣的呢?

于是立即想到Vbus sensing功能。馬上與客戶硬件工程師核對(duì),原來(lái)客戶產(chǎn)品的USB_OTG_HS的Vbus_sensing腳是懸空的,并沒(méi)有連接Vbus,但是客戶的USB_OTG_FS外設(shè)卻又是連接了。于是客戶的產(chǎn)品兩個(gè)USB口,同樣的工作,一個(gè)USB口 正常,另一個(gè)USB口卻會(huì)出現(xiàn)問(wèn)題。

問(wèn)題分析

差異找到了,接下來(lái)就是分析由此如何造成問(wèn)題的。

由于USB_OTG_HS并沒(méi)有真正實(shí)現(xiàn)Vbus sensing功能(因?yàn)闆](méi)有硬件連接),于是當(dāng)USB線斷開(kāi)時(shí),應(yīng)用程序并不能準(zhǔn)確地檢測(cè)到斷開(kāi)事件(Disconnected),只會(huì)出現(xiàn)suspend,應(yīng)用程序是無(wú)法直接的區(qū)分真正的suspend和USB線斷開(kāi)連接的。當(dāng)應(yīng)用程序有數(shù)據(jù)需要通過(guò)USB口發(fā)送時(shí),如果當(dāng)前是suspend狀態(tài),那么它會(huì)首先喚醒USB總線然后再發(fā)送數(shù)據(jù):

wKgZomUD9KyANPBjAACsn3HAJuw283.jpg Figure1

而這樣發(fā)送遠(yuǎn)程喚醒信號(hào)時(shí),device本身會(huì)產(chǎn)生一個(gè)resume中斷,于是在resume中斷回調(diào)函數(shù)內(nèi):

wKgaomUD9K6ADFqNAACEkPrHpQ8150.jpg Figure 2

如上所示,程序會(huì)將dev_state錯(cuò)誤地恢復(fù)到上一次狀態(tài),即正常狀態(tài)USBD_STATE_CONFIGURED, 如此一來(lái),程序就錯(cuò)誤地往USB IP的內(nèi)的發(fā)送FIFO寫入數(shù)據(jù)了,即使此時(shí)由于USB線已經(jīng)斷開(kāi)而導(dǎo)致無(wú)法真正發(fā)送成功,但USB IP的內(nèi)置發(fā)送FIFO此時(shí)是有了數(shù)據(jù)的。

通過(guò)調(diào)試,查看OTG_DTXFSTS1寄存器相應(yīng)端點(diǎn)1對(duì)應(yīng)的發(fā)送FIFO的剩余空間可知,這個(gè)時(shí)候的發(fā)送FIFO的確實(shí)有數(shù)據(jù)的。接下來(lái)是USB線插上重新枚舉,那么為什么USB重新枚舉后還會(huì)再現(xiàn)問(wèn)題呢?通過(guò)設(shè)置斷點(diǎn)發(fā)現(xiàn),在USB成功重新枚舉過(guò)后,通過(guò)OTG_DTXFSTS1寄存器指示,發(fā)送FIFO內(nèi)容并沒(méi)有清空,于是在接下來(lái)發(fā)送數(shù)據(jù)時(shí),永遠(yuǎn)都是實(shí)際上發(fā)送的是上一次寫入到FIFO中的數(shù)據(jù)。

問(wèn)題解決

▼于是解決方法就很容易找到了▼

在USB重新枚舉過(guò)后在合適的地方將端點(diǎn)1對(duì)應(yīng)的發(fā)送FIFO清空一下即可。

wKgZomUD9K-AS0fOAAAX9lrdlyk157.png Figure 3

問(wèn)題總結(jié)

在客戶的這個(gè)案子中,由于USB_OTG_FS連接了VBUS SENSING腳,當(dāng)USB線拔掉后,會(huì)產(chǎn)生正確的disconnect中斷,USB device的狀態(tài)也會(huì)正確地切換到default狀態(tài),從而過(guò)濾掉應(yīng)用程序想要發(fā)送的數(shù)據(jù),因此并不會(huì)出現(xiàn)類似問(wèn)題,因此,在客戶的產(chǎn)品設(shè)計(jì)中,建議硬件千萬(wàn)不要忘了連接vbus引腳,即使在想省IO引腳的情況下,這樣容易造成對(duì)軟件的開(kāi)發(fā)諸多不便.

在USB的狀態(tài)處于非configured狀態(tài)時(shí),最好不要往發(fā)送FIFO寫入數(shù)據(jù),應(yīng)用程序應(yīng)該想辦法將這些數(shù)據(jù)過(guò)濾掉。

來(lái)源:STM32單片機(jī)

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6037

    文章

    44561

    瀏覽量

    635652
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8611

    瀏覽量

    151247
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    7947

    瀏覽量

    264797
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10901

    瀏覽量

    356224
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ESP32-S3 USB CDC虛擬串口發(fā)送數(shù)據(jù)失敗的原因?

    最近在使用ESP32-S3的USB CDC虛擬串口時(shí),發(fā)現(xiàn)USB在熱插拔之后發(fā)送數(shù)據(jù)出現(xiàn)了問(wèn)題,USB
    發(fā)表于 06-06 06:50

    STM32 USB數(shù)據(jù)接收與數(shù)據(jù)發(fā)送

    PMA中讀取出來(lái),放到用戶自己緩沖區(qū)中。接著設(shè)置端點(diǎn)接收狀態(tài)有效,因?yàn)楫?dāng)接收數(shù)據(jù)后,端點(diǎn)就會(huì)被關(guān)閉。最后置位接收帶數(shù)據(jù)標(biāo)志。 發(fā)送比接收簡(jiǎn)單多了看看下面的代碼就知道了。/*** @brief通過(guò)
    發(fā)表于 11-13 14:08

    stm32 L476 SPI讀取nandflash數(shù)據(jù)通過(guò)USB CDC發(fā)送進(jìn)到USB發(fā)送忙狀態(tài)

    發(fā)送到上位機(jī)的時(shí)候總是發(fā)著發(fā)著就進(jìn)到USB發(fā)送忙的狀態(tài),追蹤了一下,在不使用SPI讀取nandflash數(shù)據(jù),直接循環(huán)發(fā)送數(shù)組中固定
    發(fā)表于 11-12 08:44

    GPRS發(fā)送數(shù)據(jù)重新嚴(yán)重丟失現(xiàn)象

    弱弱的問(wèn)一下,我用GPRS發(fā)送數(shù)據(jù),大概300字節(jié)左右,頻率1Hz,但是就收的數(shù)據(jù)有嚴(yán)重的丟失現(xiàn)象,我想用把沒(méi)有發(fā)出去的數(shù)據(jù)先存起來(lái),等到能
    發(fā)表于 03-08 06:35

    GPRS數(shù)據(jù)發(fā)送出現(xiàn)丟包現(xiàn)象

    大家好,我STM32通過(guò)SIM900A的GPRS給服務(wù)器發(fā)數(shù)據(jù),為什么會(huì)出現(xiàn)如下丟包現(xiàn)象,是不是GPRS發(fā)送會(huì)有一個(gè)緩存,每次發(fā)送完我要清一
    發(fā)表于 04-17 06:36

    SIM900A的GPRS數(shù)據(jù)發(fā)送出現(xiàn)沒(méi)有send ok現(xiàn)象

    各位,目前在開(kāi)發(fā)STM32+SIM900A,因?yàn)橛玫氖荱DP協(xié)議,發(fā)現(xiàn)一個(gè)問(wèn)題:發(fā)送一組數(shù)據(jù)的時(shí)候,模塊一般會(huì)回“send ok”,但是會(huì)出現(xiàn)沒(méi)有send ok現(xiàn)象,一旦沒(méi)有這個(gè)
    發(fā)表于 06-06 04:36

    can總線通信出現(xiàn)奇怪現(xiàn)象

    目前在測(cè)試 nxp芯片can總線通信功能時(shí)出現(xiàn)一奇怪現(xiàn)象,在波特率為20k時(shí),節(jié)點(diǎn)a以15ms時(shí)間間隔連續(xù)發(fā)送64幀數(shù)據(jù)過(guò)程中節(jié)點(diǎn)b發(fā)送一幀
    發(fā)表于 08-17 21:11

    請(qǐng)問(wèn)為什么PDMA發(fā)送數(shù)據(jù)被替換的現(xiàn)象會(huì)發(fā)生?

    為什么PDMA發(fā)送數(shù)據(jù)被替換的現(xiàn)象會(huì)發(fā)生?
    發(fā)表于 12-21 06:46

    TMS320C6748:USB CPPI DMA發(fā)送多組數(shù)據(jù)緩存長(zhǎng)度為4M的數(shù)據(jù),發(fā)送第2組數(shù)據(jù)時(shí)會(huì)出現(xiàn)死機(jī)的現(xiàn)象?。。?!

    實(shí)現(xiàn)第一條數(shù)據(jù)長(zhǎng)度為4M數(shù)據(jù)緩存時(shí),可以直接進(jìn)行發(fā)送,當(dāng)?shù)诙卧?b class='flag-5'>發(fā)送4M數(shù)據(jù)時(shí)就會(huì)出現(xiàn)死機(jī)的
    發(fā)表于 08-06 16:46

    TMS320C6748:硬件USB 開(kāi)啟CPPI DMA,多次發(fā)送長(zhǎng)度為4M的數(shù)據(jù)緩存,出現(xiàn)死機(jī)的現(xiàn)象?。。。。?!

    實(shí)現(xiàn)第一條數(shù)據(jù)長(zhǎng)度為4M數(shù)據(jù)緩存時(shí),可以直接進(jìn)行發(fā)送,當(dāng)?shù)诙卧?b class='flag-5'>發(fā)送4M數(shù)據(jù)時(shí)就會(huì)出現(xiàn)死機(jī)的
    發(fā)表于 08-09 14:24

    CH582發(fā)送數(shù)據(jù)量大時(shí),出現(xiàn)丟包現(xiàn)象的原因是什么?

    藍(lán)牙每次只能發(fā)20字節(jié)左右的數(shù)據(jù),連續(xù)發(fā)送幾百字節(jié),會(huì)出現(xiàn)丟包現(xiàn)象。加大連接間隔等參數(shù),仍存在丟包;造成的原因有哪些?
    發(fā)表于 08-02 07:04

    為什么用DMA發(fā)送串口數(shù)據(jù)時(shí)會(huì)出現(xiàn)數(shù)據(jù)覆蓋的現(xiàn)象呢?

    大神好。我在用DMA發(fā)送串口數(shù)據(jù)時(shí)會(huì)出現(xiàn)數(shù)據(jù)覆蓋的現(xiàn)象我用這種方式打開(kāi)并配置串口DAM:g_uart2obc = rt_device_fin
    發(fā)表于 01-10 18:18

    怎么避免無(wú)刷電機(jī)在工作的時(shí)候出現(xiàn)遲滯換向?

    怎么避免無(wú)刷電機(jī)在工作的時(shí)候出現(xiàn)遲滯換向
    發(fā)表于 10-10 06:25

    電站的出力特性和響應(yīng)遲滯“拖尾現(xiàn)象”產(chǎn)生的原因

    風(fēng)光儲(chǔ)聯(lián)合電站集合了風(fēng)電、光伏和儲(chǔ)能單元等不同種類電源,其有功協(xié)調(diào)控制是電站運(yùn)行的關(guān)鍵技術(shù)。實(shí)際運(yùn)行中出現(xiàn)了有功控制的響應(yīng)遲滯拖尾現(xiàn)象,即電站有功指令下達(dá)后,各類型電源響應(yīng)時(shí)間參差不齊,整體呈現(xiàn)拖尾
    發(fā)表于 01-02 14:43 ?11次下載
    電站的出力特性和響應(yīng)<b class='flag-5'>遲滯</b>“拖尾<b class='flag-5'>現(xiàn)象</b>”產(chǎn)生的原因

    stm32 usb 主機(jī)發(fā)送 pid in的原理和實(shí)現(xiàn)方法

    中,我們將深入探討STM32 USB主機(jī)發(fā)送PID IN的原理和實(shí)現(xiàn)方法。 首先,讓我們來(lái)了解一下USB協(xié)議中的PID(Packet Identifier)。PID是USB
    的頭像 發(fā)表于 12-20 15:56 ?1368次閱讀