[IMX] 10.串行外圍設備接口 - SPI

代碼鏈接:GitHub - maoxiaoxian/imx


參考資料:

https://zhuanlan.zhihu.com/p/290620901

SPI協議詳解 - bujidao1128 - 博客園

SPI總線協議及SPI時序圖詳解 - Ady Lee - 博客園


目錄

1.SPI 簡介

2.I.MX6U ECSPI 簡介

2.1.控制寄存器 1 - ECSPIx_CONREG

2.2.控制寄存器 2 - ECSPIx_CONFIGREG

2.3.采樣周期 - ECSPIx_PERIODREG

2.4.SPI 時鐘源

2.5.狀態寄存器 - ECSPIx_STATREG

2.6.數據寄存器 - ECSPIx_TXDATA & ECSPIx_RXDATA

3.ICM-20608 簡介

4.硬件連接


1.SPI 簡介

SPI 全稱 Serial Perripheral Interface,即串行外圍設備接口,是一種高速、全雙工的同步通信總線

SPI 以主從方式工作,通常有一個主設備和多個從設備,SPI 一般需要 4 根線,單向傳輸時也可以只使用 3 根線

標準 4 線 SPI (Quad Serial Peripheral Interface) 包含的通信線如下:

  • CS/SS:Slave Select/Chip Select,片選信號線,選擇需要進行通信的從機設備,SPI 主機無需發送從機的設備地址,直接將相應的從機設備片選信號拉低即可;

  • SCLK:Serial Clock,串行時鐘,和 I2C 的 SCL 時鐘信號線一樣,為 SPI 通信提供時鐘;

  • MOSI/SDO:Master Out Slave In/Serial Data Output,主出從入信號線,該數據線僅用于主機向從機發送數據,也就是主機輸出,從機輸入;

  • MISO/SDI:Master In Slave Out/Serial Data Input,主入從出信號線,該數據線僅用于從機向主機發送數據,也就是主機輸入,從機輸出;

SPI 通信由主機率先發起,主機需要提供時鐘信號,主機通過 SPI 連接多個從機設備的結構如下圖所示:

SCLK 的時鐘信號可配置總線極性 CPOL 和時鐘相位 CPHA

CPOL 配置 SPI 總線的極性,CPHA 配置 SPI 總線的相位

極性直接影響 SPI 總線在空閑時的時鐘信號為高電平還是低電平:

  • CPOL = 1:表示空閑時為高電平;

  • CPOL = 0:表示空閑時為低電平;

數據傳輸從跳變沿 (上升沿/下降沿) 開始,如下圖所示:

相位決定 SPI 總線從哪個跳變沿開始采樣數據:

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

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

SPI 總線有四種工作模式,通過串行時鐘極性 CPOL 和相位 CPHA 的組合獲得:

  • CPOL = 0:串行時鐘空閑狀態為低電平;

  • CPOL = 1:串行時鐘空閑狀態為高電平,此時可以通過配置時鐘相位 CPHA 選擇具體的傳輸協議;

  • CPHA = 0:串行時鐘的第一個跳變沿 (上升沿或下降沿) 采集數據;

  • CPHA = 1:串行時鐘的第二個跳變沿 (上升沿或下降沿) 采集數據;

四種工作模式的時鐘信號如下圖所示:

以 CPOL = 0,CPHA = 0 的工作模式為例,此時 SPI 進行全雙工通信的時序如下圖所示:

SPI 的時序較為簡單,不像 I2C 需要區分寫時序和讀時序 (SPI 為全雙工通信),圖中,CS 片選信號先拉低,選中要通信的從設備,然后通過 MOSI 和 MISO 這兩根數據線收發數據,MOSI 數據線發出 0xD2 給從設備,同時從設備通過 MISO 數據線向主設備返回 0x66

2.I.MX6U ECSPI 簡介

I.MX6U 自帶的 SPI 外設稱為 ECSPI,全稱 Enhanced Configurable Serial Peripheral Interface

ECSPI 有 64*32 個數據接收 FIFO (RXFIFO) 和 64*32 個數據發送 FIFO (TXFIFO),ECSPI 的特性如下:

  • 全雙工同步串行通信;

  • 可配置主/從模式;

  • 四個片選信號,支持多從機;

  • 發送和接收都有一個 32x64 的 FIFO;

  • 片選信號 SS/CS,時鐘信號 SCLK 的極性可配置;

  • 支持 DMA 傳輸;

I.MX6U 的 ECSPI 可以工作在主模式或從模式,例程使用主模式

