基礎知識之SPI總線
Warning: file_get_contents(https://www.eetree.cn/wiki/_media/spi_lpc.jpg): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/html/www.edw.com.cn/www/rootapp/controllerssitemanage/ManagecmsController.php on line 2058 Warning: file_get_contents(https://www.eetree.cn/wiki/_media/spi_sensor.jpg): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/html/www.edw.com.cn/www/rootapp/controllerssitemanage/ManagecmsController.php on line 2058 Warning: file_get_contents(https://www.eetree.cn/wiki/_media/spi_fpga.jpg): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/html/www.edw.com.cn/www/rootapp/controllerssitemanage/ManagecmsController.php on line 2058 Warning: file_get_contents(https://www.eetree.cn/wiki/_media/spi_msconnection.jpg): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/html/www.edw.com.cn/www/rootapp/controllerssitemanage/ManagecmsController.php on line 2058 Warning: file_get_contents(https://www.eetree.cn/wiki/_media/300px-spi_three_slaves.svg.png): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/html/www.edw.com.cn/www/rootapp/controllerssitemanage/ManagecmsController.php on line 2058 Warning: file_get_contents(https://www.eetree.cn/wiki/_media/spi_640.gif): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/html/www.edw.com.cn/www/rootapp/controllerssitemanage/ManagecmsController.php on line 2058 Warning: file_get_contents(https://www.eetree.cn/wiki/_media/spi_6402.gif): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/html/www.edw.com.cn/www/rootapp/controllerssitemanage/ManagecmsController.php on line 2058 Warning: file_get_contents(https://www.eetree.cn/wiki/_media/spi_clocking.jpg): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/html/www.edw.com.cn/www/rootapp/controllerssitemanage/ManagecmsController.php on line 2058 Warning: file_get_contents(https://www.eetree.cn/wiki/_media/spi_mms.jpg): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/html/www.edw.com.cn/www/rootapp/controllerssitemanage/ManagecmsController.php on line 2058 Warning: file_get_contents(https://www.eetree.cn/wiki/_media/spi_daisy.jpg): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/html/www.edw.com.cn/www/rootapp/controllerssitemanage/ManagecmsController.php on line 2058 Warning: file_get_contents(https://www.eetree.cn/wiki/_media/400px-spi_timing_diagram2.svg.png): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/html/www.edw.com.cn/www/rootapp/controllerssitemanage/ManagecmsController.php on line 2058
本文引用地址:http://www.ex-cimer.com/article/202404/457234.htmSPI - 同步、全雙工的串行外設接口
SPI(Serial Peripheral Interface - 同步外設接口)總線是一種用于短距離通信(主要是嵌入式系統中)的同步串行通信接口規范,雖然沒有正式的國際標準,但這種接口協議由Motorola發明迄今經過很多廠商的支持,已經成了一種事實標準,被廣泛用于各種MCU處理器中,同傳感器,串行ADC、DAC、存儲器、SD卡以及LCD等進行數據連接。由于沒有統一的國際標準,SPI出現了很多不同的協議選項,例如不同的Word大??;每個設備都有自己的協議定義,包括是否支持命令;有些設備只發送,其它的則只是接收;有的片選是高有效,有的則是低有效;有的協議先發送最低位。
當前的處理器中幾乎都有SPI和I2C和UART接口
數字接口的傳感器也采用SPI和I2C
FPGA也將SPI、I2C硬化在器件內部方便各種外設的連接
主、從器件之間的連接及數據傳輸方式
多個SPI設備可以通過全雙工的模式同單一的Master以主、從結構進行通信。主、設備發起讀、寫,多個從設備通過獨立的片選信號(SS - Slave Select)被尋址。
SPI總線:單主多從連接
有時SPI也被稱為四線串行總線,主要是與3線、2線、1線串行總線進行區分,雖然SPI可以準確地描述為一個同步串行接口,但它與同步串行接口(SSI)協議還是不同的,SSI同樣也是一種4線同步串行通信協議,但SSI采用的是差分信號,且只提供了一個簡單的通信信道。
動畫1顯示數據從器件A移出到器件B,從器件B移出到器件A.
SPI的技術實現
接口信號
工作模式
SPI總線可以工作在一個主設備/一個或多個從設備的模式。 如果只有一個從設備,SS管腳可以直接接地(從設備允許的話),有些從設備需要片選信號的下降沿來啟動傳輸,一個例子就是美信公司的串行ADC MAX1242,通過一個高電平到低電平的轉換標記傳輸的起始。如果有多個從設備,每個從設備需要一個獨立的SS信號連接到主設備。
多數從設備的輸出是三態的,當該從設備沒有被選中的時候它們的MISO信號就為高阻(邏輯上斷開連接)。不具有三態輸出的器件是不能同其它器件共享SPI總線部分的,只能是一個從設備跟主設備相連。
SPI的時鐘采樣
通過多個從片選信號(SSN)配置
在標準的SPI配置中,主設備可以通過使能相應的從設備,即通過將相應設備的從選擇線(SSN或SS)設置為邏輯低電平,通過共享的公共數據線將數據寫入各個從設備或由各個從設備中讀取數據。 應注意不要同時使能多個從設備,因為返回到主設備的數據將在MISO線路之間的驅動器上產生競爭導致無法進行數據的判讀。在某些應用中不需要將數據返回給主設備,在這種情況下,如果主設備想要將相同的數據發送到多個從設備,則可以同時尋址多個從設備。
在多從設備選擇配置中,每個從設備都需要來自主設備的唯一從設備選擇線(SS、SSN或CSn)。如果主設備沒有足夠的I/O引腳用于所需數量的從設備,則使用解碼/解復用器(例如74HC(T)238(3到8線)來實現I/O擴展)。
菊花鏈配置
在這種配置中,數據從一個設備移動到下一個設備, 最終的從設備可以將數據返回給主設備(給FPGA編程的JTAG在給多個器件編程的時候也常用這種方式)。
在菊花鏈配置中,所有從設備共享一條公共的從選擇線(SS)。 數據從主設備傳輸到第一個從設備,然后從第一個從設備傳輸到第二個從設備,依此下去,數據沿著線路級聯,直到系列中的最后一個從設備,最后的一個從設備使用其MISO線路將數據傳送到主設備。
這種配置非常適合于主設備的信號引腳有限的場景。
4種傳輸模式
每次數據傳輸都是先將SSN(有的器件命名為SS,從選擇線)被驅動為邏輯低電平時開始。由時鐘的極性(CPOL)和相位(CPHA)構成了4種不同的數據傳輸模式(0,1,2,3),分別對應四種可能的時鐘配置。
具有非反相時鐘極性(即,當從器件選擇轉換為邏輯低時,時鐘處于邏輯低電平):
使用反相時鐘極性(即,當從器件選擇轉換為邏輯低時,時鐘處于邏輯高電平):
由于主設備一般為可以編程各種模式的控制器/處理器或者可以靈活編程的FPGA,因此在使用SPI連接的時候要認真閱讀自己選用的從設備的工作模式,以便在時序上滿足傳輸的要求。
SPI數據傳輸的主設備端代碼示例
以下是一段主設備工作于CPOL=0、CPHA=0模式時的數據傳輸的代碼,每次傳輸為8位,此示例采用C語言。由于工作于CPOL=0, 在片選被選中之前要把時鐘拉低,片選信號必須使能,也就是說在數據傳輸之前要將外設的片選信號電平變低,并在傳輸結束以后不再“使能”。 多數的外設允許或需要在片選信號選中以后進行多次傳輸,次子程序也許需要被多次調用。
/*
* Simultaneously transmit and receive a byte on the SPI.
*
* Polarity and phase are assumed to be both 0, i.e.:
* - input data is captured on rising edge of SCLK.
* - output data is propagated on falling edge of SCLK.
*
* Returns the received byte.
*/uint8_t SPI_transfer_byte(uint8_t byte_out){
uint8_t byte_in = 0;
uint8_t bit; for (bit = 0x80; bit; bit >>= 1) {
/* Shift-out a bit to the MOSI line */
write_MOSI((byte_out & bit) ? HIGH : LOW); /* Delay for at least the peer's setup time */
delay(SPI_SCLK_LOW_TIME); /* Pull the clock line high */
write_SCLK(HIGH); /* Shift-in a bit from the MISO line */
if (read_MISO() == HIGH)
byte_in |= bit; /* Delay for at least the peer's hold time */
delay(SPI_SCLK_HIGH_TIME); /* Pull the clock line low */
write_SCLK(LOW);
} return byte_in;}
SPI的優點和缺點
優點
缺點
SPI的主要應用
與并行I/O總線相比,SPI能夠大大節省電路板的空間,因此在嵌入式系統中發揮了重要作用,對于大多數片上系統處理器而言都是如此,這些處理器都具有較高端的32位處理器,例如使用ARM、MIPS或PowerPC的處理器以及其它微控制器,如AVR、PIC和MSP430等。 這些芯片通常包括能夠以主模式或從模式運行的SPI控制器,也可以使用SPI接口對系統內可編程AVR控制器(包括空白控制器)進行編程。
基于芯片或FPGA的設計有時使用SPI在內部的組件之間進行通信,即便是片內,其面積的節省也像電路板上一樣非常重要。
全雙工功能使SPI非常簡單、高效、適用于單主/單從機應用。 一些設備使用全雙工模式為數字音頻、數字信號處理或電信信道等應用實現高效、快速的數據流,但大多數現成的芯片都采用半雙工請求/響應協議。
SPI被用來同各種外設通信,例如:
對于高性能系統,FPGA有時使用SPI作為主機的從機接口、作為傳感器的主機、或者如果它們是基于SRAM的,則用于引導的閃存。
雖然SPI總線和JTAG(IEEE 1149.1-2013)協議之間存在一些相似之處,但它們不可互換。 SPI總線用于器件外設的高速、板載初始化,而JTAG協議旨在通過板外控制器(有著比較低精度的信號延遲和偏斜參數)提供對I/O引腳的可靠測試訪問。 JTAG協議不是嚴格意義上的電平敏感接口,它通過降低時鐘速率或改變時鐘的占空比來支持JTAG器件在建立和保持違規的情況下能夠恢復。 因此,JTAG接口不是用來支持極高的數據速率的。
協議分析及調試設備
主適配卡
有許多使用USB的硬件解決方案可以利用運行Linux、Mac或Windows的計算機支持SPI主控和/或從屬功能。其中許多還提供腳本和/或編程功能(Visual Basic,C / C ++,VHDL等)。
SPI主機適配器允許用戶直接從PC在SPI總線上扮演主站的角色。它們用于嵌入式系統、芯片(FPGA/ASIC/SoC)和外設測試、編程和調試。
SPI適配器的關鍵參數包括:串行接口支持的最大頻率、命令到命令延遲以及SPI命令的最大長度。目前市場上可以找到支持高達100MHz串行接口的SPI適配器,幾乎無限制的訪問長度。
SPI協議是事實上的標準,一些SPI主機適配器還能夠支持超越傳統4線SPI的其他協議(例如,支持四SPI協議或其他源自SPI的定制串行協議)。
SPI適配器的示例(制造商按字母順序):
生產商 | SPI Host適配卡 | Host總線 | 支持的總線協議 | 最高頻率 |
---|---|---|---|---|
Byte Paradigm | SPI Storm | USB | SPI, dual/quad, custom | 100 MHz |
Corelis | BusPro-S | USB | SPI, dual/quad | 60 MHz |
HydraBus | HydraBus-HydraFW | USB | SPI | 42 MHz |
Microchip | MCP2210 Kit | USB | SPI | 12 MHz |
National Instruments | USB-8452 | USB | I2C, SPI | 50 MHz |
Total Phase | Cheetah SPI Host Adapter | USB | SPI | 40 MHz |
Total Phase | Promira Serial Platform | USB, Ethernet | I2C, SPI, single/dual/quad, and eSPI | 80 MHz |
Dangerous Prototypes | Bus Pirate | USB | 1-Wire, I2C, SPI, JTAG*, Asynchronous serial, Scriptable binary bitbang, UART | varies |
協議分析儀
SPI協議分析儀可以對SPI總線進行采樣并對電信號進行解碼分析,以提供在特定總線上傳輸的數據的更高級別視圖。SPI協議分析儀示例(制造商按字母順序排列):
廠商 | 分析儀的型號 | 上位機的總線 | 支持的總線協議 | 最高采樣率 | 其它 |
---|---|---|---|---|---|
Saleae Logic Pro 16 | USB | SPI, I2C, serial, custom | 500 Mega-samples/second | Analog (50Msps) | |
TechTools | DigiView Logic Analyzers | USB | SPI, I2C, CAN, Async, Sync, I2S, State, Custom | 500Msps | Extendable with custom plugins |
Total Phase | Beagle I2C/SPI Protocol Analyzer | USB | SPI, I2C, MDIO | 50Msps | |
Total Phase | Promira Serial Platform | USB, Ethernet | eSPI |
示波器
每個主要的示波器供應商都為SPI提供了基于示波器的觸發和協議解碼,大多數支持2線、3線和4線SPI。 觸發和解碼功能通常作為可選附件提供。SPI信號可通過模擬示波器通道或數字MSO通道進行訪問。
邏輯分析儀
在開發和/或排除SPI總線故障時,檢查硬件信號非常重要。 邏輯分析儀是收集、分析、解碼和存儲信號的工具,因此人們可以用它來查看高速波形。 邏輯分析儀顯示每個信號電平變化的時間戳,這有助于發現協議問題。大多數邏輯分析儀都能夠將總線信號解碼為高級協議數據并顯示ASCII數據。
評論