1.SPI簡介
SPI(Serial Perripheral Interface, 串行外圍設(shè)備接口)是 Motorola 公司推出的一種同步串行接口技術(shù)。SPI 總線在物理上是通過接在外圍設(shè)備微控制器(PICmicro) 上面的微處理控制單元 (MCU) 上叫作同步串行端口(Synchronous Serial Port) 的模塊(Module)來實現(xiàn)的, 它允許 MCU 以全雙工的同步串行方式, 與各種外圍設(shè)備進(jìn)行高速數(shù)據(jù)通信。
SPI接口主要應(yīng)用在EEPROM、FLASH、實時時鐘,AD轉(zhuǎn)換器以及數(shù)字信號處理器和數(shù)字信號解碼器之間。SPI是一種高速的、全雙工、同步的通信總線,在芯片上只占用四根線(CS、MOSI、MISO、SCK),極大的節(jié)約了芯片的引腳。
優(yōu)點 | 缺點 |
支持全雙工,push-pull的驅(qū)動性能相比open-drain信號完整性更好; | 相比IIC多兩根線 |
支持高速(100MHz以上) | 沒有尋址機制,只能靠片選選擇不同設(shè)備 |
協(xié)議支持字長不限于8bits,可根據(jù)應(yīng)用特點靈活選擇消息字長 | 沒有從設(shè)備接受ACK,主設(shè)備對于發(fā)送成功與否不得而知 |
硬件連接簡單 | 典型應(yīng)用只支持單主控 |
相比RS232 RS485和CAN總線,SPI傳輸距離短 |
2.SPI接口
?4線SPI器件有四個信號:
- 時鐘(SPI CLK, SCLK)
- 片選(CS)
- 主機輸出、從機輸入(MOSI)
- 主機輸入、從機輸出(MISO)
產(chǎn)生時鐘信號的器件稱為主機。主機和從機之間傳輸?shù)臄?shù)據(jù)與主機產(chǎn)生的時鐘同步。同I2C接口相比, SPI器件支持更高的時鐘頻率。
SPI接口只能有一個主機,但可以有一個或多個從機。
上圖顯示了主機和從機之間的SPI連接。來自主機的片選信號用于選擇從機。這通常是一個低電平有效信號,拉高時從機與SPI總線斷開連接。當(dāng)使用多個從機時,主機需要為每個從機提供單獨的片選信號。本文中的片選信號始終是低電平有效信號。
MOSI和MISO是數(shù)據(jù)線。 MOSI將數(shù)據(jù)從主機發(fā)送到從機, MISO將數(shù)據(jù)從從機發(fā)送到主機。
在常規(guī)模式下,主機需要為每個從機提供單獨的片選信號。一旦主機使能(拉低)片選信號, MOSI/MISO線上的時鐘和數(shù)據(jù)便可用于所選的從機。如果使能多個片選信號,則MISO線上的數(shù)據(jù)會被破壞,因為主機無法識別哪個從機正在傳輸數(shù)據(jù)。
從圖可以看出,隨著從機數(shù)量的增加,來自主機的片選線的數(shù)量也增加。這會快速增加主機需要提供的輸入和輸出數(shù)量,并限制可以使用的從機數(shù)量??梢允褂闷渌夹g(shù)來增加常規(guī)模式下的從機數(shù)量,例如使用多路復(fù)用器產(chǎn)生片選信號。
?在菊花鏈模式下,所有從機的片選信號連接在一起,數(shù)據(jù)從一個從機傳播到下一個從機。在此配置中,所有從機同時接收同一SPI時鐘。來自主機的數(shù)據(jù)直接送到第一個從機,該從機將數(shù)據(jù)提供給下一個從機,依此類推。
使用該方法時,由于數(shù)據(jù)是從一個從機傳播到下一個從機,所以傳輸數(shù)據(jù)所需的時鐘周期數(shù)與菊花鏈中的從機位置成比例。例如在圖7所示的8位系統(tǒng)中,為使第3個從機能夠獲得數(shù)據(jù),需要24個時鐘脈沖,而常規(guī)SPI模式下只需8個時鐘脈沖。下圖顯示了時鐘周期和通過菊花鏈的數(shù)據(jù)傳播。并非所有SPI器件都支持菊花鏈模式。
3.SPI通信
要開始SPI通信,主機必須發(fā)送時鐘信號,并通過使能CS信號選擇從機。片選通常是低電平有效信號。因此,主機必須在該信號上發(fā)送邏輯0以選擇從機。 SPI是全雙工接口,主機和從機可以分別通過MOSI和MISO線路同時發(fā)送數(shù)據(jù)。在SPI通信期間,數(shù)據(jù)的發(fā)送(串行移出到MOSI/SDO總線上)和接收(采樣或讀入總線(MISO/SDI)上的數(shù)據(jù))同時進(jìn)行。串行時鐘沿同步數(shù)據(jù)的移位和采樣。 SPI接口允許用戶靈活選擇時鐘的上升沿或下降沿來采樣和/或移位數(shù)據(jù)。
SPI 設(shè)備間的數(shù)據(jù)傳輸之所以又被稱為數(shù)據(jù)交換,是因為 SPI 協(xié)議規(guī)定一個 SPI 設(shè)備不能在數(shù)據(jù)通信過程中僅僅只充當(dāng)一個 “發(fā)送者(Transmitter)” 或者 “接收者(Receiver)”。 在每個 Clock 周期內(nèi), SPI 設(shè)備都會發(fā)送并接收一個 bit 大小的數(shù)據(jù), 相當(dāng)于該設(shè)備有一個 bit 大小的數(shù)據(jù)被交換了。
?SPI主機和從機都有一個串行移位寄存器,主機通過向它的SPI串行寄存器寫入一個字節(jié)來發(fā)起一次傳輸。
- 拉低對應(yīng)CS信號線,表示與該設(shè)備進(jìn)行通信
- 主機通過發(fā)送SCK時鐘信號,來告訴從機寫數(shù)據(jù)或者讀數(shù)據(jù)。這里要注意,SCK時鐘信號可能是低電平有效,也可能是高電平有效,因為SPI有四種模式,這個我們在下面會介紹
- 主機(Master)將要發(fā)送的數(shù)據(jù)寫到發(fā)送數(shù)據(jù)緩存區(qū)(Menory),緩存區(qū)經(jīng)過移位寄存器(0~7),串行移位寄存器通過MOSI信號線將字節(jié)一位一位的移出去傳送給從機,同時MISO接口接收到的數(shù)據(jù)經(jīng)過移位寄存器一位一位的移到接收緩存區(qū)。
- 從機(Slave)也將自己的串行移位寄存器(0~7)中的內(nèi)容通過MISO信號線返回給主機。同時通過MOSI信號線接收主機發(fā)送的數(shù)據(jù),這樣兩個移位寄存器中的內(nèi)容就被交換。
SPI只有主模式和從模式之分,沒有讀和寫的說法,外設(shè)的寫操作和讀操作是同步完成的。如果只進(jìn)行寫操作,主機只需忽略接收到的字節(jié);反之,若主機要讀取從機的一個字節(jié),就必須發(fā)送一個空字節(jié)來引發(fā)從機的傳輸。也就是說,你發(fā)一個數(shù)據(jù)必然會收到一個數(shù)據(jù);你要收一個數(shù)據(jù)必須也要先發(fā)一個數(shù)據(jù)。
4.SPI時鐘模式
時鐘極性和時鐘相位:在SPI中,主機可以通過寄存器配置選擇SCK的時鐘極性和時鐘相位。
在空閑狀態(tài)期間, CPOL位設(shè)置時鐘信號的極性??臻e狀態(tài)是指傳輸開始時CS為高電平且在向低電平轉(zhuǎn)變的期間以及傳輸結(jié)束時CS為低電平且在向高電平轉(zhuǎn)變的期間。 CPHA位選擇時鐘相位。根據(jù)CPHA位的狀態(tài),使用時鐘上升沿或下降沿來采樣和/或移位數(shù)據(jù)。主機必須根據(jù)從機的要求選擇時鐘極性和時鐘相位。
根據(jù)CPOL和CPHA位的選擇,有四種SPI模式可用。不同的從設(shè)備可能在出廠是就是配置為某種模式,這是不能改變的;但我們的通信雙方必須是工作在同一模式下,所以我們可以對我們的主設(shè)備的SPI模式進(jìn)行配置,通過CPOL(時鐘極性)和CPHA(時鐘相位)來控制我們主設(shè)備的通信模式,具體如下:
1. 時鐘極性(CPOL)定義了時鐘空閑狀態(tài)電平:
CPOL=0,表示當(dāng)SCLK=0時處于空閑態(tài),所以有效狀態(tài)就是SCLK處于高電平時
CPOL=1,表示當(dāng)SCLK=1時處于空閑態(tài),所以有效狀態(tài)就是SCLK處于低電平時
2. 時鐘相位(CPHA)定義數(shù)據(jù)的采集時間。
CPHA=0,在時鐘的第一個跳變沿(上升沿或下降沿)進(jìn)行數(shù)據(jù)采樣,在第2個邊沿發(fā)送數(shù)據(jù)
CPHA=1,在時鐘的第二個跳變沿(上升沿或下降沿)進(jìn)行數(shù)據(jù)采樣,在第1個邊沿發(fā)送數(shù)據(jù)
?
?下圖顯示了四種SPI模式下的通信示例。在這些示例中,數(shù)據(jù)顯示在MOSI和MISO線上。傳輸?shù)拈_始和結(jié)束用綠色虛線表示,采樣邊沿用橙色虛線表示,移位邊沿用藍(lán)色虛線表示。請注意,這些圖形僅供參考。要成功進(jìn)行SPI通信,用戶須參閱產(chǎn)品數(shù)據(jù)手冊并確保滿足器件的時序規(guī)格。
?SPI模式0,CPOL = 0,CPHA = 0: CLK空閑狀態(tài) = 低電平,數(shù)據(jù)在上升沿采樣,在下降沿移出
SPI模式1,CPOL = 0,CPHA = 1:CLK空閑狀態(tài)=低電平,數(shù)據(jù)在下降沿采樣,在上升沿移出?
?SPI模式2,CPOL = 1,CPHA = 1:CLK空閑狀態(tài)=高電平,數(shù)據(jù)在下降沿采樣,并在上升沿移出
?SPI模式3,CPOL = 1,CPHA = 0:CLK空閑狀態(tài)=高電平,數(shù)據(jù)在上升沿采樣,并在下降沿移出
5.SPI工作模式
SPI工作在3中模式下,分別是運行、等待和停止。
運行模式(Run Mode):這是基本的操作模式
等待模式(Wait Mode):SPI工作在等待模式是一種可配置的低功耗模式,可以通過SPICR2寄存器的SPISWAI位進(jìn)行控制。在等待模式下,如果SPISWAI位清0,SPI操作類似于運行模式。如果SPISWAI位置1,SPI進(jìn)入低功耗狀態(tài),并且SPI時鐘將關(guān)閉。如果SPI配置為主機,所有的傳輸將停止,但是會在CPU進(jìn)入運行模式后重新開始。如果SPI配置為從機,會繼續(xù)接收和傳輸一個字節(jié),這樣就保證從機與主機同步。
停止模式(Stop Mode):為了降低功耗,SPI在停止模式是不活躍的。如果SPI配置為主機,正在進(jìn)行的傳輸會停止,但是在CPU進(jìn)入運行模式后會重新開始。如果SPI配置為從機,會繼續(xù)接受和發(fā)送一個字節(jié),這樣就保證了從機與主機同步。
6.SPI讀寫操作
- 標(biāo)準(zhǔn)SPI讀寫為例
- ?片選---讀指令---地址---數(shù)據(jù)讀出?
- 雙路IO Dual I/O Fast Read Sequence Diagram??
- ?四路IO Quad I/O Fast Read Sequence Diagram?
7.SPI寄存器
Motorola定義的SPI寄存器包括:
SPI Control Register 1 (SPICR1) ? ?控制寄存器1
SPI Control Register 2 (SPICR2) ? ?控制寄存器2
SPI Baud Rate Register (SPIBR) ? ?波特率寄存器
SPI Status Register (SPISR) ? ? ? ? ? ?狀態(tài)寄存器 ?(只讀 ? 其余均可讀可寫)
SPI Data Register (SPIDR) ? ? ? ? ? ? ?數(shù)據(jù)寄存器
通過往寄存器中寫入不同的值,設(shè)置SPI模塊的不同屬性。
1. 控制寄存器1 SPICR1
SPIE?— SPI中斷啟用位
1 = SPI中斷已啟用
0 = SPI中斷已禁用
SPE?— SPI系統(tǒng)啟用位
1 = 啟用SPI,端口引腳專用于SPI功能
0 = 禁用SPI(降低功耗)
SPTIE?— SPI傳輸中斷啟用
1 = SPTEF中斷已啟用
0 = SPTEF中斷已禁用
MSTR?— SPI主/從模式選擇位
1 = SPI處于主模式
0 = SPI處于從屬模式
CPOL?— SPI時鐘極性位
1 = 已選擇低電平時鐘。在空閑狀態(tài)下,SCK高.
0 = 已選擇活動的高時鐘。在空閑狀態(tài)下,SCK低A.
CPHA?— SPI時鐘相位位
1 = 數(shù)據(jù)采樣發(fā)生在SCK時鐘的偶數(shù)邊緣(2、4、6、…、16)
0 = 數(shù)據(jù)采樣發(fā)生在SCK時鐘的奇數(shù)邊緣(1、3、5、…、15)
SSOE?— 從屬選擇輸出啟用
SSOE 用于主設(shè)備設(shè)置SS管腳功能,它和MODFEN組合決定主設(shè)備SS管腳功能。如表1所示其功能組合:
LSBFE?— LSB首次啟用
1 = 數(shù)據(jù)首先傳輸最低有效位。
0 = 首先傳輸數(shù)據(jù)的最高有效位。
2. 控制寄存器2 SPICR2
MODFEN?— 模式故障使能位
1 = 帶MODF功能的SS端口引腳。
0 = SPI未使用SS端口引腳。
BIDIROE?— 雙向操作模式下的輸出啟用
控制雙向模式(Bidirectional Mode)下主設(shè)備的MOSI和從設(shè)備MISO的輸出緩沖器
1 = 輸出緩沖區(qū)已啟用
0 = 輸出緩沖區(qū)已禁用
SPISWAI?— SPI停止在等待模式位
1 = 在等待模式下停止SPI時鐘生成
0 = SPI時鐘在等待模式下正常工作
SPC0?— 串行引腳控制位0
控制(單個)數(shù)據(jù)管腳是否配置為雙向模式,與BIDIROE組合控制(單個)數(shù)據(jù)管腳同時支持收發(fā)功能(如下表2)
3. 波特率寄存器 SPIBR
SPPR2–SPPR0?— 波特率預(yù)選位
SPR2–SPR0?— 波特率選擇位
以上五個寄存器通過下面公式?jīng)Q定波特率除數(shù)因子(BaudRateDivisor),進(jìn)而決定SCK時鐘頻率。
除數(shù)因子:(通過五個參數(shù)計算出來的除數(shù)因子不僅包括2^N,還包括4/6/10等總計64個組合)
計算波特率:
舉例:SPPR[2:0]設(shè)為101,SPR[2:0]設(shè)為000,計算得除數(shù)因子(5+1) * (2^1) =?12。如果系統(tǒng)時鐘速率為25MHz,則SCK時鐘速率 = 25MHz/12?= 2.0833MHz.
4. 狀態(tài)寄存器 SPISR
SPISR表征SPI傳輸狀態(tài),只可讀,不可寫。
SPIF?— SPIF中斷標(biāo)志
數(shù)據(jù)byte寫入SPI數(shù)據(jù)寄存器后,此位被置為1。讀取數(shù)據(jù)寄存器后,此位清零。
1 = 新數(shù)據(jù)復(fù)制到SPIDR
0 = 傳輸尚未完成
SPTEF?— SPI 傳輸空中斷標(biāo)志
1 = 表示發(fā)送數(shù)據(jù)寄存器為空,可以接收待發(fā)送數(shù)據(jù)
0 = 此時忽略任何寫入數(shù)據(jù)寄存器的指令
MODF?— 模式故障標(biāo)志
如表1,錯誤檢測功能使能后,MODF表示檢測到SPI模式錯誤。
1 = 出現(xiàn)模式故障。
0 = 未發(fā)生模式故障
根據(jù)Motorola的定義,SPI僅提供一種錯誤——即模式錯誤(Mode Fault Error)——的檢測機制,通過SS管腳狀態(tài)判斷SPI總線上是否存在兩個及以上的設(shè)備同時驅(qū)動SCK和MOSI。模式錯誤檢測僅適用于主設(shè)備(前提是在寄存器中激活此功能)。對于從設(shè)備,SS總是作為片選信號的。在發(fā)生模式錯誤后(MODF = 1),系統(tǒng)通過寫入控制寄存器SPICR1(使設(shè)備由Master改為Slave模式,SCK、MISO和MOSI表現(xiàn)為高阻態(tài)以避免與總線上其它驅(qū)動設(shè)備沖突),隨后系統(tǒng)自動將此bit置為零(MODF = 0)。
5. 數(shù)據(jù)寄存器 SPIDR
SPIDR作為SPI收發(fā)兩用的寄存器,數(shù)據(jù)在寫入SPIDR后進(jìn)入待傳輸隊列,隊列中的數(shù)據(jù)字節(jié)在前面數(shù)據(jù)傳輸結(jié)束后立即進(jìn)行傳輸。狀態(tài)寄存器SPISR的SPTEF位表示數(shù)據(jù)寄存器可以接收新數(shù)據(jù)。數(shù)據(jù)寄存器接收數(shù)據(jù)完畢后將SPIF置為1。
如果SPIF已經(jīng)置為1,但服務(wù)并未運行(not serviced),則下一個(第二個)接收的數(shù)據(jù)字節(jié)將暫存在移位寄存器中直到下次傳輸。數(shù)據(jù)寄存器中的數(shù)據(jù)字節(jié)不變。
如果SPIF已經(jīng)置為1,并且移位寄存器中已經(jīng)暫存數(shù)據(jù)(即第二個數(shù)據(jù)字節(jié)),并且SPIF服務(wù)在第三個數(shù)據(jù)字節(jié)傳輸前完成,則移位寄存器中的數(shù)據(jù)(即第二個數(shù)據(jù)字節(jié) )正常寫入數(shù)據(jù)寄存器,SPIF仍保持置位狀態(tài)(高),如圖所示;
如果SPIF已經(jīng)置為1,并且移位寄存器中已經(jīng)暫存數(shù)據(jù)(即第二個數(shù)據(jù)字節(jié)),并且SPIF服務(wù)在第三個數(shù)據(jù)字節(jié)傳輸后完成,則移位寄存器中的數(shù)據(jù)(即第二個數(shù)據(jù)字節(jié) )遭破壞,不能正常寫入到數(shù)據(jù)寄存器,SPIF仍保持置位狀態(tài)(高),如圖所示 。
文章來源:http://www.zghlxwxcb.cn/news/detail-484332.html
【引用】文章來源地址http://www.zghlxwxcb.cn/news/detail-484332.html
- SPI原理超詳細(xì)講解---值得一看
- SPI接口詳細(xì)介紹_千里沽山的博客
- FPGA常用通信協(xié)議---SPI_工作使我快樂的博客??????
- FPGA(三)——基于FPGA的SPI通訊協(xié)議實現(xiàn)_Cilinx的博客??????
- 三大通信協(xié)議(3)SPI——寄存器配置_刻蓇銘鑫的博客???????
- 串行通訊SPI總線 - 知乎 (zhihu.com)
到了這里,關(guān)于【FPGA】SPI協(xié)議的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!