I.MX6U 有 4 個 ECSPI,每個 ECSPI 支持四個硬件片選信號,即一個 ECSPI 可以支持 4 個外設,如果不使用硬件的片選信號則可以支持無數個外設,實驗中不使用硬件片選信號,因為硬件片選信號只能使用指定的片選 IO,軟件片選可以使用任意的 IO

2.1.控制寄存器 1 - ECSPIx_CONREG

  • BURST_LENGTH[31:24]:突發長度,設置 SPI 突發傳輸的數據長度,單次 SPI 傳輸最大可以發送 2^12bit 個數據,可以設置 0x000~0xFFF,對應 1~2^12bit,一般設置突發長度為一個字節 (8-bit);

  • CHANNEL_SELECT[19:18]:SPI 通道選擇,一個 ECSPI 有四個硬件片選信號,每個片選信號為一個硬件通道,使用軟件片選仍需設置 SPI 通道,可設置為 0~3,對應通道 0~3,I.MX6U-ALPHA 開發板上的 ICM-20608 的片選信號接的是 ECSPI3_SS0,即 ECSPI3 的通道 0,所以實驗中設置為 0;

  • DRCTL[17:16]:控制 SPI 的 SPI_RDY 信號,為 0 時忽略 SPI_RDY 信號,為 1 時 SPI_RDY 信號為邊沿觸發,為 2 時 SPI_DRY 信號為電平觸發;

  • PRE_DIVIDER[15:12]:SPI 預分頻值,ECSPI 時鐘分頻包含兩部分,該位域設置第一部分,可設置 0~15,對應 1~16 分頻;

  • POST_DIVIDER[11:8]:SPI 后分頻值,ECSPI 時鐘分頻的第二部分,分頻值為 2^POST_DIVIDER;

  • CHANNEL_MODE[7:4]:SPI 通道主/從模式設置,CHANNEL_MODE[3:0] 分別對應 SPI 通道 3~0,為 0 時設置為從模式,為 1 時設置為主模式,比如設置為 0x01 表示設置通道 0 為主模式;

  • SMC[3]:開始模式控制,該位只在主模式有效,為 0 時通過 XCH 位開啟 SPI 突發訪問,為 1 時只要向 TXFIFO 寫入數據就會開啟 SPI 突發訪問;

  • XCH[2]:該位只在主模式中有效,SMC 位為 0 時該位控制 SPI 突發訪問的開啟和關閉;

  • HT[1]:HT 模式使能,I.MX6ULL 不支持;

  • EN[0]:SPI 使能,為 0 關閉 SPI,為 1 使能 SPI;

2.2.控制寄存器 2 - ECSPIx_CONFIGREG

  • HT_LENGTH[28:24]:設置 HT 模式的消息長度,I.MX6ULL 不支持;

  • SCLK_CTL[23:20]:設置 SCLK 信號線空閑狀態的電平,SCLK_CTL[3:0] 分別對應通道 3~0,為 0 時 SCLK 空閑狀態為低電平,為 1 時 SCLK 空閑狀態為高電平;

  • DATA_CTL[19:16]:設置 DATA 信號線空閑狀態的電平,DATA_CTL[3:0] 分別對應通道 3~0,為 0 時 DATA 空閑狀態為高電平,為 1 時 DATA 空閑狀態為低電平;

  • SS_POL[15:12]:設置 SPI 片選信號的極性,SS_POL[3:0] 分別對應通道 3~0,為 0 時片選信號低電平有效,為 1 時片選信號高電平有效;

  • SCLK_POL[7:4]:SPI 時鐘信號的極性,即 CPOL,SCLK_POL[3:0] 分別對應通道 3~0,為 0 時 SCLK 高電平有效 (空閑時為低電平),為 1 時 SCLK 低電平有效 (空閑時為高電平);

  • SCLK_PHA[3:0]:SPI 時鐘相位,即 CPHA,SCLK_PHA[3:0] 分別對應通道 3~0, 為 0 時串行時鐘的第一個跳變沿 (上升沿或下降沿) 采集數據,為 1 時串行時鐘的第二個跳變沿 (上升沿或下降沿) 采集數據;

  • 通過 SCLK_POL[7:4] 和 SCLK_PHA[3:0] 設置 SPI 的工作模式;

