天天看點

SPI工作原理分析

說明.文章摘自:SPI協定及其工作原理淺析 http://bbs.chinaunix.net/thread-1916003-1-1.html

一、概述.

     SPI, Serial Perripheral Interface, 串行外圍裝置接口, 是 Motorola 公司推出的一種同步串行接口技術. SPI 總線在實體上是通過接在外圍裝置微控制器(PICmicro) 上面的微處理控制單元 (MCU) 上叫作同步串行端口(Synchronous Serial Port) 的子產品(Module)來實作的, 它允許 MCU 以全雙工的同步串行方式, 與各種外圍裝置進行高速資料通信.

     SPI 主要應用在 EEPROM, Flash, 實時時鐘(RTC), 數模轉換器(ADC), 數字信号處理器(DSP) 以及數字信号解碼器之間. 它在晶片中隻占用四根管腳 (Pin) 用來控制以及資料傳輸, 節約了晶片的 pin 數目, 同時為 PCB 在布局上節省了空間. 正是出于這種簡單易用的特性, 現在越來越多的晶片上都內建了 SPI技術.

二、 特點

     1. 采用主-從模式(Master-Slave) 的控制方式

       SPI 規定了兩個 SPI 裝置之間通信必須由主裝置 (Master) 來控制次裝置 (Slave). 一個 Master 裝置可以通過提供 Clock 以及對 Slave 裝置進行片選 (Slave Select) 來控制多個 Slave 裝置, SPI 協定還規定 Slave 裝置的 Clock 由 Master 裝置通過 SCK 管腳提供給 Slave 裝置, Slave 裝置本身不能産生或控制 Clock, 沒有 Clock 則 Slave 裝置不能正常工作.

     2. 采用同步方式(Synchronous)傳輸資料

       Master 裝置會根據将要交換的資料來産生相應的時鐘脈沖(Clock Pulse), 時鐘脈沖組成了時鐘信号(Clock Signal) , 時鐘信号通過時鐘極性 (CPOL) 和 時鐘相位 (CPHA) 控制着兩個 SPI 裝置間何時資料交換以及何時對接收到的資料進行采樣, 來保證資料在兩個裝置之間是同步傳輸的.

     3. 資料交換(Data Exchanges)

       SPI 裝置間的資料傳輸之是以又被稱為資料交換, 是因為 SPI 協定規定一個 SPI 裝置不能在資料通信過程中僅僅隻充當一個 "發送者(Transmitter)" 或者 "接收者(Receiver)". 在每個 Clock 周期内, SPI 裝置都會發送并接收一個 bit 大小的資料, 相當于該裝置有一個 bit 大小的資料被交換了.

       一個 Slave 裝置要想能夠接收到 Master 發過來的控制信号, 必須在此之前能夠被 Master 裝置進行通路 (Access). 是以, Master 裝置必須首先通過 SS/CS pin 對 Slave 裝置進行片選, 把想要通路的 Slave 裝置選上.

       在資料傳輸的過程中,  每次接收到的資料必須在下一次資料傳輸之前被采樣. 如果之前接收到的資料沒有被讀取, 那麼這些已經接收完成的資料将有可能會被丢棄,  導緻 SPI 實體子產品最終失效. 是以, 在程式中一般都會在 SPI 傳輸完資料後, 去讀取 SPI 裝置裡的資料, 即使這些資料(Dummy Data)在我們的程式裡是無用的.

三、 工作機制

     1. 概述

SPI工作原理分析

      上圖隻是對 SPI 裝置間通信的一個簡單的描述, 下面就來解釋一下圖中所示的幾個元件(Module):

       SSPBUF, Synchronous Serial Port Buffer, 泛指 SPI 裝置裡面的内部緩沖區, 一般在實體上是以 FIFO 的形式, 儲存傳輸過程中的臨時資料;

       SSPSR, Synchronous Serial Port Register, 泛指 SPI 裝置裡面的移位寄存器(Shift Regitser), 它的作用是根據設定好的資料位寬(bit-width) 把資料移入或者移出 SSPBUF;

       Controller, 泛指 SPI 裝置裡面的控制寄存器, 可以通過配置它們來設定 SPI 總線的傳輸模式.

        通常情況下, 我們隻需要對上圖所描述的四個管腳(pin) 進行程式設計即可控制整個 SPI 裝置之間的資料通信:

        SCK, Serial Clock, 主要的作用是 Master 裝置往 Slave 裝置傳輸時鐘信号, 控制資料交換的時機以及速率;

        SS/CS, Slave Select/Chip Select, 用于 Master 裝置片選 Slave 裝置, 使被選中的 Slave 裝置能夠被 Master 裝置所通路;

        SDO/MOSI, Serial Data Output/Master Out Slave In, 在 Master 上面也被稱為 Tx-Channel, 作為資料的出口, 主要用于 SPI 裝置發送資料;

        SDI/MISO, Serial Data Input/Master In Slave Out, 在 Master 上面也被稱為 Rx-Channel, 作為資料的入口, 主要用于SPI 裝置接收資料;

        SPI 裝置在進行通信的過程中, Master 裝置和 Slave 裝置之間會産生一個資料鍊路回環(Data Loop), 就像上圖所畫的那樣, 通過 SDO 和 SDI 管腳, SSPSR 控制資料移入移出 SSPBUF, Controller 确定 SPI 總線的通信模式, SCK 傳輸時鐘信号.

      2. Timing.

