回覆列表
-
1 # 雁塔菜農
-
2 # 玩轉嵌入式
SPI和IIC都是比較常用的短距離通訊方式,主要用在PCB板間或者晶片之間實現近距離通訊。比如AT24C02就是透過IIC和微控制器實現資料通訊的,BMP280即可以透過IIC又可以透過SPI和微控制器進行資料通訊。
這兩種通訊方式都有著各自的時序圖,在程式設計時需要認真研究時序圖,根據時序圖編寫程式,下面舉例子。
SPI通訊時序介紹SPI是比較高速的通訊方式,具有三線制和四線制之分,四線制有CS,SCK,MISO,MOSI等。SPI具有四種工作模式,並且時鐘極性CPOL和時鐘相位CPHA可以配置,這個在程式設計序時需要注意:如果CPOL=0,則空閒狀態為低電平;如果CPOL=1,則空閒狀態為高電平。CPHA決定著在哪個邊沿進行資料採集。如果 CPHA=0,則在第一個跳變沿進行資料取樣;如果CPHA=1,則在第二個跳變沿進行資料取樣。
對於具體程式程式碼的編寫,可以根據時序圖慢慢研究,或者參考別人的程式碼和時序圖進行對比。
IIC通訊時序介紹IIC只有兩根線,分別為SCL和SDA。主從式結構,一個主機可以接多個主機,典型的拓撲結構圖如下所示。
IIC在通訊時,需要需要有三個過程/訊號:開始訊號、應答訊號和結束訊號。每種訊號都有嚴格的時序要求。以起始和結束為例介紹一下,時序圖如下所示。
在SCL為高電平期間,如果SDA出現下降沿則為起始訊號;如果SCL為高電平期間,SDA為上升沿,則為結束訊號。在程式設計時就要依據這個時序圖。IIC可以使用普通GPIO口模擬,也可以使用微控制器的片上資源,開始訊號的實現程式碼如下所示。
程式的實現沒法細細解釋,只能自己去編程式碼,可以自己對著時序圖去編寫,也可以從網上參考程式碼。
在嵌入式領域,除了MCU,ARM,DSP是核心外,外圍介面器件之間的通訊也非常重要。
對於序列通訊的兩大類SPI和I2C而言,前者是三線介面,後者是二線介面。
SPI非常簡單,這裡就不在敘述。
主要談談I2C,它本來就是可以一主多從的匯流排協議,而目前大多都是同步通訊,故需要等待,容易宕機。
目前對於讀取ROM的I2C,好多都是模擬I2C匯流排協議,這裡問題不大。
但是對於一主多從,或者用OS作業系統時,你等待會使整個系統的效率降低很多,更談不上“休眠”低功耗。
故在一主多從匯流排控制時,應該採用I2C中斷方式,而非模擬等待,菜農推薦用“狀態機”的思維來編寫程式,即事先安排好工作的狀態。每次I2C中斷後,會進入Exec回撥函式(中斷函式)。
因為每次I2C控制器都會給出一個“標誌”,那麼就會被“case”……
具體如下圖所示。
看不清可以搜尋:
http://www.eechina.com/thread-25839-1-1.html