2.3.采樣周期 - ECSPIx_PERIODREG

  • CSD_CTL[21:16]:片選信號延時控制,設置片選信號和第一個 SPI 時鐘信號之間的時間間隔,范圍為 0~63;

  • CSRC[15]:SPI 時鐘源選擇,為 0 時選擇 SPI CLK 為 SPI 的時鐘源,為 1 時選擇 32.768KHz 的晶振為 SPI 的時鐘源;

  • SAMPLE_PERIO[14:0]:采樣周期,可設置為 0~0x7FFF,分別對應 0~32767 個周期;

2.4.SPI 時鐘源

SPI 的時鐘樹節點如下所示:

圖中標號部分的含義如下:

  1. 時鐘源選擇,由寄存器 CSCDR2 的 ECSPI_CLK_SEL 位域控制,為 0 選擇 pll3_60m 作為 ECSPI 的時鐘源,為 1 選擇 osc_clk 作為 ECSPI 的時鐘源,實驗中選擇 pll3_60m 作為 ECSPI 的時鐘源;

  2. ECSPI 的時鐘分頻值,由寄存器 CSCDR2 的 ECSPI_CLK_PODF 位域控制,分頻值為 2^ECSPI_CLK_PODF,實驗中設置為 0,即 1 分頻;

  3. 最終進入 ECSPI 的時鐘頻率 SPI CLK = 60MHz;

2.5.狀態寄存器 - ECSPIx_STATREG

  • TC[7]:傳輸完成標志,為 0 表示正在傳輸,為 1 表示傳輸完成;

  • RO[6]:RXFIFO 溢出標志,為 0 表示 RXFIFO 無溢出,為 1 表示 RXFIFO 溢出;

  • RF[5]:RXFIFO 空標志位,為 0 表示 RXFIFO 不為空,為 1 表示 RXFIFO 為空;

  • RDR[4]:RXFIFO 數據請求標志,為 0 表示 RXFIFO 中的數據不大于 RX_THRESHOLD,為 1 表示 RXFIFO 中的數據大于 RX_THRESHOLD;

  • RR[3]:RXFIFO 就緒標志,為 0 表示 RXFIFO 中沒有數據,為 1 表示 RXFIFO 中至少有一個字的數據;

  • TF[2]:TXFIFO 滿標志,為 0 表示 TXFIFO 不為滿,為 1 表示 TXFIFO 為滿;

  • TDR[1]:TXFIFO 數據請求標志,為 0 表示 TXFIFO 中的數據大于 TX_THRESHOLD,為 1 表示 TXFIFO 中的數據不大于 TX_THRESHOLD;

  • TE[0]:TXFIFO 空標志位,為 0 表示 TXFIFO 中至少有一個字的數據,為 1 表示 TXFIFO 為空;

2.6.數據寄存器 - ECSPIx_TXDATA & ECSPIx_RXDATA

Tx 和 Rx 的數據寄存器均為 32-bit 長度,如下所示:

?

3.ICM-20608 簡介

ICM-20608 是一款 6 軸 MEMS 傳感器,包括 3 軸加速度和 3 軸陀螺儀,其內部有一個 512 字節的 FIFO

陀螺儀的量程范圍可編程設置,可選擇 ±250,±500,±1000 和 ±2000°/s, 加速度的量程范圍也可以編程設置,可選擇 ±2g,±4g,±8g 和 ±16g

陀螺儀和加速度計均為 16 位的 ADC,且支持 I2C 和 SPI 兩種協議,使用 I2C 接口時通信速度最高可達 400KHz,使用 SPI 接口時通信速度最高可達 8MHz

I.MX6U-ALPHA 開發板上的 ICM-20608 通過 SPI 接口與 SoC 連接,ICM-20608 的特性如下:

  • 陀螺儀支持 X、Y 和 Z 三軸輸出,內部集成 16 位 ADC,測量范圍可設置:±250,± 500,±1000 和 ±2000°/s;

  • 加速度計支持 X、Y 和 Z 軸輸出,內部集成 16 位 ADC,測量范圍可設置:±2g,±4g, ±4g,±8g 和 ±16g;

  • 用戶可編程中斷;

  • 內部包含 512 字節的 FIFO;

  • 內部包含一個數字溫度傳感器;

  • 耐 10000g 的沖擊;

  • 支持快速 I2C,速度可達 400KHz;

  • 支持 SPI,速度可達 8MHz;

ICM-20608 的 3 軸方向如下圖所示:

ICM-20608 的結構框圖如下圖所示:

使用 I2C 接口時 ICM-20608 的 AD0 引腳決定 I2C 設備從地址的最后一位,AD0 為 0 則 ICM-20608 的從設備地址為 0x68,AD0 為 1 則 ICM-20608 的從設備地址為 0x69

