SPI通信在嵌入式領(lǐng)域是非常常用的一種通信方式了,相比串口、IIC等等,SPI通信是一種高速、高效率的串行接口技術(shù)。
然而最近在新項目開發(fā)中使用SPI通信卻遇到了不少問題,過程中還是有挺多技術(shù)細節(jié)和知識點需要把握住的,那么今天bug菌就結(jié)合最近的使用情況和一直以來在SPI通信上踩過的坑進行總結(jié)和記錄,一起避坑。 本文為基礎(chǔ)鞏固篇:
1通信形式
SPI是一種全雙工、同步串行的通信方式,全雙工、半雙工等,表示某一時刻,數(shù)據(jù)的流動形式,全雙工即可雙向同時收發(fā),而半雙工則在一個時刻只能收或者發(fā),通常全雙工具有兩條獨立通信線路,而半雙工則共用同一條線路。
從SPI通信接線圖可以看出,MOSI用于主機數(shù)據(jù)輸出,從機數(shù)據(jù)輸入,MISO引腳的數(shù)據(jù)流則剛好與之相反,所以數(shù)據(jù)流收發(fā)是走的兩條獨立的線路,從而可實現(xiàn)全雙工通信模式,當(dāng)然你也可以用于只用于單向數(shù)據(jù)傳輸,比如省略掉MISO僅主機傳輸從機數(shù)據(jù)等。
SPI通信有一個SCLK時鐘線作為通信的同步信號,用來標定數(shù)據(jù)在MOSI和MISO引腳上的傳輸情況,SCLK是由主機來控制提供,從機檢測識別,從而同步完成數(shù)據(jù)傳輸。
片選信號CS引腳,還記得有一次面試問片選信號CS英文是什么?英文直譯即可--Chip Select。
片選信號在大部分數(shù)字芯片都有存在,外界給該引腳相應(yīng)的電平即可選中,相當(dāng)于一個"總開關(guān)",大部分從設(shè)備都是低電平被選中(電路圖中通常在CS上劃線標識),如果一直被選中則直接接地即可;當(dāng)然也有少部分高電平選中則可直接接到VCC,切記不可懸空,以免異常。
這樣看SPI的通信線路非常簡單,沒有繁雜的線路硬件也省了不少事,但很多朋友包括bug菌曾經(jīng)因為把主機的MOSI接到從機的MISO而折騰得不輕,都是慣性思維惹的禍,一定要記住是對應(yīng)引腳相連。
2通信線路
SPI是一種主從通信方式,在SPI通信總線上通常只有一個主機,一切通信的開始都是以主機發(fā)起,那如果在一條總線上與多個從設(shè)備通信呢?下面以兩個從機為例,更多的從機也是類似的。
通過不同的片選引腳來選中不同的從設(shè)備,從而完成一對多的通信過程。通常多從機的情況都會采用多余的IO口連接從設(shè)備的片選引腳,以便分時控制從設(shè)備,達到一主多從機的主從控制方式。
當(dāng)然如果獨立的IO口引腳有限,可以采用IO口擴展芯片進行選中,也是比較方便的。
3通信數(shù)據(jù)
SPI通信是一種交換數(shù)據(jù)的形式,主機根據(jù)SCLK時鐘把數(shù)據(jù)從MOSI引腳按bit位發(fā)送的同時,從機也以相同的速率把數(shù)據(jù)從MISO引腳傳輸,其傳輸數(shù)據(jù)形式如下:
從SPI通信數(shù)據(jù)流圖可以看出其發(fā)送與接收形成了一個封閉的環(huán),所要傳輸?shù)臄?shù)據(jù)像水在一根管道內(nèi)循環(huán)流動,所以其硬件線路上并沒有像I2C那樣有所謂的應(yīng)答機制,通信效率上提高不少,但數(shù)據(jù)可靠性也會有一定的減弱。
前面bug也談到SPI是一種主從通信機制,那么使得“管子”內(nèi)數(shù)據(jù)流涌動的源泉一方面需要SPI的SCLK時鐘保持好節(jié)奏,另一方面就是需要主機來推動,所以如果master只是想獲取slave的數(shù)據(jù),也需要發(fā)送空數(shù)據(jù)來使得整個數(shù)據(jù)流動起來,從而獲得從機的數(shù)據(jù)。
細心的朋友應(yīng)該注意到上圖中MSB和LSB方向了,通常SPI通信都是以MSB來進行發(fā)送,但像stm32芯片這樣的芯片可以設(shè)置是LSB先發(fā)送還是MSB先發(fā)送。
所以在分析SPI通信數(shù)據(jù)的時候這些數(shù)據(jù)都是需要提前了解的。
4通信電平?
SPI比較麻煩點的就是時鐘極性和時鐘相位的確定了,但再怎么麻煩也就確定了4種模式。
如下是4種模式的時序圖,其中CPOL(Clock Polarity)表示時鐘極性,CPHA(Clock Phase)表示時鐘相位。
從圖中我們可以分析得到:
1、CPOL和CPHA共同決定數(shù)據(jù)的采集方式。
2、CPOL決定了SCLK默認狀態(tài),當(dāng)CPOL=0,時鐘空閑時是低電平;當(dāng)CPOL=1,時鐘空閑時為高電平。
3、CPHA決定了數(shù)據(jù)在第幾個跳變沿采集,當(dāng)CPHA=0,在SCLK第一個跳變沿采集穩(wěn)定數(shù)據(jù);當(dāng)CPHA=1,在SCLK第二個跳變沿采集穩(wěn)定數(shù)據(jù)。
每個bit的數(shù)據(jù)交換,都是在電平穩(wěn)定的時候進行數(shù)據(jù)電平采集,在電平變化的時候進行數(shù)據(jù)發(fā)送,一般從設(shè)備像高精度ADC等等,出廠就已經(jīng)是固定了某種模式,我們需要做的就是通過配置可編程的主機SPI外設(shè)在相同的一種頻率和模式下通信,否則就是造成數(shù)據(jù)錯亂。
現(xiàn)在比較流行庫開發(fā),很多外設(shè)使用案例直接可以拿過來用,或者嘗試著調(diào)整幾個參數(shù)就可以了,似乎不需要懂太多的原理,但這樣的學(xué)習(xí)終究只是把芯片玩起來了,要做到一通百通還是得從最原始的理論出發(fā),只有把握住這些重點才能在項目開發(fā)的過程中直面問題并搞定它。
下一篇進階避坑篇,我們再更加深入聊聊SPI。
原文標題:大話SPI通信--基礎(chǔ)鞏固篇
文章出處:【微信公眾號:痞子衡嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
審核編輯:湯梓紅
-
總線
+關(guān)注
關(guān)注
10文章
2878瀏覽量
88051 -
SPI通信
+關(guān)注
關(guān)注
0文章
35瀏覽量
11358 -
MOSI
+關(guān)注
關(guān)注
0文章
5瀏覽量
3984
原文標題:大話SPI通信--基礎(chǔ)鞏固篇
文章出處:【微信號:pzh_mcu,微信公眾號:痞子衡嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論