電子通信的SPI通信協(xié)議的基礎
關注、星標公眾號,直達精彩內(nèi)容
文章來源:https://www.circuitbasics.com/basics-of-the-spi-communication-protocol/
整理:技術(shù)讓夢想更偉大 |?李肖遙
SPI,I2C和UART
?



SPI簡介
1、SPI特點
(1)采用主-從模式(Master-Slave) 的控制方式?
(2)采用同步方式(Synchronous)傳輸數(shù)據(jù)
(3)數(shù)據(jù)交換(Data Exchanges)
(4)SPI有四種傳輸模式

(5)SPI只有主模式和從模式之分。
(1)概述

SSPSR, Synchronous Serial Port Register, 泛指 SPI 設備里面的移位寄存器(Shift Regitser), 它的作用是根據(jù)設置好的數(shù)據(jù)位寬(bit-width) 把數(shù)據(jù)移入或者移出 SSPBUF;
Controller, 泛指 SPI 設備里面的控制寄存器, 可以通過配置它們來設置 SPI 總線的傳輸模式。
通常情況下, 我們只需要對上圖所描述的四個管腳(pin) 進行編程即可控制整個 SPI 設備之間的數(shù)據(jù)通信:
SCK, Serial Clock, 主要的作用是 Master 設備往 Slave 設備傳輸時鐘信號, 控制數(shù)據(jù)交換的時機以及速率;
SDO/MOSI, Serial Data Output/Master Out Slave In, 在 Master 上面也被稱為 Tx-Channel, 作為數(shù)據(jù)的出口, 主要用于 SPI 設備發(fā)送數(shù)據(jù);
SPI 設備在進行通信的過程中, Master 設備和 Slave 設備之間會產(chǎn)生一個數(shù)據(jù)鏈路回環(huán)(Data Loop), 就像上圖所畫的那樣, 通過 SDO 和 SDI 管腳, SSPSR 控制數(shù)據(jù)移入移出 SSPBUF, Controller 確定 SPI 總線的通信模式, SCK 傳輸時鐘信號。
(2) Timing

首先, 在這里解釋一下相位和極性的概念
(1) CKPOL (Clock Polarity) = CPOL = POL = Polarity = (時鐘)極性
(2) CKPHA (Clock Phase) = CPHA = PHA = Phase = (時鐘)相位
(3) SCK=SCLK=SPI的時鐘
(4) Edge=邊沿,即時鐘電平變化的時刻,即上升沿(rising edge)或者下降沿(falling edge)
對于一個時鐘周期內(nèi),有兩個edge,分別稱為:
Leading edge=前一個邊沿=第一個邊沿,對于開始電壓是1,那么就是1變成0的時候,對于開始電壓是0,那么就是0變成1的時候;
Trailing edge=后一個邊沿=第二個邊沿,對于開始電壓是1,那么就是0變成1的時候(即在第一次1變成0之后,才可能有后面的0變成1),對于開始電壓是0,那么就是1變成0的時候;
b,SPI的相位和極性
Mode 0 CPOL=0, CPHA=0
Mode 1 CPOL=0, CPHA=1
Mode 2 CPOL=1, CPHA=0
Mode 3 CPOL=1, CPHA=1

c,CPOL極性
先說英文,其精簡解釋為:Clock Polarity = IDLE state of SCK。
再用中文詳解:
SPI的CPOL,表示當SCLK空閑idle的時候,其電平的值是低電平0還是高電平1:
CPOL=0,時鐘空閑idle時候的電平是低電平,所以當SCLK有效的時候,就是高電平,就是所謂的active-high;
CPOL=1,時鐘空閑idle時候的電平是高電平,所以當SCLK有效的時候,就是低電平,就是所謂的active-low;
d,CPHA相位
對于:
CPHA=0,表示第一個邊沿:
對于CPOL=0,idle時候的是低電平,第一個邊沿就是從低變到高,所以是上升沿;
對于CPOL=1,idle時候的是高電平,第一個邊沿就是從高變到低,所以是下降沿;
CPHA=1,表示第二個邊沿:
對于CPOL=0,idle時候的是低電平,第二個邊沿就是從高變到低,所以是下降沿;
對于CPOL=1,idle時候的是高電平,第一個邊沿就是從低變到高,所以是上升沿;
還是上圖大家更容易看懂

