SPI 總線協議

1、協議介紹

??SPI,是英語 Serial Peripheral interface 的縮寫,顧名思義就是串行外圍設備接口。是 Motorola 首先在其 MC68HCXX 系列處理器上定義的。

??SPI,是一種高速的,全雙工,同步的通信總線。主節點或子節點的數據在時鐘上升沿或下降沿同步。主節點和子節點可以同時傳輸數據。SPI 接口可以是 3 線或 4 線。本文重點介紹流行的 4 線 SPI 接口

??串行外設接口 (SPI) 是微控制器與外設 IC(如傳感器、ADC、DAC、移位寄存器、SRAM 等)之間使用最廣泛的接口之一。


在這里插入圖片描述

4 線 SPI 設備有四種信號:

  • 時鐘(SPI CLK、SCLK)
  • 片選(CS)
  • 主節點輸出,子節點輸入 (MOSI)
  • 主節點輸入,子節點輸出 (MISO)

??產生時鐘信號的設備稱為主設備。主節點和子節點之間傳輸的數據與主節點產生的時鐘同步。與 I2C 接口相比,SPI 設備支持的時鐘頻率要高得多(時鐘頻率和傳輸速度有著直接的關系)。用戶應查閱產品數據手冊以了解 SPI 接口的時鐘頻率規格。

??SPI 接口只能有一個主節點,可以有一個或多個子節點

??主節點的片選信號用于選擇子節點。這通常是低電平有效信號,拉高可斷開子節點與 SPI 總線的連接。當使用多個子節點時,主節點需要為每個子節點提供單獨的片選信號。在本文中,片選信號始終是低電平有效信號。

??MOSI 和 MISO 是數據線,MOSI 將數據從主節點傳輸到子節點,MISO 將數據從子節點傳輸到主節點。

下表總結了 SPI 的關鍵特性:

特性規格
導線4
最大速度SPI 傳輸速度沒有協議的限制,但會受硬件設計的影響。可能是 10MHz、50MHz、100MHz 等
同步或異步?同步
串行或并行?串行
最大主器件數1
最大節點數無限制

2、數據傳輸

??要開始 SPI 通信,主設備必須發送時鐘信號并通過啟用 CS 信號選擇子節點。

主機沒有數據傳輸(數據發送)的情況下,通常是沒有 CLK 信號的

??通常,芯片選擇是低電平有效信號;因此,主設備必須在此信號上發送邏輯 0 來選擇子節點。SPI 是一個全雙工接口;主節點和子節點可以分別通過 MOSI 和 MISO 線路同時發送數據。在 SPI 通信期間,數據同時傳輸和接收。串行時鐘沿同步數據的移位和采樣。

??SPI 接口為用戶提供了靈活性,可以選擇時鐘的上升沿或下降沿來采樣和/或發送數據。請參閱設備數據表以確定使用 SPI 接口傳輸的數據位數。

2.1 時鐘極性

??極性,會直接影響 SPI CLK 總線空閑時的時鐘信號是高電平還是低電平。

  • CPOL = 1:表示空閑時是高電平
  • CPOL = 0:表示空閑時是低電平

??當 CPOL 時鐘極性控制位被拉低時,它會使 SCK 管腳產生一個穩定的低電平。如果 CPOL 時鐘極性控制為被拉高,當沒有數據傳輸時,它會使 CLK 管腳產生一個穩定的高電平。即確定 SCK 在不傳輸數據時,是默認高電平或者默認低電平

2.2 時鐘相位

??一個時鐘周期會有 2 個跳變沿。而相位,直接決定 SPI CLK 總線從那個跳變沿開始采樣數據。

  • CPHA = 0:表示從第一個跳變沿開始采樣
  • CPHA = 1:表示從第二個跳變沿開始采樣

    在這里插入圖片描述
SPI modeCPOLCPHA
000
101
210
311

可以參考 W25Q64FW 中使用 0x9f 命令讀 ID 的傳輸過程示意圖:
在這里插入圖片描述

2.3 數據交換

??SPI 設備間的數據傳輸之所以又被稱為數據交換,是因為 SPI 協議規定一個 SPI 設備不能在數據通信過程中僅僅只充當一個 “發送者(Transmitter)” 或者 “接收者(Receiver)”。

