通信协议(二)——SPI协议
1、基礎(chǔ)知識(shí)
1.1 概念
SPI(Serial Peripheral Interface,串行外圍設(shè)備接口),是Motorola公司提出的一種同步串行接口技術(shù),是一種高速、全雙工、同步通信總線,在芯片中只占用四根管腳用來控制及數(shù)據(jù)傳輸,廣泛用于EEPROM、Flash、RTC(實(shí)時(shí)時(shí)鐘)、ADC(數(shù)模轉(zhuǎn)換器)、DSP(數(shù)字信號(hào)處理器)以及數(shù)字信號(hào)解碼器上。SPI通信的速度很容易達(dá)到好幾兆bps,所以可以用SPI總線傳輸一些未壓縮的音頻以及壓縮的視頻。
特點(diǎn):
? ? ? ?SPI設(shè)備之間通信必須由主設(shè)備控制從設(shè)備,主設(shè)備可通過片選實(shí)現(xiàn)控制多個(gè)從設(shè)備,從設(shè)備不能產(chǎn)生或控制時(shí)鐘,只可主設(shè)備提供。
????????SPI是采用同步方式傳輸數(shù)據(jù)的。
????????SPI設(shè)備之間數(shù)據(jù)傳輸又稱為數(shù)據(jù)交換,不管是讀數(shù)據(jù)還是寫數(shù)據(jù)都需要發(fā)送數(shù)據(jù)到從設(shè)備為其提供時(shí)鐘,才能正常進(jìn)行,在有些設(shè)備讀取數(shù)據(jù)時(shí)可能需要先寫入數(shù)據(jù),此時(shí)一定要記得將寫入時(shí)從設(shè)備響應(yīng)的數(shù)據(jù)也讀出來,后面才可讀出對(duì)應(yīng)需要的數(shù)據(jù)。
優(yōu)點(diǎn):
?? ??? ?支持全雙工操作,操作簡(jiǎn)單,數(shù)據(jù)傳輸速率較高。
缺點(diǎn):
?? ??? ?需要占用主機(jī)較多的口線,只支持單個(gè)主機(jī),沒有應(yīng)答機(jī)制確認(rèn)是否接收到數(shù)據(jù),相對(duì)于IIC缺點(diǎn)來說是一個(gè)大的缺點(diǎn)。
1.2 SPI物理層
????????采用主從模式(Master-Slave)的控制方式,支持單Master多Slave。
????????SPI規(guī)定了兩個(gè)SPI設(shè)備之間通信必須由主設(shè)備Master來控制從設(shè)備Slave。也就是說,如果FPGA是主機(jī)的情況下,不管是FPGA給芯片發(fā)送數(shù)據(jù)還是從芯片中接收數(shù)據(jù),寫Verilog邏輯的時(shí)候片選信號(hào)CS與串行時(shí)鐘信號(hào)SCK必須由FPGA來產(chǎn)生。同時(shí)一個(gè)Master可以設(shè)置多個(gè)片選(Chip Select)來控制多個(gè)Slave。SPI協(xié)議還規(guī)定Slave設(shè)備的clock由Master通過SCK管腳提供給Slave,Slave本身不能產(chǎn)生或控制clock,沒有clock則Slave不能正常工作。
?注:一主一從
????????SCK(Serial Clock):SCK是串行時(shí)鐘線,作用是Master向Slave傳輸時(shí)鐘信號(hào),控制數(shù)據(jù)交換的時(shí)機(jī)和速率,它由通訊主機(jī)產(chǎn)生,決定了通訊的速率,不同的設(shè)備支持的最高時(shí)鐘頻率不一樣,兩個(gè)設(shè)備之間通訊時(shí),通訊速率受限于低速設(shè)備。
????????MOSI(Master Out Slave in):在SPI Master上也被稱為Tx-channel,作用是SPI主機(jī)給SPI從機(jī)發(fā)送數(shù)據(jù),主機(jī)的數(shù)據(jù)從這條信號(hào)線輸出,從機(jī)由這條信號(hào)線讀入主機(jī)發(fā)送的數(shù)據(jù),即這條線上數(shù)據(jù)的方向?yàn)橹鳈C(jī)到從機(jī)。
????????MISO(Master In Slave Out):在SPI Master上也被稱為Rx-channel,作用是SPI主機(jī)接收SPI從機(jī)傳輸過來的數(shù)據(jù),主機(jī)從這條信號(hào)線讀入數(shù)據(jù),從機(jī)的數(shù)據(jù)由這條信號(hào)線輸出到主機(jī),即在這條線上數(shù)據(jù)的方向?yàn)閺臋C(jī)到主機(jī)。
????????CS/SS(Chip Select/Slave Select):從設(shè)備選擇信號(hào)線,常稱為片選信號(hào)線,也稱為 NSS、SS。SPI 協(xié)議中沒有設(shè)備地址,它使用 cs 信號(hào)線來尋址,當(dāng)主機(jī)要選擇從設(shè)備時(shí),把該從設(shè)備的 cs 信號(hào)線設(shè)置為低電平,該從設(shè)備即被選中,即片選有效,接著主機(jī)開始與被選中的從設(shè)備進(jìn)行 SPI 通訊。所以SPI通訊以 cs 線置低電平為開始信號(hào),以 cs 線被拉高作為結(jié)束信號(hào)。
?注:一主多從
????????SPI 協(xié)議使用 3 條總線及N條片選線,3 條總線分別為 SCLK、MOSI、MISO,片選線為CS,其中3條總線是多個(gè)從設(shè)備共用的,CS是每一個(gè)從機(jī)有一條。
1.3 SPI協(xié)議層
????????SPI總線在傳輸數(shù)據(jù)的同時(shí)也傳輸了時(shí)鐘信號(hào),所以SPI協(xié)議是一種同步(Synchronous)傳輸協(xié)議。Master會(huì)根據(jù)將要交換的數(shù)據(jù)產(chǎn)生相應(yīng)的時(shí)鐘脈沖,組成時(shí)鐘信號(hào),時(shí)鐘信號(hào)通過時(shí)鐘極性(CPOL)和時(shí)鐘相位(CPHA)控制兩個(gè)SPI設(shè)備何時(shí)交換數(shù)據(jù)以及何時(shí)對(duì)接收數(shù)據(jù)進(jìn)行采樣,保證數(shù)據(jù)在兩個(gè)設(shè)備之間是同步傳輸?shù)摹?/p>
????????SPI總線傳輸一共有4中模式,這4種模式分別由時(shí)鐘極性(CPOL,Clock Polarity)和時(shí)鐘相位(CPHA,Clock Phase)來定義,其中CPOL參數(shù)規(guī)定了SCK時(shí)鐘信號(hào)空閑狀態(tài)的電平,CPHA規(guī)定了數(shù)據(jù)是在SCK時(shí)鐘的上升沿被采樣還是下降沿被采樣。
? ? ? ? 時(shí)鐘極性 CPOL: 表示SPI 通訊設(shè)備處于空閑狀態(tài)時(shí),SCK信號(hào)線的電平信號(hào)(即 SPI 通訊開始前、CS 線為高電平時(shí) SCLK的狀態(tài))。CPOL=0時(shí), SCK在空閑狀態(tài)時(shí)為低電平,CPOL=1 時(shí),則相反。
? ? ? ? 時(shí)鐘相位 CPHA:表示數(shù)據(jù)采樣的時(shí)刻,當(dāng) CPHA=0 時(shí),MOSI 或 MISO 數(shù)據(jù)線上的信號(hào)將會(huì)在 SCLK 時(shí)鐘線的“奇數(shù)邊沿”被采樣。當(dāng) CPHA=1 時(shí),數(shù)據(jù)線在 SCLK 的“偶數(shù)邊沿”采樣。
????????模式0:CPOL= 0,CPHA=0。SCK串行時(shí)鐘線空閑是為低電平,數(shù)據(jù)在SCK時(shí)鐘的上升沿被采樣,數(shù)據(jù)在SCK時(shí)鐘的下降沿切換
模式1:CPOL= 0,CPHA=1。SCK串行時(shí)鐘線空閑是為低電平,數(shù)據(jù)在SCK時(shí)鐘的下降沿被采樣,數(shù)據(jù)在SCK時(shí)鐘的上升沿切換
模式2:CPOL= 1,CPHA=0。SCK串行時(shí)鐘線空閑是為高電平,數(shù)據(jù)在SCK時(shí)鐘的下降沿被采樣,數(shù)據(jù)在SCK時(shí)鐘的上升沿切換
模式3:CPOL= 1,CPHA=1。SCK串行時(shí)鐘線空閑是為高電平,數(shù)據(jù)在SCK時(shí)鐘的上升沿被采樣,數(shù)據(jù)在SCK時(shí)鐘的下降沿切換
| 0 | 0 | 0 | 低電平 | 奇數(shù)邊沿 |
| 1 | 0 | 1 | 低電平 | 偶數(shù)邊沿 |
| 2 | 1 | 0 | 高電平 | 奇數(shù)邊沿 |
| 3 | 1 | 1 | 高電平 | 偶數(shù)邊沿 |
?SPI通信過程:
????????SPI總線協(xié)議是一種全雙工的串行通信協(xié)議,數(shù)據(jù)傳輸時(shí)高位在前,低位在后。SPI協(xié)議規(guī)定一個(gè)SPI設(shè)備不能在數(shù)據(jù)通信過程中僅僅充當(dāng)一個(gè)發(fā)送者(Transmitter)或者接受者(Receiver)。在片選信號(hào)CS為0的情況下,每個(gè)clock周期內(nèi),SPI設(shè)備都會(huì)發(fā)送并接收1 bit數(shù)據(jù),相當(dāng)于有1 bit數(shù)據(jù)被交換了。數(shù)據(jù)傳輸高位在前,低位在后(MSB first)。SPI主從結(jié)構(gòu)內(nèi)部數(shù)據(jù)傳輸示意圖如下圖所示:
????????在對(duì)SPI核操作的控制寄存器進(jìn)行設(shè)置之后即可啟動(dòng)數(shù)據(jù)傳輸。數(shù)據(jù)傳輸?shù)膯?dòng)是通過向數(shù)據(jù)寄存器SPDR中寫入數(shù)據(jù)。對(duì)數(shù)據(jù)寄存器執(zhí)行寫操作實(shí)際上是往一個(gè)4項(xiàng)寫隊(duì)列中添加數(shù)據(jù)項(xiàng)。每次寫操作即往隊(duì)列中寫入一個(gè)字節(jié)的數(shù)據(jù)。當(dāng)SPI核被使能時(shí),并且寫緩沖區(qū)不為空,SPI核就是會(huì)自動(dòng)往發(fā)送寫隊(duì)列中最舊的數(shù)據(jù)項(xiàng)。接收數(shù)據(jù)與發(fā)送數(shù)據(jù)同時(shí)進(jìn)行;每當(dāng)發(fā)送一個(gè)字節(jié)的數(shù)據(jù),同時(shí)總會(huì)收到一個(gè)字節(jié)的數(shù)據(jù)。如果想要的接收一個(gè)字節(jié)的數(shù)據(jù),需要往寫緩沖區(qū)寫入一個(gè)字節(jié)的冗余數(shù)據(jù),這樣做是為了讓SPI核啟動(dòng)數(shù)據(jù)傳輸,在發(fā)送冗余數(shù)據(jù)的同時(shí)接收想要的數(shù)據(jù),每完成接收一個(gè)字節(jié)的數(shù)據(jù),這個(gè)字節(jié)會(huì)被移入讀緩沖區(qū)。讀緩沖區(qū)和寫緩沖區(qū)是對(duì)立的,是一個(gè)獨(dú)立的4項(xiàng)隊(duì)列。對(duì)數(shù)據(jù)寄存器執(zhí)行讀操作,便會(huì)得到讀隊(duì)列中的數(shù)據(jù)項(xiàng)。
總結(jié)
以上是生活随笔為你收集整理的通信协议(二)——SPI协议的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: REST framework 用户认证源
- 下一篇: curl查看swift状态命令_HTTP