專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命
提供開發(fā)工具、應(yīng)用測(cè)試 完善的開發(fā)代碼案例庫(kù)分享
從全面的產(chǎn)品導(dǎo)入到強(qiáng)大技術(shù)支援服務(wù) 全程貼心伴隨服務(wù),創(chuàng)造無限潛能!
提供新的芯片及解決方案,提升客戶產(chǎn)品競(jìng)爭(zhēng)力
提供最新的單片機(jī)資訊,行業(yè)消息以及公司新聞動(dòng)態(tài)
單片機(jī)SPI通信數(shù)據(jù)錯(cuò)位,幾乎是每個(gè)單片機(jī)工程師都會(huì)踩到的坑。PI通信看似簡(jiǎn)單(僅四根信號(hào)線),但正因配置靈活,也是極易出現(xiàn)通信故障的協(xié)議。日常遇到的數(shù)據(jù)錯(cuò)位、高低位傳輸顛倒問題,根源基本都是主從設(shè)備配置不匹配,下文從底層邏輯拆解故障原因。

一、核心根源:四種工作模式混淆
SPI共有四種工作模式,由時(shí)鐘極性、時(shí)鐘相位共同決定,這也是引發(fā)數(shù)據(jù)錯(cuò)位的最主要原因。
時(shí)鐘極性:控制時(shí)鐘總線空閑時(shí)的電平狀態(tài);時(shí)鐘相位:決定數(shù)據(jù)在時(shí)鐘上升沿或下降沿被采樣。
主從設(shè)備采樣、發(fā)送沿不匹配時(shí),從機(jī)無法精準(zhǔn)采集有效數(shù)據(jù),只會(huì)抓到前一位數(shù)據(jù)尾端或后一位數(shù)據(jù)起始位,最終導(dǎo)致整字節(jié)數(shù)據(jù)偏移。比如發(fā)送0b10110000,設(shè)備可能收到偏移后的0b01100001,波形正常但數(shù)據(jù)完全對(duì)應(yīng)不上。
二、直接原因:數(shù)據(jù)傳輸順序顛倒
這是高低位傳輸錯(cuò)亂的直接誘因,SPI協(xié)議本身未強(qiáng)制規(guī)定數(shù)據(jù)先發(fā)高位還是低位,傳輸順序由芯片設(shè)計(jì)決定。
主流MCU、外設(shè)默認(rèn)高位先行;部分專用芯片(LED驅(qū)動(dòng)、傳感器、模擬SPI ADC等)則要求低位先行。兩者配置沖突時(shí),傳輸數(shù)據(jù)會(huì)完全反轉(zhuǎn),看似亂碼實(shí)則存在對(duì)稱規(guī)律,也是初學(xué)者配置SPI寄存器時(shí)最容易忽略的配置項(xiàng)。
三、高速通信隱患:采樣相位細(xì)微錯(cuò)位
即便SPI模式匹配,高速傳輸下依舊可能出現(xiàn)錯(cuò)位故障。一方面主從時(shí)鐘存在微小頻差,長(zhǎng)時(shí)間連續(xù)傳輸會(huì)產(chǎn)生相位累積誤差,采樣點(diǎn)落在數(shù)據(jù)邊沿,引發(fā)一位出錯(cuò)、后續(xù)全部錯(cuò)位;另一方面時(shí)鐘線毛刺、接線接觸不良,會(huì)讓從機(jī)誤判時(shí)鐘信號(hào),額外計(jì)數(shù)導(dǎo)致數(shù)據(jù)串位,手工接線場(chǎng)景下這類故障尤為常見。
四、易被忽視:片選信號(hào)配置錯(cuò)誤
片選信號(hào)的作用常被低估,不同外設(shè)對(duì)片選時(shí)序要求不同:部分設(shè)備要求多字節(jié)傳輸時(shí)片選持續(xù)拉低,部分則要求單字節(jié)傳輸后片選重新拉高同步。
代碼時(shí)序與外設(shè)要求沖突時(shí),會(huì)打亂設(shè)備內(nèi)部計(jì)數(shù)邏輯,導(dǎo)致字節(jié)幀結(jié)構(gòu)錯(cuò)亂,進(jìn)而引發(fā)數(shù)據(jù)錯(cuò)位。
五、代碼漏洞:缺少忙狀態(tài)檢測(cè)
Flash、SD卡、ADC這類SPI外設(shè),處理數(shù)據(jù)需要一定響應(yīng)時(shí)間。標(biāo)準(zhǔn)通信流程需遵循“主機(jī)發(fā)送-從機(jī)處理-主機(jī)讀取”的步驟,若發(fā)送指令后未等待從機(jī)忙標(biāo)志釋放,直接下發(fā)后續(xù)數(shù)據(jù),會(huì)導(dǎo)致數(shù)據(jù)被忽略,最終引發(fā)后續(xù)數(shù)據(jù)邏輯錯(cuò)位。
當(dāng)遇到數(shù)據(jù)錯(cuò)位或高低位反了時(shí),一般按下面的順序進(jìn)行排查:
先確認(rèn)模式:仔細(xì)閱讀從機(jī)數(shù)據(jù)手冊(cè),找到時(shí)序圖。確認(rèn)時(shí)鐘空閑電平和數(shù)據(jù)采樣邊沿。然后在單片機(jī)的SPI配置中嚴(yán)格對(duì)應(yīng)。如果不確定,用邏輯分析儀抓取SCK和MOSI波形,與手冊(cè)對(duì)比。
檢查字節(jié)順序:確認(rèn)從機(jī)手冊(cè)中“Data Format”部分。如果單片機(jī)支持可配,直接修改配置;如果不支持,可以在軟件里用查表法或位反轉(zhuǎn)宏對(duì)數(shù)據(jù)進(jìn)行預(yù)處理。
降低速度:先把SPI時(shí)鐘降到極低(如100kHz)。低速下信號(hào)完整性更好,能排除硬件接觸不良和時(shí)序建立時(shí)間不足的問題。
驗(yàn)證連接:確認(rèn)MISO接MISO,MOSI接MOSI。雖然聽起來簡(jiǎn)單,但很多人會(huì)把主機(jī)的MISO誤接到從機(jī)的MOSI,導(dǎo)致“有數(shù)據(jù)但全是亂的”。
以上就是英銳恩單片機(jī)開發(fā)工程師分享的單片機(jī)SPI通信數(shù)據(jù)錯(cuò)位的原因及解決方式。英銳恩專注單片機(jī)應(yīng)用方案設(shè)計(jì)與開發(fā),提供8位單片機(jī)、32位單片機(jī)。