??一個 Slave 設備要想能夠接收到 Master 發過來的控制信號,必須在此之前能夠被 Master 設備進行訪問 (Access)。所以,Master 設備必須首先通過 SS/CS pin 對 Slave 設備進行片選, 把想要訪問的 Slave 設備選上。 在數據傳輸的過程中,每次接收到的數據必須在下一次數據傳輸之前被采樣。如果之前接收到的數據沒有被讀取,那么這些已經接收完成的數據將有可能會被丟棄,導致 SPI 物理模塊最終失效。因此,在程序中一般都會在 SPI 傳輸完數據后,去讀取 SPI 設備里的數據, 即使這些數據(Dummy Data)在我們的程序里是無用的(雖然發送后緊接著的讀取是無意義的,但仍然需要從寄存器中讀出來)。

  • 如果不對接收進行讀取操作可能會導致溢出,將使以后發送出的數據全部無效
  • 在每個 SPI 時鐘周期內,都會發生全雙工數據傳輸
  • SPI 只有主模式和從模式之分(提供時鐘的為主設備 Master,接收時鐘的設備為從設備 Slave),沒有讀和寫的說法,因為實質上每次 SPI 是主從設備在交換數據。也就是說,你發一個數據必然會收到一個數據;你要收一個數據必須也要先發一個數據
  • 發一個字節任意值數據是為了在 CLK 總線上產生時鐘,給從機的 SPI 信號提供時鐘用的,從機 SPI 不會自己產生 CLK 信號的

在 CS 片選有效的情況下才會有數據傳輸,有一種特殊情況,如果 CS 片選無效,設備硬件 FIFO 中的數據都會丟失。如果兩次寫操作中間 CS 一直有效,設備硬件 FIFO 中的數據不會丟失。這里要注意


??特別要注意的是,關于 Transfer Mode,是一個很奇怪的東西。這個玩意違背了“發送就一定需要接收”的邏輯,即上面所說“數據交換”的邏輯在一定程度上是問題的。這也給 SPI 總線驅動、包括 SPI 設備驅動帶來了很多變數。所以,寫設備驅動前,最好對總線驅動的發送與接收過程有個了解。

例如 rk3568 SPI 控制器中的 SPI_CTRLR0 寄存器:

在這里插入圖片描述

  • Transmit & Receive(就是我們上面提到,只要有發送,就一定會有接收,即使是臟數據,也需要讀出來):

In transmit-and-receive mode,both transmit and receive data are valid. The transfer continues until the transmit FIFO is empty. Data received from the external device are stored into the receive FIFO memory, where it can be accessed by the host processor

  • Transmit Only:

In transmit-only mode,data received from the external device is not valid and is not stored in the receive FIFO memory; it is overwritten on the next transfer

  • Receive Only:

In receive-only mode,transmitted data are not valid. After the first write to the transmit FIFO,the same word is retransmitted for the duration of the transfer

  • EEPROM Read:

In eeprom-read mode, receive data is not valid while control data is being transmitted. When all control data is sent to the EEPROM, receive data becomes valid and transmit data becomes invalid. All data in the transmit FIFO is considered control data in this mode. This transfer mode is only valid when the DW_apb_ssi is configured as a master device


還有一個 SPI_CTRLR1 寄存器:
在這里插入圖片描述
??這個只針對于 Receive Only 模式和 EEPROM Read 模式有效。該寄存器含義是指定 SPI 控制器一次連續接收的數據幀數量。通常情況下,是需要接收的幀數 -1 。

例如 EEPROM Read 模式:發送數據用于傳輸命令碼和地址到 EEPROM 設備,一般需要 3 個數據幀(8-bit 操作碼,8-bit 高位地址,8-bit 低位地址)。在操作碼和地址傳輸的過程中,控制器不會從串行總線上接收數據。當發送 FIFO 中的條目發送完畢,接收數據才開始被采樣,采樣的數據幀數是 NDF+1(也就是上面的 ndm 寄存器值 + 1)。

2.4 關于幀長度

??在發起一個 SPI 傳輸前,通常還需要設置本次傳輸的幀長度( Data Frame Size ) ,通常是 8 或 16 位。