e,軟件中如何設置SPI的極性和相位
而設置SPI的模式,是從設備的模式,決定了主設備的模式。
所以要先去搞懂從設備的SPI是何種模式,然后再將主設備的SPI的模式,設置和從設備相同的模式,即可正常通訊。
對于從設備的SPI是什么模式,有兩種:
固定的,有SPI從設備硬件決定的
關于SPI從設備,在空閑的時候,是高電平還是低電平,即決定了CPOL是0還是1;
然后再找到關于設備是在上升沿還是下降沿去采樣數(shù)據(jù),這樣就是,在定了CPOL的值的前提下,對應著可以推算出CPHA是0還是1了。
可配置的,由軟件自己設定
然后知道了從設備的模式后,再去將SPI主設備的模式,設置為和從設備模式一樣,即可。
對于如何配置SPI的CPOL和CPHA的話,不多細說,多數(shù)都是直接去寫對應的SPI控制器中對應寄存器中的CPOL和CPHA那兩位,寫0或?qū)?即可。

Bus-Width 的作用是指定地址總線到 Master 設備之間數(shù)據(jù)傳輸?shù)膯挝?
例如, 我們想要往 Master 設備里面的 SSPBUF 寫入 16 Byte 大小的數(shù)據(jù): 首先, 給 Master 設備的配置寄存器設置 Bus-Width 為 Byte; 然后往 Master 設備的 Tx-Data 移位寄存器在地址總線的入口寫入數(shù)據(jù), 每次寫入 1 Byte 大小的數(shù)據(jù)(使用 writeb 函數(shù)); 寫完 1 Byte 數(shù)據(jù)之后, Master 設備里面的 Tx-Data 移位寄存器會自動把從地址總線傳來的1 Byte 數(shù)據(jù)移入 SSPBUF 里; 上述動作一共需要重復執(zhí)行 16 次.
Channel-Width 的作用是指定 Master 設備與 Slave 設備之間數(shù)據(jù)傳輸?shù)膯挝? 與 Bus-Width 相似, Master 設備內(nèi)部的移位寄存器會依據(jù) Channel-Width 自動地把數(shù)據(jù)從 Master-SSPBUF 里通過 Master-SDO 管腳搬運到 Slave 設備里的 Slave-SDI 引腳, Slave-SSPSR 再把每次接收的數(shù)據(jù)移入 Slave-SSPBUF里.通常情況下, Bus-Width 總是會大于或等于 Channel-Width, 這樣能保證不會出現(xiàn)因 Master 與 Slave 之間數(shù)據(jù)交換的頻率比地址總線與 Master 之間的數(shù)據(jù)交換頻率要快, 導致 SSPBUF 里面存放的數(shù)據(jù)為無效數(shù)據(jù)這樣的情況.
(4) SSPBUF

例如, 在發(fā)送數(shù)據(jù)之前, 我們應該先往 Master 的 Tx-Data 寄存器寫入將要發(fā)送出去的數(shù)據(jù), 這些數(shù)據(jù)會被 Master-SSPSR 移位寄存器根據(jù) Bus-Width 自動移入 Master-SSPBUF 里, 然后這些數(shù)據(jù)又會被 Master-SSPSR 根據(jù) Channel-Width 從 Master-SSPBUF 中移出, 通過 Master-SDO 管腳傳給 Slave-SDI 管腳, Slave-SSPSR 則把從 Slave-SDI 接收到的數(shù)據(jù)移入 Slave-SSPBUF 里. 與此同時, Slave-SSPBUF 里面的數(shù)據(jù)根據(jù)每次接收數(shù)據(jù)的大小(Channel-Width), 通過 Slave-SDO 發(fā)往 Master-SDI, Master-SSPSR 再把從 Master-SDI 接收的數(shù)據(jù)移入 Master-SSPBUF.在單次數(shù)據(jù)傳輸完成之后, 用戶程序可以通過從 Master 設備的 Rx-Data 寄存器讀取 Master 設備數(shù)據(jù)交換得到的數(shù)據(jù).
(5) Controller
Master 設備的片選操作必須由程序所實現(xiàn). 例如: 由程序把 SS/CS 管腳的時鐘信號拉低電平, 完成 SPI 設備數(shù)據(jù)通信的前期工作; 當程序想讓 SPI 設備結(jié)束數(shù)據(jù)通信時, 再把 SS/CS 管腳上的時鐘信號拉高電平.
SPI的優(yōu)點和缺點
???????????????? ?END ?????????????????
關注我的微信公眾號,回復“加群”按規(guī)則加入技術(shù)交流群。
點擊“閱讀原文”查看更多分享,歡迎點分享、收藏、點贊、在看。
評論
圖片
表情
