SPI也是MCU最常見(jiàn)的對(duì)外通信口之一,由摩托羅拉在上世紀(jì)80年代中開(kāi)發(fā),用于嵌入式系統(tǒng)中器件之間的短距離數(shù)據(jù)通信,標(biāo)準(zhǔn)模式使用四條信號(hào)線。目前常見(jiàn)的應(yīng)用器件有:LCD模組、以太網(wǎng)模塊、SPI串行Flash和很多傳感器等,大部分SD卡都具有SPI操作模式。
SPI的特點(diǎn)是主從結(jié)構(gòu)、協(xié)議簡(jiǎn)單、成本低廉、串行傳輸?shù)?,具有同步時(shí)鐘信號(hào),傳輸速率可達(dá)幾兆至十幾兆(近來(lái)也有達(dá)到二、三十兆速率的器件),適合于中等數(shù)據(jù)量、點(diǎn)對(duì)點(diǎn)的傳輸環(huán)境。
1.1 SPI通信協(xié)議
SPI是點(diǎn)對(duì)點(diǎn)的全雙工串行通信協(xié)議,用于兩個(gè)設(shè)備間的通信?;镜倪B線方式是四條信號(hào)線,如下圖:
四條信號(hào)線中有兩條數(shù)據(jù)線,分別用于主機(jī)向從機(jī)發(fā)送數(shù)據(jù)(MOSI: Master OutSlave In),和從機(jī)向主機(jī)發(fā)送數(shù)據(jù)(MISO: MasterIn Slave Out)。
主機(jī)器件通過(guò)SCK時(shí)鐘信號(hào)線向從機(jī)輸出時(shí)鐘,同時(shí)主機(jī)輸出SSEL信號(hào)作為從機(jī)的片選。
1.1.1 SPI數(shù)據(jù)傳輸
SPI的數(shù)據(jù)傳輸流程十分簡(jiǎn)單,在每個(gè)SCK的時(shí)鐘周期中有如下操作:
▲主機(jī)在MOSI向從機(jī)發(fā)送一個(gè)數(shù)據(jù)位;
▲從機(jī)在MOSI上接收一個(gè)數(shù)據(jù)位;
▲從機(jī)在MISO向主機(jī)發(fā)送一個(gè)數(shù)據(jù)位;
▲主機(jī)在MISO上接收一個(gè)數(shù)據(jù)位。
一般SPI的主機(jī)和從機(jī)都是各由一個(gè)移位寄存器實(shí)現(xiàn)數(shù)據(jù)的發(fā)送與接收,示意圖如下:
在同一個(gè)時(shí)鐘信號(hào)的驅(qū)動(dòng)下,主機(jī)和從機(jī)的移位寄存器同時(shí)向相同方向移位,經(jīng)過(guò)n個(gè)時(shí)鐘周期的n次移位,主機(jī)的數(shù)據(jù)與從機(jī)的數(shù)據(jù)正好進(jìn)行了交換。
通常每個(gè)字符數(shù)據(jù)的長(zhǎng)度n=8或n=16。LPC800允許每個(gè)數(shù)據(jù)長(zhǎng)度可以是1~16中任意數(shù)值。
1.1.2 SPI的時(shí)鐘信號(hào)
SPI的時(shí)鐘信號(hào)SCK除了頻率特性外,還需要考慮它的極性和相位,分別由CPOL和CPHA表示,具有以下意義:
▲時(shí)鐘極性:
CPOL=0:空閑時(shí),時(shí)鐘信號(hào)為‘0’。時(shí)鐘信號(hào)的前沿為上升沿,后沿為下降沿。
CPOL=1:空閑時(shí),時(shí)鐘信號(hào)為‘1’。時(shí)鐘信號(hào)的前沿為下降沿,后沿為上升沿。
▲時(shí)鐘相位:
CPHA=0:發(fā)送方在前一個(gè)時(shí)鐘周期的后沿改變輸出信號(hào);接收方在時(shí)鐘周期的前沿采樣輸入信號(hào)。
CPHA=1:發(fā)送方在時(shí)鐘周期的前沿改變輸出信號(hào);接收方在時(shí)鐘周期的后沿采樣輸入信號(hào)。
通常CPOL和CPHA的四種組合被定義為四種模式,如下表:
在模式0和模式2的SCK第一個(gè)時(shí)鐘邊沿之前,SPI主機(jī)利用內(nèi)部時(shí)鐘在MOSI上輸出第一個(gè)數(shù)據(jù)位(最高位),SPI從機(jī)則使用前一個(gè)數(shù)據(jù)幀的最后一個(gè)邊沿輸出第一個(gè)數(shù)據(jù)位(最高位)。
1.1.3 SPI 設(shè)備的互連
SPI設(shè)備間的互連是主從關(guān)系,一個(gè)主設(shè)備可以連接多個(gè)從設(shè)備,主設(shè)備通過(guò)從設(shè)備片選信號(hào)區(qū)別與那個(gè)從設(shè)備進(jìn)行通信。
一個(gè)主機(jī)設(shè)備能夠連接的從機(jī)數(shù)量,由能夠輸出的片選信號(hào)(SSELn)的個(gè)數(shù),和MOSI、SCK信號(hào)線的驅(qū)動(dòng)能力限制。
1.2 LPC800的SPI特性
LPC800的SPI非常簡(jiǎn)單,但配置豐富并且很方便使用。
▲每個(gè)數(shù)據(jù)幀的長(zhǎng)度可以直接配置為1~16位的任一種,通過(guò)軟件操作還可以支持任意長(zhǎng)度的數(shù)據(jù)幀。
▲支持主機(jī)模式或從機(jī)模式。
▲主機(jī)可以在發(fā)送數(shù)據(jù)時(shí),不必理會(huì)從機(jī)返回的數(shù)據(jù)。這有助于優(yōu)化軟件的操作,例如對(duì)LCD模組刷屏?xí)r(現(xiàn)實(shí)中有不少LCD模組是不可讀的),或?qū)懭隨PI存儲(chǔ)器時(shí)。
▲控制信息可以與發(fā)送的數(shù)據(jù)一起寫(xiě)入寄存器,這樣可以實(shí)現(xiàn)各種靈活的操作要求。
▲最多有四個(gè)直接控制的從機(jī)片選信號(hào),并且可以配置極性。
▲支持DMA操作。
▲可以靈活地控制每個(gè)數(shù)據(jù)幀中的各種時(shí)序。
1.3 SPI Flash讀寫(xiě)例程 下面以幾個(gè)例程示范使用SPI對(duì)SPI Flash的 讀寫(xiě)操作。
這些例程都是在LPC824-Lite上,對(duì)板上的W25Q32BV的操作,下面先抄錄這個(gè)存儲(chǔ)器芯片的部分命令格式,方便例程的理解。以下例程會(huì)用到表中帶陰影的命令。