SPI通信:DMA配置與片選切換排障實(shí)踐)
不少人拿到TC3xxAURIX 2G平臺(tái)做多從機(jī)SPI通信時(shí)都會(huì)遇到同一個(gè)怪圈單從機(jī)怎么調(diào)怎么順一旦把鏈路從一臺(tái)從機(jī)切到另一臺(tái)不是首字節(jié)飄了就是DMA搬運(yùn)回來的數(shù)據(jù)中間錯(cuò)位嚴(yán)重時(shí)整個(gè)QSPI模塊直接掛死。更頭疼的是這種問題在AUTOSAR框架下會(huì)被MCAL封裝層層層遮擋你很難判斷到底是SPI外設(shè)配置不對(duì)、DMA通道配錯(cuò)了還是片選切換時(shí)序壓根沒給夠。這篇文章我把這幾年在TC3xx上調(diào)試SPI多從機(jī)通信踩過的坑、總結(jié)出來的配置思路和排障方法完整梳理一遍重點(diǎn)圍繞AUTOSAR MCAL下的DMA配置與片選切換展開適合正在做TC3xx平臺(tái)基礎(chǔ)軟件、被多從機(jī)SPI抖動(dòng)問題折磨的工程師參考。1. 先認(rèn)清問題根源TC3xx多從機(jī)SPI的瓶頸從來不在SPI本身1.1 單從機(jī)“健康”多從機(jī)“翻車”的真相很多團(tuán)隊(duì)在ETAS或者EB tresos里完成MCAL配置后先拿單從機(jī)回環(huán)測試波形干凈、數(shù)據(jù)正確于是信心滿滿地把代碼合入項(xiàng)目。結(jié)果聯(lián)調(diào)時(shí)一上多從機(jī)立刻暴露問題。這不是SPI外設(shè)不穩(wěn)定而是多從機(jī)場景把“片選切換時(shí)序”“DMA連續(xù)請(qǐng)求”“FIFO排空時(shí)機(jī)”三個(gè)問題同時(shí)推到了臺(tái)面上。TC3xx的SPI模塊叫QSPI本身有隊(duì)列機(jī)制可以預(yù)置多個(gè)傳輸任務(wù)。但從應(yīng)用層的角度多從機(jī)通信意味著你要在一個(gè)總線上頻繁切換片選。硬件自動(dòng)片選SLSO雖然省事但它在連續(xù)兩個(gè)傳輸之間怎么釋放、釋放多久是由QSPI的狀態(tài)機(jī)決定的不一定滿足所有從機(jī)的手冊(cè)時(shí)序。這時(shí)候軟件片選GPIO控制反而成了最穩(wěn)妥的方案但軟件片選又會(huì)引入新的問題——片選拉低后多久開始打SCLK最后一個(gè)位傳輸結(jié)束后多久拉高片選這兩個(gè)時(shí)間窗口如果不顯式控制碰上一個(gè)嚴(yán)格從機(jī)就是偶發(fā)性通信故障。1.2 為什么AUTOSAR封裝讓這個(gè)問題更難查AUTOSAR MCAL的Spi驅(qū)動(dòng)位于BSW最底層它把QSPI外設(shè)抽象成了SpiChannel、SpiJob、SpiSequence三層結(jié)構(gòu)。上層CanIf、Eep或者自定義服務(wù)調(diào)用Spi_WriteIB / Spi_AsyncTransmit時(shí)并不直接面對(duì)寄存器。一旦DMA傳輸中途斷流或者片選切換時(shí)機(jī)不對(duì)你看到的只是某個(gè)SpiJob狀態(tài)卡在SPI_JOB_PENDING或者接收緩沖區(qū)的數(shù)據(jù)錯(cuò)位而根因可能在MCAL配置工具里一個(gè)毫不起眼的參數(shù)上。所以與其對(duì)著代碼盲調(diào)不如先把下面三個(gè)層面的邏輯理順QSPI外設(shè)本身的FIFO與DMA觸發(fā)機(jī)制、MCAL Spi驅(qū)動(dòng)在AUTOSAR分層里的調(diào)度行為、以及片選切換與DMA請(qǐng)求之間的時(shí)序配合。2. 動(dòng)手配置前先吃透這幾條時(shí)鐘樹、DMA通道與緩沖區(qū)規(guī)劃2.1 SPI時(shí)鐘與從機(jī)極限頻率之間的連帶效應(yīng)TC3xx的QSPI時(shí)鐘源來自SPBSystem Peripheral Bus實(shí)際波特率通過ECON寄存器的BR參數(shù)分頻得到。很多人只關(guān)注波特率數(shù)值本身忽略了從機(jī)對(duì)SCLK占空比、上升/下降時(shí)間的容限。在多從機(jī)場景里總線上的負(fù)載電容因PCB走線不同而不同導(dǎo)致SCLK邊沿變緩。如果你把波特率打到從機(jī)手冊(cè)允許的極限值再疊加DMA請(qǐng)求延遲波形變形就會(huì)直接表現(xiàn)為數(shù)據(jù)采樣錯(cuò)誤。我建議把波特率設(shè)定控制在從機(jī)最高時(shí)鐘的50%75%之間留出時(shí)序裕量。比如從機(jī)支持10MHz主機(jī)就跑5MHz或者7.5MHz。這個(gè)做法看著保守但在多從機(jī)、長走線、連接器轉(zhuǎn)接的板卡上能省掉大量排障時(shí)間。2.2 DMA通道不是想用哪個(gè)用哪個(gè)TC3xx的DMA模塊為每個(gè)QSPI模塊提供了獨(dú)立的TX/RX請(qǐng)求源但通道選擇和優(yōu)先級(jí)分配是有講究的。我踩過的第一個(gè)坑就是把多個(gè)QSPI的DMA請(qǐng)求掛在了同一個(gè)DMA優(yōu)先級(jí)層級(jí)上導(dǎo)致高負(fù)載時(shí)兩個(gè)SPI外設(shè)互相搶總線接收數(shù)據(jù)出現(xiàn)偶發(fā)空洞。實(shí)際項(xiàng)目中我給SPI多從機(jī)通信預(yù)留了兩條DMA通道一條TX、一條RX并且把TX通道的優(yōu)先級(jí)設(shè)置成高于RX因?yàn)榘l(fā)送方向一旦斷流從機(jī)端的片選時(shí)序和FIFO狀態(tài)會(huì)被打亂恢復(fù)成本遠(yuǎn)比接收方向高。另外如果同時(shí)有CAN、ETH、ADC等DMA請(qǐng)求SPI的DMA通道在硬件優(yōu)先級(jí)排列中應(yīng)處于中高位——太高會(huì)餓死其他外設(shè)太低則在突發(fā)傳輸時(shí)被頻繁搶占。2.3 緩沖區(qū)對(duì)齊問題一個(gè)字節(jié)序錯(cuò)亂的隱藏開關(guān)TC3xx DMA傳輸支持8位、16位、32位的數(shù)據(jù)寬度。如果SPI數(shù)據(jù)幀是16位而你把DMA源地址和目標(biāo)地址的步長設(shè)成了8位緩沖區(qū)里的字節(jié)序就會(huì)和你預(yù)期的完全不同——高低字節(jié)互換、數(shù)組錯(cuò)位且這種錯(cuò)誤極難通過單次回環(huán)測試發(fā)現(xiàn)因?yàn)閱螐臋C(jī)回環(huán)時(shí)收發(fā)是同一份數(shù)據(jù)錯(cuò)位會(huì)被“自我抵消”。這里有一條經(jīng)驗(yàn)DMA數(shù)據(jù)寬度、SPI數(shù)據(jù)幀寬度、緩沖區(qū)元素寬度三者必須一致。如果你在MCAL的工具配置里看到DMA通道的數(shù)據(jù)寬度是32位而你的SpiChannel數(shù)據(jù)幀是16位請(qǐng)一定改成16位否則后續(xù)移植或增加從機(jī)時(shí)數(shù)據(jù)錯(cuò)位問題會(huì)突然爆發(fā)。另外一個(gè)容易忽略的點(diǎn)是緩沖區(qū)地址對(duì)齊使用#pragma align 或內(nèi)存池分配時(shí)確保首地址至少按16位對(duì)齊否則DMA搬運(yùn)會(huì)觸發(fā)總線錯(cuò)誤或降低訪問效率。3. AUTOSAR MCAL里那幾項(xiàng)“默認(rèn)就能用”實(shí)則要命的參數(shù)3.1 SpiChannel、SpiJob、SpiSequence三層關(guān)系怎么搭A(yù)UTOSAR的Spi驅(qū)動(dòng)采用“序列—任務(wù)—通道”三級(jí)模型SpiSequence是一個(gè)完整的通信過程包含一個(gè)或多個(gè)SpiJob每個(gè)SpiJob對(duì)應(yīng)一次片選拉低到拉高的完整傳輸而SpiChannel則是具體的數(shù)據(jù)收發(fā)通道。多從機(jī)通信時(shí)很多人把多個(gè)從機(jī)的數(shù)據(jù)通道放在同一個(gè)SpiJob里結(jié)果片選邏輯全亂——MCAL底層在一次Job執(zhí)行期間CS不會(huì)釋放你的第二個(gè)從機(jī)數(shù)據(jù)等于發(fā)給了第一個(gè)從機(jī)。正確做法是一個(gè)從機(jī)對(duì)應(yīng)一個(gè)獨(dú)立的SpiJob每個(gè)Job綁定獨(dú)立的CS信號(hào)或者軟件片選GPIO。這樣既能保證每次傳輸?shù)耐暾杂址奖銌为?dú)設(shè)置每個(gè)從機(jī)的優(yōu)先級(jí)。配置工具中還要把SpiInterruptibleSeq、SpiTimeoutCounter等參數(shù)設(shè)對(duì)否則慢速從機(jī)在時(shí)序上稍有延遲MCAL就會(huì)報(bào)超時(shí)錯(cuò)誤。3.2 外部器件與內(nèi)部緩沖的取舍MCAL Spi驅(qū)動(dòng)支持兩種數(shù)據(jù)訪問方式直接讀寫內(nèi)部緩沖Spi_WriteIB/Spi_ReadIB和訪問外部器件地址Spi_WriteExt/Spi_ReadExt。很多人貪圖省事全部用內(nèi)部緩沖結(jié)果多從機(jī)場景下DMA需要同時(shí)在多個(gè)緩沖區(qū)之間切換配置稍不留神就會(huì)指向同一塊內(nèi)存區(qū)域。我的習(xí)慣是給每個(gè)從機(jī)獨(dú)立分配一塊接收緩沖區(qū)和發(fā)送緩沖區(qū)即使數(shù)據(jù)只有幾個(gè)字節(jié)。然后在SpiSequence的回調(diào)里做數(shù)據(jù)搬移把有效數(shù)據(jù)從“DMA直接寫入的緩沖區(qū)”拷貝到應(yīng)用緩沖區(qū)。這個(gè)中間緩沖區(qū)的存在看似多了一次內(nèi)存拷貝卻能避免DMA在異步傳輸過程中修改應(yīng)用數(shù)據(jù)這在AUTOSAR多核場景下尤其重要。3.3 Notification與ErrorHook的調(diào)用上下文AUTOSAR規(guī)范要求Spi的異步傳輸完成后調(diào)用Spi_Notification通知上層如果一個(gè)Sequence里包含多個(gè)Job那么每個(gè)Job完成也會(huì)觸發(fā)各自獨(dú)立的通知回調(diào)。很多工程師在回調(diào)里直接做耗時(shí)操作比如解析報(bào)文、拷貝大數(shù)據(jù)塊這在單從機(jī)時(shí)可能沒事但在多從機(jī)、DMA連續(xù)傳輸模式下回調(diào)耗時(shí)過長的后果是DMA請(qǐng)求無法及時(shí)響應(yīng)直接導(dǎo)致數(shù)據(jù)溢出或FIFO覆蓋。我在項(xiàng)目里定了一條規(guī)矩Notification回調(diào)里只做標(biāo)記、置事件標(biāo)志、喚醒任務(wù)所有數(shù)據(jù)處理放到任務(wù)上下文完成。如果你在做一個(gè)OSEK/AUTOSAR OS系統(tǒng)可以用SetEvent激活應(yīng)用任務(wù)如果是裸機(jī)就把標(biāo)志位置位在主循環(huán)里處理。4. DMA配置避坑Continuous Requests、中斷策略與數(shù)據(jù)寬度4.1 為什么開了DMA還是跑不滿SPI在TC3xx的DMA配置里有一個(gè)參數(shù)叫Continuous Requests連續(xù)請(qǐng)求位置在DMA通道控制寄存器CH_CTRL的PR字段。很多配置工具默認(rèn)把這項(xiàng)關(guān)掉結(jié)果就是SPI每觸發(fā)一次DMA請(qǐng)求DMA通道只搬一次數(shù)據(jù)就回到空閑狀態(tài)下一次傳輸需要CPU重新使能通道。表面上代碼流程沒錯(cuò)CPU占用率卻居高不下SPI速率也上不去。這個(gè)現(xiàn)象在單從機(jī)低速通信時(shí)很難暴露但在多從機(jī)高速輪詢時(shí)你會(huì)看到LSRLast Service Request標(biāo)志反復(fù)觸發(fā)SPI傳輸斷斷續(xù)續(xù)。解決辦法就是把Continuous Requests置1讓DMA通道在收到一次請(qǐng)求后保持活躍持續(xù)搬運(yùn)直到完成整個(gè)傳輸塊。4.2 Continuous Requests并不是無腦開啟但這里有個(gè)反直覺的坑如果你在同一條DMA通道上綁定多個(gè)請(qǐng)求源比如QSPI0和QSPI1的RX復(fù)用了同一通道Continuous Requests置1后高頻率的請(qǐng)求源可能餓死另一個(gè)請(qǐng)求源。因?yàn)镈MA在通道優(yōu)先級(jí)固定時(shí)會(huì)持續(xù)響應(yīng)同一個(gè)硬件請(qǐng)求另一個(gè)請(qǐng)求源只能等待。所以務(wù)必讓一個(gè)DMA通道只服務(wù)一個(gè)硬件請(qǐng)求源不要復(fù)用。如果你配置的是TC3xx的DMA菊花鏈Daisy Chain或者通道鏈接Channel Linkage也要反復(fù)確認(rèn)不同外設(shè)請(qǐng)求之間的互斥關(guān)系。4.3 發(fā)送完成中斷的優(yōu)先級(jí)博弈MCAL Spi驅(qū)動(dòng)在DMA發(fā)送完成后會(huì)產(chǎn)生發(fā)送完成中斷TX End Interrupt。很多人把這個(gè)中斷的優(yōu)先級(jí)配置得比DMA傳輸中斷高導(dǎo)致高優(yōu)先級(jí)中斷頻繁打斷DMA搬運(yùn)出現(xiàn)“已發(fā)送字節(jié)數(shù)對(duì)但數(shù)據(jù)內(nèi)容錯(cuò)位”的問題。我處理的時(shí)候把DMA的傳輸完成中斷優(yōu)先級(jí)設(shè)成高于SPI外設(shè)中斷讓DMA把整塊數(shù)據(jù)完整搬完再通知CPU。而SPI外設(shè)中斷只負(fù)責(zé)置標(biāo)志位不參與數(shù)據(jù)搬運(yùn)。這個(gè)策略在實(shí)測中非常有效數(shù)據(jù)完整性和CPU負(fù)載都有明顯改善。4.4 接收方向的FIFO排空時(shí)機(jī)QSPI接收FIFO有深度限制TC3xx的QSPI FIFO一般是8級(jí)或者16級(jí)具體看型號(hào)。多從機(jī)高速通信時(shí)如果DMA響應(yīng)不及時(shí)接收FIFO會(huì)溢出溢出標(biāo)志RXFL一旦置位整個(gè)FIFO內(nèi)數(shù)據(jù)都作廢。你要在中斷里主動(dòng)清RXFL并且把FIFO復(fù)位否則后續(xù)所有接收數(shù)據(jù)都是錯(cuò)的。這個(gè)坑極難察覺因?yàn)镸CAL工具可能默認(rèn)沒有使能FIFO溢出中斷。你可以通過讀QSPI狀態(tài)寄存器確認(rèn)或者更簡單的方法把DMA通道的接收中斷優(yōu)先級(jí)提高或者在配置工具里讓MCAL在DMA接收中斷里自動(dòng)清溢出標(biāo)志。我在實(shí)際項(xiàng)目中是直接在DMA中斷處理函數(shù)末尾加了一行檢查RXFL標(biāo)志的代碼一旦置位就復(fù)位整個(gè)QSPI接收路徑實(shí)測再也沒有出現(xiàn)“假死”現(xiàn)象。5. 片選切換的兩種路線硬件自動(dòng)片選與軟件GPIO片選5.1 硬件片選SLSO自動(dòng)片選的適用邊界TC3xx QSPI模塊自帶8根片選輸出SLSO[7:0]配合ECON和BACON寄存器可以做到自動(dòng)片選發(fā)送前自動(dòng)拉低傳輸結(jié)束后自動(dòng)拉高。這個(gè)功能在單從機(jī)場景下非常好用因?yàn)樗耆捎布刂祈憫?yīng)延遲極小。但多從機(jī)場景下自動(dòng)片選有幾個(gè)致命限制。最明顯的是QSPI的自動(dòng)片選在兩個(gè)連續(xù)傳輸之間如何釋放、釋放多長時(shí)間由硬件狀態(tài)機(jī)決定你沒法精確控制從機(jī)手冊(cè)里要求的“片選拉高到下次拉低的最小間隔”。對(duì)于某些嚴(yán)格要求CS高電平時(shí)間大于幾個(gè)微秒的從機(jī)比如部分傳感器或外部存儲(chǔ)器硬件自動(dòng)片選可能來不及釋放就進(jìn)行了第二次傳輸從機(jī)狀態(tài)機(jī)直接鎖死。5.2 軟件片選麻煩但可控在TC3xx平臺(tái)上我更傾向于用一個(gè)通用GPIO拉低/拉高來控制每個(gè)從機(jī)的CS而QSPI只負(fù)責(zé)提供SCLK、MOSI、MISO。這樣做的代價(jià)是我需要手動(dòng)控制時(shí)序而且每次傳輸前要把CS對(duì)應(yīng)的Port寄存器配置成推挽輸出。換來的好處是可精確控制CS拉低到第一個(gè)SCLK邊沿的時(shí)間稱為t_setup以及最后一個(gè)SCLK結(jié)束到CS拉高的時(shí)間稱為t_hold還可以在兩次傳輸之間強(qiáng)制插入一段CS高電平時(shí)間。具體實(shí)現(xiàn)時(shí)我會(huì)在SpiSequence開始前的驅(qū)動(dòng)函數(shù)里先拉低CS然后加一個(gè)循環(huán)延時(shí)至少23個(gè)SPI時(shí)鐘周期確保從機(jī)內(nèi)部完成上電復(fù)位/總線準(zhǔn)備再啟動(dòng)DMA。傳輸完成中斷里先將CS拉高再做數(shù)據(jù)搬移。這樣即使從機(jī)時(shí)序稍有不同也能通過調(diào)整延時(shí)參數(shù)快速適配。5.3 切換間隔怎么算一個(gè)真實(shí)計(jì)算示例假設(shè)從機(jī)手冊(cè)參數(shù)為t_setup 100nst_hold 100nsCS高電平時(shí)間t_release 1μs。如果SPI時(shí)鐘為5MHz周期200ns那么t_setup至少需要占0.5個(gè)時(shí)鐘周期建議直接空出1個(gè)時(shí)鐘周期t_hold同理建議空出1個(gè)時(shí)鐘周期t_release的1μs意味著在兩次傳輸之間至少要等5個(gè)時(shí)鐘周期實(shí)際建議你用延時(shí)函數(shù)控制到至少2μs。我的做法是在CS拉高之后、下一次CS拉低之前固定調(diào)用一個(gè)delayMicroseconds(2)然后在拉低后delayMicroseconds(1)再開始DMA傳輸。這樣所有從機(jī)的準(zhǔn)備時(shí)間都覆蓋了代價(jià)是總線利用率略降但在多從機(jī)環(huán)境下穩(wěn)定第一。6. 實(shí)測排障記錄三個(gè)反復(fù)出現(xiàn)的SPI多從機(jī)問題6.1 首字節(jié)丟失信號(hào)波形卻完全正常這是最迷惑人的問題邏輯分析儀抓波形CS拉低、SCLK正常、數(shù)據(jù)也完整但從機(jī)回傳的首字節(jié)就是丟。后來我對(duì)比從機(jī)手冊(cè)才發(fā)現(xiàn)從機(jī)要求在CS拉低后等待一段時(shí)間才采樣第一個(gè)SCLK邊沿而我們的片上DMA在CS拉低后立即開始了時(shí)鐘輸出從機(jī)還沒準(zhǔn)備好第一幀采樣到了無效電平。解決辦法就是上面提到的軟件片選拉低之后做短延時(shí)或者用QSPI的Leading Delay參數(shù)在BACON寄存器里配置幀開始前的時(shí)鐘等待周期。這個(gè)問題在更換從機(jī)型號(hào)時(shí)最容易出現(xiàn)因?yàn)椴煌瑥臋C(jī)的CS建立時(shí)間差異很大。6.2 DMA搬運(yùn)數(shù)據(jù)錯(cuò)位回環(huán)測試又發(fā)現(xiàn)不了排查了整整一個(gè)下午的場景單從機(jī)回環(huán)收發(fā)一致接上第二個(gè)從機(jī)后接收數(shù)據(jù)整體錯(cuò)位。最后查到原因我在MCAL配置里讓兩個(gè)從機(jī)共用了一條DMA RX通道但通道的數(shù)據(jù)寬度設(shè)置為32位而從機(jī)發(fā)送的幀是16位。結(jié)果DMA每次搬運(yùn)4個(gè)字節(jié)把下一幀的前兩個(gè)字節(jié)也“吞”了接收緩沖區(qū)的數(shù)據(jù)全部往前串位?;丨h(huán)測試發(fā)現(xiàn)不了的原因也很簡單單從機(jī)模式下數(shù)據(jù)是同一個(gè)微控制器發(fā)出的收發(fā)路徑的錯(cuò)位被DMA搬運(yùn)的自洽性掩蓋了。一旦接入第二個(gè)從機(jī)主機(jī)發(fā)出的數(shù)據(jù)幀結(jié)構(gòu)不同錯(cuò)位立刻暴露。修復(fù)方法就是讓DMA寬度等于幀寬度并且為每個(gè)從機(jī)分配獨(dú)立的DMA通道或至少獨(dú)立的緩沖區(qū)。6.3 從機(jī)偶發(fā)無響應(yīng)示波器看又看不出異常最難以復(fù)現(xiàn)的問題長時(shí)間運(yùn)行后某個(gè)從機(jī)會(huì)偶發(fā)不響應(yīng)主機(jī)收到全F或0x00。這種問題通常跟CS釋放時(shí)間有關(guān)因?yàn)殚L時(shí)間運(yùn)行中DMA請(qǐng)求延遲、總線搶占等因素會(huì)導(dǎo)致CS高電平時(shí)間偶發(fā)縮短從機(jī)檢測到異常后進(jìn)入錯(cuò)誤狀態(tài)只有重新上電或CS拉低足夠時(shí)間才能恢復(fù)。針對(duì)這類問題最有效的辦法不是調(diào)大延時(shí)去“碰運(yùn)氣”而是在每個(gè)傳輸完成的中斷里記錄時(shí)間戳打印CS高電平持續(xù)時(shí)間。如果發(fā)現(xiàn)某些周期內(nèi)這個(gè)時(shí)間小于從機(jī)的最小要求就需要在驅(qū)動(dòng)層強(qiáng)制增加最小釋放時(shí)間。我在代碼里加了一個(gè)簡單的時(shí)間戳數(shù)組保留最近100次傳輸?shù)臅r(shí)間差最后定位到是另一個(gè)中斷任務(wù)偶發(fā)搶占導(dǎo)致CS釋放時(shí)間被壓縮加上優(yōu)先級(jí)調(diào)整后問題徹底消失。7. 一點(diǎn)后續(xù)經(jīng)驗(yàn)這套配置思路同樣適用于其他外設(shè)組合把TC3xx的SPI多從機(jī)問題解決完之后我把同樣的DMA通道獨(dú)立、數(shù)據(jù)寬度統(tǒng)一、中斷優(yōu)先級(jí)分級(jí)、軟件片選加時(shí)序延時(shí)的思路遷移到了其他外設(shè)的組合上比如SPI轉(zhuǎn)CAN部分項(xiàng)目中用TC3xx驅(qū)動(dòng)外部SPI轉(zhuǎn)CAN控制器以及通過USIC模塊復(fù)用SPI連接外部傳感器。核心思想是一樣的外設(shè)與DMA通道一對(duì)一DMA寬度與數(shù)據(jù)幀寬度嚴(yán)格一致中斷回調(diào)保持輕量片選切換時(shí)序顯式控制。如果你也在TC3xx平臺(tái)上做AUTOSAR相關(guān)的底層驅(qū)動(dòng)建議先把QSPI模塊的用戶手冊(cè)詳細(xì)閱讀一遍特別是BACON寄存器和DMA請(qǐng)求部分。很多MCAL配置工具的圖形化界面參數(shù)最終都會(huì)映射到這些寄存器上理解了寄存器層面的行為排查問題能快很多。最后分享一個(gè)小技巧在你調(diào)試SPI多從機(jī)通信時(shí)邏輯分析儀一定要選擇支持協(xié)議解析的抓取時(shí)長拉長到幾十秒觸發(fā)條件設(shè)置為CS下降沿。不要只看幾個(gè)周期的波形連續(xù)抓取長時(shí)間數(shù)據(jù)后很多偶發(fā)性問題會(huì)自己暴露出來。