1. 程式人生 > >【原創】【SPI】SPI通訊協議介紹

【原創】【SPI】SPI通訊協議介紹

1、這是個什麼玩意

接上篇接著介紹,協議主要就是保證雙方能夠正常的通訊並理解對方的“話”。而本篇介紹的這個SPI協議是為了保證SPI介面的兩頭雙方能夠正常通訊。具體的說,就是針對那幾根物理線如何操作,物理線無非就是涉及高低電平,兩條(及兩條以上的)線之間需要配合的時序,具體看下面。

2、有毛用啊

不多說了,如上。

3、怎麼用啊

SPI有四種工作模式,取決於兩個引數:(這兩個引數其實就是控制了CLK這一根線,SPI通訊不像UART或IIC那樣有專門的通訊週期,有專門的通訊起始訊號和結束訊號。所以SPI協議能夠通過控制時鐘訊號線在沒有資料交流的時候保持的狀態,要麼是高電平,要麼是低電平)

1、 CPOL,clock polarity,譯作時鐘極性。
2、 CPHA,clock phase,譯作時鐘相位。CPOL具體說明:CPOL用於定義時鐘訊號在空閒狀態下處於高電平還是低電平,為1代表高電平,0為低電平。CPHA具體說明:首先,在同步介面中,肯定存在一個介面時鐘,用來同步取樣介面上資料的。CPHA就是用來定義資料取樣在第幾個邊沿的,資料的取樣時刻。為1代表第二個邊沿取樣,為0代表第一個邊沿取樣。以上兩個引數,總共有四種組合:CPOL=0,CPHA=0:此時空閒態時,SCLK處於低電平,資料取樣是在第1個邊沿,也就是
SCLK由低電平到高電平的跳變,所以資料取樣是在上升沿,資料傳送是在下降沿。
CPOL=0,CPHA=1:此時空閒態時,SCLK處於低電平,資料傳送是在第1個邊沿,也就是
SCLK由低電平到高電平的跳變,所以資料取樣是在下降沿,資料傳送是在上升沿。
CPOL=1,CPHA=0:此時空閒態時,SCLK處於高電平,資料採集是在第1個邊沿,也就是
SCLK由高電平到低電平的跳變,所以資料採集是在下降沿,資料傳送是在上升沿。
CPOL=1,CPHA=1:此時空閒態時,SCLK處於高電平,資料傳送是在第1個邊沿,也就是
SCLK由高電平到低電平的跳變,所以資料採集是在上升沿,資料傳送是在下降沿。

之前說過,由於SPI沒有一個統一的規範,所以在時序上描述存在一定的差異,具體以datasheet為準。

還有就是這四種模式的優缺點目前我還未知,請大牛詳解。

STM32系列晶片的很多SPI介面都是和GPIO共用,SPI的初始化分為2大塊,就是SPI所使用的I/O口的初始化和SPI功能的初始化。對於SPI同步串列埠要用到的引腳,根據資料的方向,要設定GPIO_Mode_IN_FLOATING或者GPIO_Mode_AF_PP複用推免輸出。其他的和GPIO引腳設定一樣。

2.設定spi的工作模式通過 SPI1_CR1 來設定,設定SPI1主機模式,設定資料格式8位,然後通過 CPOL 和 CPHA 位來設定 SCK時鐘極性及取樣方式。並設定 SPI1 的時鐘頻率(最大18Mhz),以及資料的格式(MSB 在前還是 LSB在前)。

3.使能SPI.

具體SPI主要配置項如下:

SPI_Direction:SPI通訊方向,可配置雙線全雙工、雙線只接收、單線只接收、單線只發送模式;
SPI_Mode:SPI的工作模式,即工作在主機模式或從機模式。若工作在從機模式,則SCK訊號由外部提供;
SPI_DataSize:通訊的資料幀大小,可選8位或16位;
SPI_CPOL:時鐘極性,配置空閒狀態時的SCK電平;
SPI_CPHA:時鐘相位,配置資料取樣時刻,可配置在每個時鐘週期的第1個或第2個邊沿進行取樣;
SPI_NSS:配置NSS引腳的使用模式,可配置為硬體模式或軟體模式。軟體模式即是普通的GPIO口,人工拉高或置低其電平;
SPI_BaudRatePrescaler:波特率分頻因子,分頻後的時鐘即為SPI的SCK訊號線的時鐘頻率;
SPI_FirstBit:序列通訊中總會牽扯到MSB(高位)先行還是LSB(低位)先行的問題,可以用這個結構體成員進行配置;
SPI_CRCPolynomial:CRC校驗,若使用CRC,則可計算CRC的值。

四,成為大神的用法

多除錯,多解決問題,推薦部落格http://blog.csdn.net/guomutian911/article/details/72813067,該部落格記錄了一些SPI的問題,在此推薦給大家。通常比較常見的問題是CLK的頻率太快,導致接收資料不對或不完整。主器件時鐘CLK主、從器件時鐘CLK從和同步序列時鐘SCK,其中SCK是對CLK主的分頻,CLK從和CLK主是非同步的。要使SCK無差錯無遺漏地被從器件所檢測到,從器件的時鐘CLK從必須要足夠快。