SPI 子系統(tǒng)之SPI spec
1.SPI hardware
SPI:Serial Perripheral Interface,串行外圍設(shè)備接口,由 Motorola 公司提出,是一種高速、全雙工、同步通信總線。SPI 以主從方式工作,通常是有一個主設(shè)備和一個或多個從設(shè)備,無應(yīng)答機(jī)制。
本文我們講解標(biāo)準(zhǔn)的 4 線 SPI,四根線如下:
①CS/SS,Slave Select/Chip Select,片選信號線,用于選擇需要進(jìn)行通信的從設(shè)備。
②SCK,Serial Clock,串行時鐘,和 I2C 的 SCL 一樣,為 SPI 通信提供時鐘。
③MOSI/SDO,Master Out Slave In/Serial Data Output,主輸出從輸入。
④MISO/SDI,Master In Slave Out/Serial Data Input,主輸入從輸出。

2.SPI 四種工作模式
SPI 有四種工作模式,通過時鐘極性(CPOL)和時鐘相位(CPHA)的搭配來得到四種工作模式:
①、CPOL=0,串行時鐘空閑狀態(tài)為低電平。
②、CPOL=1,串行時鐘空閑狀態(tài)為高電平。
③、CPHA=0,串行時鐘的第一個跳變沿(上升沿或下降沿)采集數(shù)據(jù)。
④、CPHA=1,串行時鐘的第二個跳變沿(上升沿或下降沿)采集數(shù)據(jù)。

示例波形圖如下:

SPI 是全雙工的,所以讀寫時序可以一起完成。
3.SPI 傳輸機(jī)制

從圖可以看出,主機(jī)和從機(jī)都有一個串行移位寄存器,主機(jī)通過向它的 SPI 串行寄存器寫入一個字節(jié)來發(fā)起一次傳輸。寄存器通過 MOSI 信號線將字節(jié)傳送給從機(jī),從機(jī)也將自己的移位寄存器中的內(nèi)容通過 MISO 信號線返回給主機(jī)。這樣,兩個移位寄存器中的內(nèi)容就被交換。
外設(shè)的寫操作和讀操作是同步完成的。如果只進(jìn)行寫操作,主機(jī)只需忽略接收到的字節(jié);反之,若主機(jī)要讀取從機(jī)的一個字節(jié),就必須發(fā)送一個空字節(jié)來引發(fā)從機(jī)的傳輸。



雖然 SPI 四線制支持讀寫同時進(jìn)行,但實(shí)際上我們很多時候并不需要又讀又寫,見以下兩種情況(參考 BMA223 數(shù)據(jù)手冊):
注意:如下三幅圖示均為 CPOL=1,CPHA=1
(1)主機(jī)向從機(jī)寫數(shù)據(jù)

主機(jī)發(fā)送先發(fā)送 8 bits,第一個 bit 為 0 代表這次主機(jī)是想寫數(shù)據(jù)到從機(jī),AD6~AD0 表示要寫的寄存器地址。然后,主機(jī)就會一直寫下去。在這期間 SDO 一直沒用,一直是高阻態(tài),算是一直讀到1。
(2)主機(jī)從從機(jī)讀數(shù)據(jù)

這種情況下,主機(jī)先發(fā)送 8 bits,第一位為 1 代表這次是讀,然后 AD6 ~ AD0 是想要讀的寄存器地址,然后 SDO 開始返回數(shù)據(jù)。
4.SPI timing diagram

Tcsb_setup:建立時間
Tcsb_hold:保持時間
tsckl:低電平時間
tsckh:高電平時間
SCK period :Tsckl + tsckh
一般情況下 Tsckl = tsckh
注意:真實(shí)的波形圖如上,高低電平并不是到達(dá)最高點(diǎn)才算,0.3Vdd 以下為低電平,0.7Vdd 以上為高電平,計算信號時間長度的時候需要注意這個微小的時間,硬件設(shè)計必須注意信號質(zhì)量風(fēng)險,軟件開發(fā)人員也要會看波形圖。
這里的參數(shù),一般 spi 驅(qū)動不需要設(shè)置,但是半導(dǎo)體廠商提供的 spi 控制器驅(qū)動中,可以修改這些參數(shù)。我們寫 SPI 驅(qū)動時候,可以根據(jù)從設(shè)備的要求來修改這些參數(shù)。
5.DMA 與 FIFO
不同平臺對于 SPI FIFO 和 DMA 的 buffer size 設(shè)置不同:

傳輸 32bytes 以下使用 FIFO,傳輸 32bytes 以上使用 DMA。
DMA 可以自動發(fā)起多次傳輸,一次最大 256K 。
6.I2C 與 SPI 對比
功能 | I2C | SPI |
線數(shù) | 2(SDA,SCL) | 4(MOSI,MISO,SCLK,CS) |
主機(jī)數(shù)量 | >=1 | ==1 |
類型 | 半雙工 | 全雙工 |
回應(yīng)機(jī)制 | yes | no |
速度 | <=3.4Mbps | high |
應(yīng)用 | 重要數(shù)據(jù) | 大量數(shù)據(jù) |
流控 | yes | no |
設(shè)備地址 | yes | no |
常規(guī)用途 | 命令 | 數(shù)據(jù) |
I2C 和 SPI 的速率如下:
I2C模式 | 速度 |
標(biāo)準(zhǔn) | 100KHz |
快速 | 400KHz |
快速+ | 1MHz |
高速 | 3.4MHz |
SPI 速率:幾十 MHz 甚至上百 MHz,速度取決于 CPU 的 SPI 控制器和時鐘 clock
STM32F103 的 SPI 最高支持 18MHz,imx6ull 的 SPI 最高支持 52MHz,其他芯片一般用不到更高的,因?yàn)樗俣仍娇觳ㄐ钨|(zhì)量越不好,越容易出問題。
具體采用多大速率還和外設(shè)有關(guān),比如 EEPROM 的 W25Q128 的 SPI 最高支持 80MHz,ICM20608 傳感器的 SPI 最高支持8MHz。一般用在 flash 上的速度會較快。
7.擴(kuò)展
SPI 協(xié)議其實(shí)是包括:Standard SPI、Dual SPI 和 Queued SPI 三種協(xié)議接口。
Dual SPI 還是四線制,只是傳輸線可以變?yōu)橥较颍俣仁?Standard SPI 的兩倍。
Queued SPI 是六線制,多了兩根數(shù)據(jù)線,傳輸速度是 Standard SPI 的四倍。
































