代碼鏈接: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 的時鐘樹節點如下所示:
圖中標號部分的含義如下:
-
時鐘源選擇,由寄存器 CSCDR2 的 ECSPI_CLK_SEL 位域控制,為 0 選擇 pll3_60m 作為 ECSPI 的時鐘源,為 1 選擇 osc_clk 作為 ECSPI 的時鐘源,實驗中選擇 pll3_60m 作為 ECSPI 的時鐘源;
-
ECSPI 的時鐘分頻值,由寄存器 CSCDR2 的 ECSPI_CLK_PODF 位域控制,分頻值為 2^ECSPI_CLK_PODF,實驗中設置為 0,即 1 分頻;
-
最終進入 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.硬件連接