什么是SPI
SPI是串行外設(shè)接口(Serial Peripheral Interface)的縮寫。SPI,是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時(shí)為PCB的布局上節(jié)省空間,提供方便,正是出于這種簡(jiǎn)單易用的特性,如今越來越多的芯片集成了這種通信協(xié)議,比如AT91RM9200。
SPI協(xié)議概括
SPI的通信原理很簡(jiǎn)單,它以主從方式工作,這種模式通常有一個(gè)主設(shè)備和一個(gè)或多個(gè)從設(shè)備,需要至少4根線,事實(shí)上3根也可以(單向傳輸時(shí))。也是所有基于SPI的設(shè)備共有的,它們是SDI(數(shù)據(jù)輸入)、SDO(數(shù)據(jù)輸出)、SCLK(時(shí)鐘)、CS(片選)。
?。?)SDI – SerialData In,串行數(shù)據(jù)輸入;
?。?)SDO – SerialDataOut,串行數(shù)據(jù)輸出;
?。?)SCLK – Serial Clock,時(shí)鐘信號(hào),由主設(shè)備產(chǎn)生;
?。?)CS – 從設(shè)備使能信號(hào),由主設(shè)備控制。
什么是I2C總線
I2C--INTER-IC串行總線的縮寫,是PHILIPS公司推出的芯片間串行傳輸總線。它以1根串行數(shù)據(jù)線(SDA)和1根串行時(shí)鐘線(SCL)實(shí) 現(xiàn)了雙工的同步數(shù)據(jù)傳輸。具有接口線少,控制方式簡(jiǎn)化,器件封裝形式小,通信速率較高等優(yōu)點(diǎn)。在主從通信中,可以有多個(gè)I2C總線器件同時(shí)接到I2C總線 上,通過地址來識(shí)別通信對(duì)象。
I2C 接口的協(xié)議里面包括設(shè)備地址信息,可以同一總線上連接多個(gè)從設(shè)備,通過應(yīng)答來互通數(shù)據(jù)及命令。但是傳輸速率有限,標(biāo)準(zhǔn)模式下可達(dá)到100Kbps,快速模式下可達(dá)到400Kbps(我們開發(fā)板一般在130Kbps),高速模式下達(dá)到4Mbps,不能實(shí)現(xiàn)全雙工,不適合傳輸很多的數(shù)據(jù)。
I2C總線是一個(gè)真正的多主機(jī)總線,總線上多個(gè)主機(jī)初始化傳輸,可以通過傳輸檢測(cè)和仲裁來防止數(shù)據(jù)被破壞 。
下來詳細(xì)了解I2C總線時(shí)序:
1.1 總線數(shù)據(jù)有效性
I2C總線是單工,因此同一時(shí)刻數(shù)據(jù)只有一個(gè)流向,因此采樣有效時(shí)鐘也是單一的,是在SCL時(shí)鐘的高電平采樣數(shù)據(jù)。
I2C總線上SDA數(shù)據(jù)在SCL時(shí)鐘低電平是可以發(fā)生變化,但是在時(shí)鐘高電平時(shí)必須穩(wěn)定,以便主從設(shè)備根據(jù)時(shí)鐘采樣數(shù)據(jù),如下圖:
1.2 總線空閑條件
I2C總線上設(shè)備都釋放總線(發(fā)出傳輸停止)后,I2C總線根據(jù)上拉電阻變成高電平,SDA SCL都是高電平。
1.3 總線數(shù)據(jù)傳輸起始和結(jié)束條件
I2C總線SCL高電平時(shí)SDA出現(xiàn)由高到低的跳變,標(biāo)志總線上數(shù)據(jù)傳輸?shù)拈_始條件
I2C總線SCL高電平時(shí)SDA出現(xiàn)由低到高的跳變,標(biāo)志總線上數(shù)據(jù)傳輸?shù)慕Y(jié)束條件
1.4 總線數(shù)據(jù)傳輸順序以及ACK應(yīng)答
I2C總線上數(shù)據(jù)傳輸室MSB在前,LSB在后,從示波器上看,從左向右依次讀出數(shù)據(jù)即可
I2C總線傳輸?shù)臄?shù)據(jù)不收限制,但是每次發(fā)到SDA上的必須是8位,并且主機(jī)發(fā)送8位后釋放總線,從機(jī)收到數(shù)據(jù)后必須拉低SDA一個(gè)時(shí)鐘,回應(yīng)ACK表示數(shù)據(jù)接收成功,我們?nèi)绻静ㄆ魃峡吹降牟ㄐ尉褪敲看?位數(shù)據(jù),8bit+1bit ack。如下:
從機(jī)收到一字節(jié)數(shù)據(jù)后,如果需要一些時(shí)間處理,則會(huì)拉低SCL,讓傳輸進(jìn)入等待狀態(tài),處理完成,釋放SCL,繼續(xù)傳輸,如下:
1.5 總線讀寫時(shí)序
數(shù)據(jù)的傳輸在起始條件之后,發(fā)送一個(gè)7位的從機(jī)地址,緊接著第8位是數(shù)據(jù)方向(R/ W),0-表示發(fā)送數(shù)據(jù)(寫),1-表示接收數(shù)據(jù)(讀)。數(shù)據(jù)傳輸一般由主機(jī)產(chǎn)生的停止位(P)終止。但是如果主機(jī)仍希望在總線上通訊,它可以產(chǎn)生重復(fù)起始條件(Sr),和尋址另一個(gè)從機(jī),而不是首先產(chǎn)生一個(gè)停止條件。在這種傳輸中,可能有不同的讀/寫格式結(jié)合。
I2C總線主設(shè)備讀寫從設(shè)備,一般都是與從設(shè)備的寄存器打交道,這個(gè)可以通過閱讀從設(shè)備的datasheet獲取。總線寫時(shí)序如下:
master start + master addr|w + slave ack + master reg|w + slave ack + master data + slave ack + master restart。。master data + slave nack + master stop
總線讀時(shí)序如下:
master start + master addr|w + slave ack + master reg|w + slave ack + master restart + master addr|r + slave ack + slave data + master nack + master stop
總線讀時(shí)序與寫的不同之處在于讀需要2次傳輸才能完成一次讀取,首先要寫寄存器地址到從設(shè)備,其實(shí)是寫到了從設(shè)備的控制寄存器或者命令寄存器,從設(shè)備內(nèi)部會(huì)根據(jù)這個(gè)地址來尋址所要操作的寄存器。
我在讀我們的bios和內(nèi)核時(shí)發(fā)現(xiàn),2者在總線讀時(shí)序上的實(shí)現(xiàn)不太一樣,在于第一次寄存器地址寫入后,一個(gè)發(fā)的是restart,一個(gè)發(fā)的是stop,然后再start開始讀取數(shù)據(jù),示波器抓波形發(fā)現(xiàn)讀取數(shù)據(jù)都正確,說明這2種時(shí)序都是正確的。
I2C總線的讀寫時(shí)序比較固定,設(shè)備通信嚴(yán)格遵循協(xié)議,因此I2C總線設(shè)備驅(qū)動(dòng)程序的編寫也就相對(duì)簡(jiǎn)單一些。
主要應(yīng)用的I2C總線設(shè)備有touchscreen rtc 外擴(kuò)io等
評(píng)論