SPI工作原理分析

        上圖通過 Master 裝置與 Slave 裝置之間交換1 Byte 資料來說明 SPI 協定的工作機制.

        首先,  在這裡解釋一下兩個概念:

        CPOL: 時鐘極性, 表示 SPI 在空閑時, 時鐘信号是高電平還是低電平. 若 CPOL 被設為 1, 那麼該裝置在空閑時 SCK 管腳下的時鐘信号為高電平. 當 CPOL 被設為 0 時則正好相反.

        CPHA: 時鐘相位, 表示 SPI 裝置是在 SCK 管腳上的時鐘信号變為上升沿時觸發資料采樣, 還是在時鐘信号變為下降沿時觸發資料采樣. 若 CPHA 被設定為 1, 則 SPI 裝置在時鐘信号變為下降沿時觸發資料采樣, 在上升沿時發送資料. 當 CPHA 被設為 0 時也正好相反.

        上圖裡的 "Mode 1, 1" 說明了本例所使用的 SPI 資料傳輸模式被設定成 CPOL = 1, CPHA = 1. 這樣, 在一個 Clock 周期内, 每個單獨的 SPI 裝置都能以全雙工(Full-Duplex) 的方式, 同時發送和接收 1 bit 資料, 即相當于交換了 1 bit 大小的資料. 如果 SPI 總線的 Channel-Width 被設定成 Byte, 表示 SPI 總線上每次資料傳輸的最小機關為 Byte, 那麼挂載在該 SPI 總線的裝置每次資料傳輸的過程至少需要 8 個 Clock 周期(忽略裝置的實體延遲). 是以, SPI 總線的頻率越快, Clock 周期越短, 則 SPI 裝置間資料交換的速率就越快.

     3. SSPSR.

SPI工作原理分析

        SSPSR 是 SPI 裝置内部的移位寄存器(Shift Register). 它的主要作用是根據 SPI 時鐘信号狀态, 往 SSPBUF 裡移入或者移出資料, 每次移動的資料大小由 Bus-Width 以及 Channel-Width 所決定.

        Bus-Width 的作用是指定位址總線到 Master 裝置之間資料傳輸的機關.

        例如, 我們想要往 Master 裝置裡面的 SSPBUF 寫入 16 Byte 大小的資料: 首先, 給 Master 裝置的配置寄存器設定 Bus-Width 為 Byte; 然後往 Master 裝置的 Tx-Data 移位寄存器在位址總線的入口寫入資料, 每次寫入 1 Byte 大小的資料(使用 writeb 函數); 寫完 1 Byte 資料之後, Master 裝置裡面的 Tx-Data 移位寄存器會自動把從位址總線傳來的1 Byte 資料移入 SSPBUF 裡; 上述動作一共需要重複執行 16 次.

        Channel-Width 的作用是指定 Master 裝置與 Slave 裝置之間資料傳輸的機關. 與 Bus-Width 相似,  Master 裝置内部的移位寄存器會依據 Channel-Width 自動地把資料從 Master-SSPBUF 裡通過 Master-SDO 管腳搬運到 Slave 裝置裡的 Slave-SDI 引腳, Slave-SSPSR 再把每次接收的資料移入 Slave-SSPBUF裡.

        通常情況下, Bus-Width 總是會大于或等于 Channel-Width, 這樣能保證不會出現因 Master 與 Slave 之間資料交換的頻率比位址總線與 Master 之間的資料交換頻率要快, 導緻 SSPBUF 裡面存放的資料為無效資料這樣的情況.

        4. SSPBUF.

SPI工作原理分析

          我們知道, 在每個時鐘周期内, Master 與 Slave 之間交換的資料其實都是 SPI 内部移位寄存器從 SSPBUF 裡面拷貝的. 我們可以通過往 SSPBUF 對應的寄存器 (Tx-Data / Rx-Data register) 裡讀寫資料, 間接地操控 SPI 裝置内部的 SSPBUF.

          例如, 在發送資料之前, 我們應該先往 Master 的 Tx-Data 寄存器寫入将要發送出去的資料, 這些資料會被 Master-SSPSR 移位寄存器根據 Bus-Width 自動移入 Master-SSPBUF 裡, 然後這些資料又會被 Master-SSPSR 根據 Channel-Width 從 Master-SSPBUF 中移出, 通過 Master-SDO  管腳傳給 Slave-SDI 管腳,  Slave-SSPSR 則把從  Slave-SDI 接收到的資料移入 Slave-SSPBUF 裡.  與此同時, Slave-SSPBUF 裡面的資料根據每次接收資料的大小(Channel-Width), 通過 Slave-SDO 發往 Master-SDI, Master-SSPSR 再把從 Master-SDI 接收的資料移入 Master-SSPBUF.在單次資料傳輸完成之後, 使用者程式可以通過從 Master 裝置的 Rx-Data 寄存器讀取 Master 裝置資料交換得到的資料.

         5. Controller.

SPI工作原理分析

          Master 裝置裡面的 Controller 主要通過時鐘信号(Clock Signal)以及片選信号(Slave Select Signal)來控制 Slave 裝置. Slave 裝置會一直等待, 直到接收到 Master 裝置發過來的片選信号, 然後根據時鐘信号來工作.

          Master 裝置的片選操作必須由程式所實作. 例如: 由程式把 SS/CS 管腳的時鐘信号拉低電平, 完成 SPI 裝置資料通信的前期工作; 當程式想讓 SPI 裝置結束資料通信時, 再把 SS/CS 管腳上的時鐘信号拉高電平.