struct spi_message {......unsigned		frame_length;......
};

??SPI 協議本身并沒有幀長度(Frame Length)的固定概念,因為 SPI 是一種流式(streaming)傳輸協議,它是一個基于主從模式的時鐘同步串行通信協議,只關心 時鐘脈沖(SCK)和數據位(MOSI、MISO) 的同步,并不會主動分割數據。然而,在具體的 SPI 控制器、驅動程序或某些應用場景下,幀長度的概念被引入。這里要注意。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/72633.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72633.shtml
英文地址,請注明出處:http://en.pswp.cn/web/72633.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

我愛學算法之——滑動窗口攻克子數組和子串難題(上)

現在來學習"滑動窗口"這一算法思想。 至于什么是"滑動窗口"呢?簡單來說就是同向雙指針;現在來通過題目來了解什么是"滑動窗口" 一、長度最小的子數組 題目鏈接:長度最小的子數組 題目解析 先來看題目&#…

ora-600 ktugct: corruption detected---惜分飛

接手一個oracle 21c的庫恢復請求,通過Oracle數據庫異常恢復檢查腳本(Oracle Database Recovery Check)腳本檢測之后,發現undo文件offline之后,做了resetlogs操作,導致該文件目前處于WRONG RESETLOGS狀態 嘗試恢復數據庫ORA-16433錯誤 SQL> recover datafile 1; ORA-00283:…

20. Excel 自動化:Excel 對象模型

一 Excel 對象模型是什么 Excel對象模型是Excel圖形用戶界面的層次結構表示,它允許開發者通過編程來操作Excel的各種組件,如工作簿、工作表、單元格等。 xlwings 是一個Python庫,它允許Python腳本與Excel進行交互。與一些其他Python庫&#x…

IIS 服務器日志和性能監控

Internet Information Services (IIS) 是 Microsoft 提供的一款功能強大、靈活且可擴展的 Web 服務器,用于托管網站、服務和應用程序。IIS 支持 HTTP、HTTPS、FTP、SMTP 和更多用于提供網頁的協議,因此廣泛用于企業環境。 IIS 的…

jenkins pipline 自動化測試

以下是一個典型的 Jenkins Pipeline 示例,用于執行自動化測試流程(支持單元測試、集成測試、代碼質量掃描),包含多階段執行和測試結果處理: pipeline {agent anyenvironment {// 定義環境變量PROJECT_NAME "my-…

APP測試

一、APP測試范圍 功能測試性能測試:CPU、內存占用、啟動速度、流量、電量消耗、流暢度、穩定性專項測試:安裝卸載升級、push消息推送 、交叉事件測試 、用戶體驗測試 、兼容性測試 二、APP包發布方式及策略 分類: 內部發布渠道。如&#x…

12 File文件對象:創建、獲取基本信息、遍歷文件夾、查找文件;字符集的編解碼 (黑馬Java視頻筆記)

文章目錄 File >> 存儲數據的方案1. 認識File2. File操作2.1 創建File對象2.2 File操作1)對文件對象的信息的操作2)文件/文件夾的創建/刪除3)??對文件夾的遍歷 3. 方法遞歸3.1 認識遞歸3.2 遞歸算法及其執行流程1) 案例:2…

oracle 基礎知識之 多表查詢

多表查詢定義:當查詢的數據并不是來源一個表時,需要使用多表連接操作完成查詢。多表連接查詢通過表之間的關聯字段,一次查詢出多個表的數據。多表查詢包括了等值連接、左連接、右連接、完全連接。 1.等值連接 等值連接也稱為簡單連接&#xf…

服務器防火墻根據什么特征來過濾數據包?

防火墻是服務器安全防護的第一道屏障,它的主要作用是監控、過濾和控制進出服務器的數據流量,防止惡意攻擊、非法訪問和數據泄露。防火墻通過分析數據包的特定特征來決定是否允許、拒絕或限制數據的傳輸。 服務器防火墻的基本工作原理: 防火墻…

Prims region.Views 為null

