我一直以為SPI比IIC難的,因為可能是因為使用了比較“重型”的傳感器才會搭配這個接口。
但是今天用FPGA寫了一個簡單的移位寄存器,感覺不一樣,甚至是不對勁。
移位寄存器按照移位方向可分為左移位寄存器、右移位寄存器、雙向移位寄存器。
這個圖記住,菊花鏈也跑不了
這個是STM32F103的主從設備的示意
MOSI腳相互連接,MISO腳相互連接。這樣,數(shù)據(jù)在主和從之間串行地傳輸(MSB位在前)。通信總是由主設備發(fā)起。主設備通過MOSI腳把數(shù)據(jù)發(fā)送給從設備,從設備通過MISO引腳回傳數(shù)據(jù)。這意味全雙工通信的數(shù)據(jù)輸出和數(shù)據(jù)輸入是用同一個時鐘信號同步的;時鐘信號由主設備通過SCK腳提供。
其實最近一段時間我頻繁在機器人系統(tǒng)里面,比如FPGA和ARM的控制核之間,發(fā)現(xiàn)它們之間的交互都是使用SPI。也就是說設計人員需要具有簡單的設備到設備數(shù)字接口的微控制器、外設和傳感器,以便可以高速處理任意長度的數(shù)據(jù),并且省去與協(xié)議相關的復雜編程任務。
基本SPI全雙工連接使用兩條數(shù)據(jù)線(MOSI、MISO)、一條時鐘線 (SCK) 和一條片選線 (CS)。從設備上的MOSI有時標記為從設備數(shù)據(jù)輸入 (SDI)。MISO可標記為從設備數(shù)據(jù)輸出 (SDO)。
兩種處理多個從設備連接的配置。直接連接方式下每個從設備需要一個片選信號。菊花鏈連接方式僅使用一個片選信號,并將所有數(shù)據(jù)集中在一條線上。
主要看箭頭,多個從機
菊花鏈
在菊花鏈模式下,所有從機的片選信號連接在一起,數(shù)據(jù)從一個 從機傳播到下一個從機。在此配置中,所有從機同時接收同一SPI 時鐘。
來自主機的數(shù)據(jù)直接送到第一個從機,該從機將數(shù)據(jù)提供 給下一個從機,依此類推。使用該方法時,由于數(shù)據(jù)是從一個從機傳播到下一個從機,所以 傳輸數(shù)據(jù)所需的時鐘周期數(shù)與菊花鏈中的從機位置成比例。
在圖所示的8位系統(tǒng)中,為使第3個從機能夠獲得數(shù)據(jù),需要24個 時鐘脈沖,而常規(guī)SPI模式下只需8個時鐘脈沖。
一般Master設備就是我們的MCU,Master 設備會根據(jù)將要交換的數(shù)據(jù)來產(chǎn)生相應的時鐘脈沖(Clock Pulse),時鐘脈沖組成了時鐘信號(Clock Signal) ,時鐘信號通過時鐘極性 (CPOL) 和 時鐘相位 (CPHA) 控制著兩個 SPI 設備間何時數(shù)據(jù)交換以及何時對接收到的數(shù)據(jù)進行采樣,來保證數(shù)據(jù)在兩個設備之間是同步傳輸?shù)摹?/p>
SPI 設備間的數(shù)據(jù)傳輸之所以又被稱為數(shù)據(jù)交換,是因為 SPI 協(xié)議規(guī)定一個 SPI 設備不能在數(shù)據(jù)通信過程中僅僅只充當一個 "發(fā)送者(Transmitter)" 或者 "接收者(Receiver)"。
在每個 Clock 周期內(nèi),SPI 設備都會發(fā)送并接收一個 bit 大小的數(shù)據(jù)(不管主設備好還是從設備),相當于該設備有一個 bit 大小的數(shù)據(jù)被交換了。一個 Slave 設備要想能夠接收到 Master 發(fā)過來的控制信號,必須在此之前能夠被 Master 設備進行訪問 (Access)。所以,Master 設備必須首先通過 SS/CS pin 對 Slave 設備進行片選, 把想要訪問的 Slave 設備選上。
在數(shù)據(jù)傳輸?shù)倪^程中,每次接收到的數(shù)據(jù)必須在下一次數(shù)據(jù)傳輸之前被采樣。如果之前接收到的數(shù)據(jù)沒有被讀取,那么這些已經(jīng)接收完成的數(shù)據(jù)將有可能會被丟棄,導致 SPI 物理模塊最終失效。
因此,在程序中一般都會在 SPI 傳輸完數(shù)據(jù)后,去讀取 SPI 設備里的數(shù)據(jù), 即使這些數(shù)據(jù)(Dummy Data)在我們的程序里是無用的(雖然發(fā)送后緊接著的讀取是無意義的,但仍然需要從寄存器中讀出來)。
在SPI通信期間,數(shù)據(jù)的發(fā)送(串行移出到MOSI/SDO總線上)和接收(采樣或讀入總線(MISO/ SDI)上的數(shù)據(jù))同時進行。
所以捏SPI沒有讀和寫的說法,因為實質(zhì)上每次SPI是主從設備在交換數(shù)據(jù)。也就是說,你發(fā)一個數(shù)據(jù)必然會收到一個數(shù)據(jù);你要收一個數(shù)據(jù)必須也要先發(fā)一個數(shù)據(jù)。
就像IIC一樣,SPI也是需要找到誰在通訊的,比較費引腳,必須有一個片選的腳。來自主機的片選信號用于選擇從機。這通常是一個低電平有效信號,拉高時從機與SPI總線斷開連接。當使用多個從機時,主機需要為每個從機提供單獨的片選信號。
要開始SPI通信,主機必須發(fā)送時鐘信號,并通過使能CS信號選擇從機。片選通常是低電平有效信號。
因此,主機必須在該信號上發(fā)送邏輯0以選擇從機。SPI是全雙工接口,主機和從機可以分別 通過MOSI和MISO線路同時發(fā)送數(shù)據(jù)。
在SPI中,主機可以選擇時鐘極性和時鐘相位。
在空閑狀態(tài)期間,CPOL位設置時鐘信號的極性??臻e狀態(tài)是指傳輸開始時CS為 高電平且在向低電平轉(zhuǎn)變的期間,以及傳輸結束時CS為低電平且 在向高電平轉(zhuǎn)變的期間。
CPHA位選擇時鐘相位。根據(jù)CPHA位的狀態(tài),使用時鐘上升沿或下降沿來采樣和/或移位數(shù)據(jù)。主機必須根據(jù)從機的要求選擇時鐘極性和時鐘相位。根據(jù)CPOL和CPHA位的選擇,有四種SPI模式可用。
數(shù)據(jù)顯示在MOSI和MISO線上。傳輸?shù)拈_始和結束用綠色虛線表示,采樣邊沿用橙色虛線表示,移位邊沿用藍色虛線表示。
SPI模式0,CPOL = 0,CPHA = 0:CLK空閑狀態(tài) = 低電平,數(shù)據(jù)在上升沿采樣,并在下降沿移出。
一采樣,一移位。
由主設備控制并生成時鐘。時鐘的兩個屬性分別是時鐘極性 (CPOL) 和時鐘相位 (CPHA)。這些屬性控制從設備相對數(shù)據(jù)進行計時的有效時鐘邊沿。CPOL = 0時,將時鐘設為在邏輯0位置空閑。CPOL = 1時,時鐘在邏輯1位置空閑。CPHA = 0時,數(shù)據(jù)在上升沿計時,CPHA = 1時,數(shù)據(jù)在下降沿計時(圖3)。
SPI時鐘模式選擇確定了進行數(shù)據(jù)采樣的有效時鐘邊沿。
主設備中的CPOL和CPHA線路設置決定了時鐘極性以及進行數(shù)據(jù)計時的有效邊沿。模式1是最常用的模式,但設計人員同樣可以使用其他三種模式。
上面的軌跡是數(shù)據(jù)線,中間的軌跡是時鐘,底部的軌跡是片選信號。數(shù)據(jù)軌跡上的藍色覆蓋區(qū)顯示的是十六進制解碼內(nèi)容。
讓我來帶你看個MC的芯片手冊,看看不一樣的SPI。
一個SPI的溫度計
別問咋搞,直接街上
很多的時候,我們是使用傳感器直接寫,但是在機器人里面我們需要自己寫一個傳輸?shù)膮f(xié)議,這個是后話。
首先建立這些的時間都是ns級別,怎么說呢,俺說不明白。
說說這些東西的意思,我覺得是滿足不同人的需求,比如我現(xiàn)在就拿出一塊51,我就能輸出個高低電平,你能咋。
所以這些寫模擬協(xié)議的時候就有用,因為對于器件來說,我才不管什么東西插了我,反正說的通就行。
片選 (Chip Enable, CE) 、串行時鐘 (Serial Clock, SCK) 、串行數(shù)據(jù)輸入 (Serial Data Input,SDI)以及串行數(shù)據(jù)輸出(Serial Data Output, SDO )信號線。
CE 輸入用于在有多個器件連接到串行時鐘和數(shù)據(jù)線時選擇器件。CE 為高電平有效,當 CE 等于邏輯高電平時,數(shù)據(jù)可以寫入器件或從器件讀出。CE 為低電平 時, SCK 輸入被禁止。
抬高的時候,就是到我啦!
CE 線的上升沿啟動讀或?qū)懖僮鳎?CE 的下降沿結束讀或?qū)懖僮鳌?/p>
SCK 輸入由外部單片機提供,用于同步 SDI 和 SDO 線 的數(shù)據(jù)。
SDI 輸入向傳感器的控制寄存器寫入數(shù)據(jù),而 SDO從溫度寄存器中輸出溫度數(shù)據(jù)和控制寄存器關斷位的狀態(tài)。
傳感器具有能在 SCK輸入信號為有效高電平或低電平時工作的能力。當 CE 信號變成高電平時,檢測到 SCK 的 無效狀態(tài),而時鐘輸入 (CP)的極性決定數(shù)據(jù)是在系統(tǒng)時鐘的上升沿或下降沿移入或移出。
給出了用于傳送數(shù)據(jù)到寄存器和從寄存器移出數(shù) 據(jù)的相應時鐘邊沿。每個時鐘脈沖傳送一位數(shù)據(jù),數(shù)據(jù)位以 8 位為一組傳送。
A就是地址
先發(fā)送地址字節(jié),隨后為數(shù)據(jù)。地址的最高位 A7 決定 要進行讀操作還是寫操作。
如果 A7 =“0”,將進行一個或多個讀操作;否則 A7 = “1”,進行一個或多個寫操作。
地址+L+M
數(shù)據(jù)可以采用單字節(jié)或多字節(jié)包的方式進行傳送,如圖所示。在 3 字節(jié)包中,數(shù)據(jù)序列包括溫度數(shù)據(jù)的 MSb、溫度數(shù)據(jù)的 LSb 和緊接著的控制寄存器數(shù)據(jù)。通 過向寄存器寫入所需數(shù)據(jù)包的最高地址來啟動多字節(jié)讀功能。
這段有問題,我明天改正。
審核編輯:湯梓紅
-
傳感器
+關注
關注
2553文章
51400瀏覽量
756609 -
FPGA
+關注
關注
1630文章
21797瀏覽量
606019 -
寄存器
+關注
關注
31文章
5363瀏覽量
121172 -
接口
+關注
關注
33文章
8691瀏覽量
151920 -
SPI
+關注
關注
17文章
1722瀏覽量
92129
原文標題:嵌入式系統(tǒng)低速接口-SPI
文章出處:【微信號:TT1827652464,微信公眾號:云深之無跡】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
調(diào)試嵌入式系統(tǒng)設計中的低速串行總線
調(diào)試嵌入式系統(tǒng)設計中的低速串行總線(二)
![調(diào)試<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>設計中的<b class='flag-5'>低速</b>串行總線(二)](https://file1.elecfans.com//web2/M00/A4/7B/wKgZomUMNGSAColpAAAa4YBS038419.jpg)
DSP嵌入式系統(tǒng)人機接口設計
![DSP<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>人機<b class='flag-5'>接口</b>設計](https://file1.elecfans.com//web2/M00/A5/69/wKgZomUMOFGAbC-jAABEFO8rQQA669.jpg)
中低速數(shù)據(jù)采集系統(tǒng)設計,DSP嵌入式系統(tǒng)開發(fā)典型案例
![中<b class='flag-5'>低速</b>數(shù)據(jù)采集<b class='flag-5'>系統(tǒng)</b>設計,DSP<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>開發(fā)典型案例](https://file.elecfans.com/web2/M00/4A/12/pYYBAGKhvJOAcv4bAAAc3_uxNfw833.png)
嵌入式硬件通信接口協(xié)議中的串行通信接口-SPI
![<b class='flag-5'>嵌入式</b>硬件通信<b class='flag-5'>接口</b>協(xié)議中的串行通信<b class='flag-5'>接口</b>-<b class='flag-5'>SPI</b>](https://file.elecfans.com/web1/M00/82/9E/o4YBAFxBSq2ASIYiAAB0-bMNXBE021.jpg)
基于RTOS的嵌入式系統(tǒng)軟件的設計講解
![基于RTOS的<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>軟件的設計<b class='flag-5'>講解</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
嵌入式軟件接口怎么測試,嵌入式系統(tǒng)接口測試策略.doc
![<b class='flag-5'>嵌入式</b>軟件<b class='flag-5'>接口</b>怎么測試,<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>接口</b>測試策略.doc](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
嵌入式系統(tǒng)低速接口SPI和UART的區(qū)別
![<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>低速</b><b class='flag-5'>接口</b><b class='flag-5'>SPI</b>和UART的區(qū)別](https://file1.elecfans.com/web2/M00/90/6A/wKgaomTZoyyAE4wLAAEIokRUA6k556.png)
評論