實驗使用 SPI 接口,ICM-20608 通過讀寫寄存器進行配置和傳感器數據讀取,使用 SPI 接口讀寫寄存器時至少需要 16 個時鐘信號或更多 (如果讀寫操作包括多個字節):

  • 第一個字節包含要讀寫的寄存器地址,寄存器地址的最高位是讀寫標志位,讀取時最高位為 1,寫入時最高位為 0,剩下的 7 位是實際的寄存器地址;

  • 寄存器地址后面跟著的就是要讀寫的數據;

實驗中使用的 ICM-20608 的寄存器和相關位域如下圖所示:

4.硬件連接

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

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

相關文章

基于Docker和YARN的大數據環境部署實踐最新版

基于Docker和YARN的大數據環境部署實踐 目的 本操作手冊旨在指導用戶通過Docker容器技術,快速搭建一個完整的大數據環境。該環境包含以下核心組件: Hadoop HDFS/YARN(分布式存儲與資源調度)Spark on YARN(分布式計算…

Java設計模式之中介者模式詳解

Java設計模式之中介者模式詳解 一、中介者模式核心思想 核心目標:通過中介對象封裝一組對象間的交互,將網狀的對象關系轉變為星型結構。如同機場控制塔協調所有飛機的起降,避免飛機之間直接通信導致的混亂。 二、中介者模式類圖(…

ArcGIS應用指南:基于網格與OD成本矩陣的交通可達性分析

隨著城市化進程的加速,交通系統的效率和公平性日益成為影響居民生活質量的關鍵因素之一。在這一背景下,如何科學評估城市區域內的交通可達性,成為了城市規劃、交通管理和公共政策制定中的重要議題。作為中國東南沿海的重要港口城市,廈門以其獨特的地理優勢和快速的城市發展…

基于NXP例程學習CAN UDS刷寫流程

文章目錄 前言1.概述1.1 診斷報文 2.協議數據單元(N_PDU)2.1 尋址信息(N_AI)2.1.1 物理尋址2.1.2 功能尋址2.1.3 常規尋址(Normal addressing)2.1.4 常規固定尋址(Normal fixed addressing)2.1.5 擴展尋址&…

近期手上的一個基于Function Grap(類AWS的Lambda)小項目的改造引發的思考

函數式Function是云計算里最近幾年流行起來的新的架構和模式,因為它不依賴云主機,非常輕量,按需使用,甚至是免費使用,特別適合哪種數據同步,數據轉發,本身不需要保存數據的業務場景,…

什么是 SQL 注入?如何防范?

什么是 SQL 注入?如何防范? 1. SQL 注入概述 1.1 基本定義 SQL 注入(SQL Injection)是一種通過將惡意SQL 語句插入到應用程序的輸入參數中,從而欺騙服務器執行非預期SQL命令的攻擊技術。攻擊者可以利用此漏洞繞過認證、竊取數據甚至破壞數據庫。 關鍵結論:SQL 注入是O…

高德地圖應用OceanBase單元化構建下一代在線地圖服務

IEEE International Conference on Data Engineering (ICDE) 是數據庫和數據工程領域的頂級學術會議之一(與SIGMOD、VLDB并成為數據庫三大頂會),自1984年首次舉辦以來,每年舉辦一次。ICDE涵蓋廣泛的主題,包括數據庫系統…

Vue3中Element-Plus中el-input及el-select 邊框樣式

如果不需要顯示下邊框&#xff0c;純無邊框直接將 【border-bottom: 1px solid #C0C4CC; 】注掉或去掉即可。 正常引用組件使用即可&#xff0c;無須自定義樣式&#xff0c;最終效果CSS樣式。 <style scoped> /* 輸入框的樣式 */ :deep(.el-input__wrapper) { box-sha…

如何做好一份技術文檔:從信息孤島到知識圖譜的進階之路

如何做好一份技術文檔&#xff1a;從信息孤島到知識圖譜的進階之路 在軟件開發的漫長征程中&#xff0c;技術文檔如同隱藏在代碼叢林中的路標&#xff0c;不僅指引著開發團隊的前行方向&#xff0c;更在產品迭代的歲月里構筑起知識傳承的橋梁。一份優質的技術文檔&#xff0c;既…

Docker Compose使用自定義用戶名密碼啟動Redis

通常我們使用下面的命令來啟動 redis 容器&#xff0c;此時連接 Redis 的時候是不需要用戶認證的 sudo docker run -d --name my-redis -p 6379:6379 redis此時我們可以使用 redis-server --requirepass "mypassword" 來指定默認用戶&#xff08;default&#xff09…

1.什么是node.js、npm、vue

一、Node.js 是什么&#xff1f; &#x1f63a; 定義&#xff1a; Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行時環境&#xff0c;讓你可以在瀏覽器之外運行 JavaScript 代碼&#xff0c;主要用于服務端開發。 &#x1f63a;從計算機底層說&#xff1a;什么是“運…

如何在 Vue.js 中集成 Three.js —— 創建一個旋轉的 3D 立方體

在這篇文章中&#xff0c;我將向大家展示如何將 Three.js 與 Vue.js 結合&#xff0c;創建一個簡單的 3D 場景&#xff0c;并展示一個旋轉的立方體。通過這個簡單的示例&#xff0c;你將學習到如何在 Vue 項目中集成 Three.js&#xff0c;以及如何創建動態的 3D 內容。 1. 安裝…

DeepSeek?R1-0528 重磅升級:螞蟻百寶箱免費、無限量調用

DeepSeek?R1-0528 重磅升級&#xff1a;螞蟻百寶箱免費、無限量調用 端午假期前一天&#xff0c;DeepSeek?R1 更新到了 0528 版本&#xff01; 官方說明&#xff1a;0528 版本在深度思考與推理能力方面顯著增強——在數學、編程與通用邏輯等多項基準測評中&#xff0c;表現已…

RS232轉Profinet網關在檢漏儀與西門子PLC里的應用

RS232轉Profinet網關在檢漏儀與西門子PLC里的應用 在工業自動化和控制領域&#xff0c;設備間的高效通信至關重要。RS232轉Profinet網關作為一種關鍵的轉換工具&#xff0c;能夠將傳統的RS232接口設備接入現代化的Profinet網絡&#xff0c;從而實現數據的無縫傳輸和設備的遠程…

jenkins-jenkins簡介

一、簡介 jenkins是一個可擴展的持續集成引擎。持續集成&#xff0c;也就是通常所說的CI&#xff08;Continues Integration&#xff09;&#xff0c;可以說是現代軟件技術開發的基礎。持續集成是一種軟件開發實踐&#xff0c; 即團隊開發成員經常集成他們的工作&#xff0c;通…

vue發版html 生成打包到docker鏡像進行發版

將Vue項目打包成Docker鏡像部署主要分為以下幾個步驟&#xff1a; 1. Vue項目打包? 執行npm run build生成dist文件夾&#xff0c;包含靜態資源文件 注意檢查index.html中資源引用路徑是否正確&#xff08;避免絕對路徑問題&#xff09; 2. 編寫Dockerfile Copy Code FROM…

掃地機器人苦尋新引擎,大疆們卻已攻入腹地

原創 科技新知 前沿科技組 作者丨江籬 編輯丨櫻木、九黎 競爭激烈的掃地機器人賽道&#xff0c;迎來了新玩家。 據近日相關報道&#xff0c;大疆掃地機器人產品已開始量產&#xff0c;預計將于6月份發布。消息稱大疆研發掃地機器人已超過四年&#xff0c;即將上市的產品是掃…

【C++】22. 紅黑樹封裝實現Mymap和Myset

上一章節我們實現了紅黑樹&#xff0c;這一章節我們就用紅黑樹封裝來實現一個我們自己的map和set 1. 源碼及框架分析 SGI-STL 3.0版本的源代碼中&#xff0c;map和set的實現主要分布在若干頭文件中&#xff0c;這些頭文件構成了這兩個容器的完整實現架構&#xff1a; 核心頭文…

02_redis分布式鎖原理

文章目錄 一、redis如何實現分布式鎖1. 使用 SETNX 命令2. 設置過期時間3. 釋放鎖4. 注意事項5. 示例代碼二、Java中分布式鎖如何設置超時時間1. Redis分布式鎖2. 基于Zookeeper的分布式鎖3. 基于數據庫的分布式鎖注意事項一、redis如何實現分布式鎖 Redis 實現分布式鎖是一種…

酷派Cool20/20S/30/40手機安裝Play商店-谷歌三件套-GMS方法

酷派Cool系列主打低端市場&#xff0c;系統無任何GMS程序&#xff0c;也不支持直接開啟或者安裝谷歌服務等功能&#xff0c;對于國內部分經常使用谷歌服務商店的小伙伴非常不友好。涉及機型有酷派Cool20/Cool20S /30/40/50/60等旗下多個設備。好在這些機型運行的系統都是安卓11…