原因: 導航未完成或異步問題 解決方式:使用回調確認導航完成后再操作視圖 _regionManager.RequestNavigate("MonitorRegion", "MonitorView", nps, navigationResult > {if (navigationResult.Result true){var region _regio…

reconstruct_3d_object_model_for_matching例子

文章目錄 1.獲取om3文件2.準備可視化3.準備3D可視化4.讀取3D模型5.顯示成對注冊結果16.顯示成對注冊結果27.聯合注冊模型8.處理圖像8.1子采樣8.2 圖像計算與平滑8.3 三角測量 9.基于表面做3D匹配10.評估模型準確度10.1 在場景中找到模型10.2 計算模型和場景之間的距離 11.立體系…

軟件安全性測試的重要性和常用工具介紹,軟件測試服務公司推薦

在當今數字化快速發展的時代,軟件已經成為各行各業不可或缺的一部分。然而,隨著軟件系統的復雜性增加,安全性問題也愈發突出,因此軟件產品生產周期中安全測試必不可少。軟件安全性測試是指對軟件系統進行評估,以發現潛…

Redis項目:短信驗證碼登錄

這是黑馬的黑馬點評項目,短信驗證碼的業務。一開始是使用session做的,后來重構,使用redis緩存來完成。 第一層攔截器: public class RefreshTokenInterceptor implements HandlerInterceptor {private StringRedisTemplate stri…

Docker下載,包含Win、Mac

介紹 Docker 是一種開源的容器化平臺,通過操作系統級虛擬化技術實現應用的快速開發、部署和運行。以下從多個維度對 Docker 進行詳細介紹: 一、Docker 的核心概念與功能 容器化技術 Docker 利用 Linux 內核的容器隔離技術(如 Cgroups 和 Nam…

使用 ESP8266 和 Android 應用程序實現基于 IOT 的語音控制家庭自動化

使用 ESP8266 實現基于 IOT 的語音控制家庭自動化 歡迎來到另一個令人興奮的項目,我們將使用 Wi-Fi 模塊構建一個語音控制ESP8266家庭自動化系統,您可以在其中通過語音通過 Android 應用程序從世界任何地方控制您的家用電器。是的,您只需使用語音命令即可打開或關閉負載(L…

【HarmonyOS Next】鴻蒙中自定義彈框OpenCustomDialog、CustomDialog與DialogHub的區別詳解

【HarmonyOS Next】鴻蒙中自定義彈框OpenCustomDialog、CustomDialog與DialogHub的區別詳解 一、三者的區別與關系 1. 官方迭代過程為: CustomDialog 》 OpenCustomDialog 》 DialogHub 迭代過程表明,彈框的調用越來越便捷,與UI解耦&…

【C++】stack和queue的使用及模擬實現(含deque的簡單介紹)

文章目錄 前言一、deque的簡單介紹1.引入deque的初衷2.deque的結構3.為什么選擇deque作為stack和queue的底層默認容器 二、stack1.stack的介紹2.stack的使用3.stack的模擬實現 三、queue1.queue的介紹2.queue的使用3.queue的模擬實現 前言 一、deque的簡單介紹(引入…

Leetcode 刷題筆記1 圖論part01

圖論的基礎知識: 圖的種類: 有向圖(邊有方向) 、 無向圖(邊無方向)、加權有向圖(邊有方向和權值) 度: 無向圖中幾條邊連接該節點,該節點就有幾度&#xff1…

《基于Workspace.java的Launcher3改造:HotSeat區域動態阻斷文件夾生成機制》

1. 需求背景與技術挑戰 在Android 13系統Launcher3定制化開發中,需實現禁止HotSeat區域創建文件夾的功能。原始邏輯中,當用戶拖拽應用圖標至HotSeat區域相鄰圖標時,會觸發FolderIcon的實例化。本文將深入分析Launcher3的文件夾創建機制&…

重生之我在學Vue--第14天 Vue 3 國際化(i18n)實戰指南

重生之我在學Vue–第14天 Vue 3 國際化(i18n)實戰指南 文章目錄 重生之我在學Vue--第14天 Vue 3 國際化(i18n)實戰指南前言一、Vue I18n 核心配置1.1 基礎環境搭建1.2 初始化配置1.3 全局掛載 二、多語言實現方案2.1 基礎使用2.2 動態切換語言2.3 高級功能實現復數處理日期/貨幣…