步驟1:總而言之,SPI是什么?
SPI是一種通信協議,最初是由Motorola開發的,在兩個電子設備之間傳輸信息。這是一種全雙工協議,這意味著兩個設備能夠同時彼此“交談”。
這兩個設備被指定為“主”設備和“從”設備。主設備是始終啟動每個對話并控制對話進行速度的芯片。從設備僅在主設備請求時才同時發送和接收信息。
步驟2:如何進行SPI通信?
要使兩個設備之間的通信正常進行,有四個使用的導線:通常標記為CS或SS(用于從機選擇)的片選導線,主輸出從輸入數據線(MOSI),主輸入從輸出數據線(MISO)和串行時鐘線( SCK)。
主設備將CS線拉低,以與另一側的從設備指示它希望與其通信。因為這是一條單獨的電線,被賦予了“低”電壓信號,所以這意味著主機可以通過將其特定電線驅動為低電平來實際控制多個“從”設備。
MOSI和MISO數據行可以完成您可能已經猜到的事情;這兩條線允許SPI為全雙工。數據位以高電壓或低電壓信號的形式在兩個設備之間沿一個方向或另一個方向傳輸,具體取決于我們正在查看的數據線。
SCK線控制速度傳輸MOSI和MISO線上的數據位。像CS線一樣,SCK線也由主機控制,并以高和低周期驅動以創建“時鐘脈沖”,以控制何時在這些線上傳輸數據。可以將SPI配置為在時鐘變高或變低時傳輸數據。
第3步:您一直說數據的“位”
實際上是。 SPI被設計(并且是真正成為SPI所必需的)以字節大小的通信塊工作,八位到一個字節。因此,對于每個數據傳輸,時鐘和兩條數據線上都會有8個時鐘脈沖和8個數據傳輸。
但是,有些器件,例如ADI公司的AD5628芯片在Digilent的PmodDA4上,它使用串行外設接口,但表示它們傳輸12位數據而不是8位數據。雖然這似乎是不可能的,因為您不能使用SPI協議來傳輸8位數據,然后僅傳輸4位數據,但是當我們深入研究該芯片的數據手冊時,便找到了解決方案。滾動一點后,我們可以看到DAC的移位寄存器實際上是32位長(第22頁)。可以很好地將其分為四個單獨的8位傳輸。
步驟4:我們如何傳輸此數據?
與其他通信協議不同,SPI是它能夠以多種方式傳輸數據,因此功能相當廣泛。根據每個芯片想要接收數據的方式,可以先發送最高有效位(MSB)或先發送最低有效位(LSB)來發送信息。
但是真正的多功能性來自四種不同的SPI時鐘模式,可供選擇。這些模式可以調整時鐘信號是從高電壓值開始還是從低電壓值開始,以及數據的位是隨著時鐘信號轉變為高電平狀態而傳輸還是隨著時鐘轉變為低態狀態而傳輸。上表概述了每種時鐘模式的配置。同樣,根據設備期望接收信息的方式來選擇每種模式。
因此,如果我們希望兩個設備通過SPI互相發送210值,則最高位首先,在時鐘下降沿傳輸數據,首先讓主機將芯片選擇線拉低,然后使時鐘信號拉高,讓每個設備將適當的位“加載”到數據線上,然后讓主機將時鐘信號拉低,以便兩個設備“收集”在線上的數據位。重復該過程,直到所有位均已傳輸,然后主機最終再次將芯片選擇線拉高以結束通信。
步驟5:接收數據如何?
要正確接收數據所需執行的操作取決于接收數據的組件類型。如果您擁有主設備(通常是某種形式的微控制器),則將信息發送到另一設備,該設備不是微控制器,而只是一個只做一件事并且永遠不會回應您的小芯片(例如在這種情況下產生模擬電壓信號) (Analog Devices AD5628),那么作為用戶創建電路的用戶通常不需要執行任何操作。只需確保您以設備想要接收的格式將信息發送到設備即可。
如果您希望從設備接收反饋(或者正在將信息發送到所需的其他微控制器)進行編程以正確接收和解釋傳入的信息),您可能需要做兩件事。如果您使用的SPI庫支持全部接收(并返回)8位數據,例如chipKIT/Arduino的SPI庫,那么您可以簡單地將所有信息接收并存儲到一個變量中
如果不使用SPI庫,則必須收集各個信息位,然后將它們“網狀”在一起。 (可能)最容易通過接收數組中的信息位來完成。
步驟6:需要考慮的其他事項
盡管看起來SPI是通過某種方式完成的并且可以始終如一地工作,但情況并非總是如此。嘗試使用主設備與其從芯片進行通信時,線路的另一端可能沒有從設備。作為主設備的電子芯片無法物理地知道它是否通過電線連接到其他芯片。
此外,SPI中可能使用的許多代碼僅用于SPI庫。一些配置(例如,是否應首先發送最高或最低有效位或何時應在時鐘周期發送)僅由庫處理。但是,也可以“手動”執行SPI協議。畢竟,SPI使用的所有信號就是這樣。高低壓信號。因此,只要將主機用于發送電壓信號的引腳連接到“從”設備上的正確引腳,就可以通過“ SPI”完成通信,而無需實際使用指定的SPI引腳。
自然地,使用SPI庫可能會更快(無論是鍵入速度還是實際速度),但是很高興知道所有通信(無論是SPI還是其他方式)實際上都是電壓信號。/p》
第7步:運行SPI:沒有庫
雖然理論很不錯,但我個人也看到了有關某物的實際示例時,它會更有用看起來像在代碼中。這將不需要使用預定義的SPI庫,因為我認為查看SPI協議的各個部分何時發生會更有幫助。代碼本身(在下面的文本文件中提供)基于Digilent的uC32,這是一個功能強大的Arduino兼容微控制器。
步驟8:運行SPI:使用庫
您還可以將SPI與適當的庫一起使用。這種方法(毫不奇怪)大大減少了您作為用戶需要鍵入的代碼量,但同時從本質上來說還是抽象的。除非您已經知道每個命令在內部執行的操作,否則沒有簡單的方法只能通過查看它們來弄清楚發生了什么。
步驟9:一些最終想法
正如我之前提到的,SPI是電子領域中使用最廣泛的通信協議之一,但并沒有給人以為使用 協議的印象。 ; I2C,UART,USB等許多其他協議,甚至簡單的通用輸入/輸出(GPIO)引腳在通訊方面都有其優點和缺點。
-
SPI
+關注
關注
17文章
1724瀏覽量
92260
發布評論請先 登錄
相關推薦
串行接口的工作方式有幾種,串行接口的RXD1和TXD1是什么端口
SH32F9001的SPI介紹與應用
![SH32F9001的SPI介紹與應用](https://file1.elecfans.com/web3/M00/04/6F/wKgZPGdztBqALf7QAAALAA_Cswk237.jpg)
KeyStone架構串行外設接口(SPI)手冊
SPI通信協議的基本概念和工作模式
SPI總線的定義和特點
串行接口與并行接口的區別
串行接口的工作原理和結構
使用GMSL隧穿對遠程汽車外設進行身份驗證
![使用GMSL隧穿對遠程汽車外設進行身份驗證](https://file.elecfans.com/web2/M00/4C/78/poYBAGKyxUaAVCbBAAAfziEvOio242.jpg)
是否有可能使用CYSPP配置文件連接到外圍設備?
用PSOC6 BLE當外圍設備,兩者傳輸數據時,psoc6概率性出現藍牙掛死的原因?
什么是I2C接口?什么是I3C接口?I2C與I3C的區別
![什么是I2C<b class='flag-5'>接口</b>?什么是I3C<b class='flag-5'>接口</b>?I2C與I3C的區別](https://file1.elecfans.com/web2/M00/BC/CA/wKgZomWmIsKARiRgAAC_1I6QLUY175.jpg)
評論