前言:
本文是根據嗶哩嗶哩網站上“正點原子[第二期]Linux之ARM(MX6U)裸機篇”視頻的學習筆記,在這里會記錄下正點原子 I.MX6ULL 開發板的配套視頻教程所作的實驗和學習筆記內容。本文大量引用了正點原子教學視頻和鏈接中的內容。
引用:
正點原子IMX6U倉庫 (GuangzhouXingyi) - Gitee.com
《【正點原子】I.MX6U嵌入式Linux驅動開發指南V1.5.2.pdf》
正點原子資料下載中心 — 正點原子資料下載中心 1.0.0 文檔
SPI學習參考資料:
簡述SPI通信協議-01_cpha選擇為第一個邊沿-CSDN博客
SPI中的CPHA,CPOL詳解-CSDN博客
正文:
本文是 “正點原子[第二期]Linux之ARM(MX6U)裸機篇--第24講 SPI驅動。本節將參考正點原子的視頻教程第24講和配套的正點原子開發指南文檔進行學習。
0. 概述
通I2C一樣,SPI是很常用的通信接口,也可以通過SPI來連接眾多的傳感器。相比I2C接口,SPI接口的通信速度很快,I2C最多400KHz,但是SPI可以到達即使MHz。I.MX6U 也有4個SPI接口,可以通過這4個SPI接口來連接一些SPI外設。I.MX6U-ALHPA使用SPI3接口連接了一個6周傳感器 ICM-20608,本章我們就來學習如何使用I.MX6U的SPI接口來驅動ICM-20608,讀取ICM-20608的六軸數據。
1. SPI簡介
上一章我們講解了I2C,I2C是串行通信的一種,只需要兩根線就可以完成主機和從機之間的通信,但是I2C的速度最高只能到400KHz,如果對于訪問速度要求比較高的話I2C就不適合了。本章我們就來學習另外一個和I2C一樣廣泛使用的串行協議:SPI,SPI的全稱是 Serial Peripheral Interface,也就是串行外圍設備接口。SPI是Motorola公司推出的一種同步串行接口技術,是一種高速,全雙工的同步通信協議,SPI時鐘頻率相比I2C要高很多,最高可以工作到上百Mhz。SPI以主從方式工作,通常是有一個主設備和一個或多個從設備,一般SPI需要4根線,但是也可以使用三根線(單向傳輸),本章我們講解標準的4線SPI,這4根線如下:
- CS/SS, Chip Select/Slave Select,這個是片選信號線,用于選擇需要進行通信的從設備。I2C主機是通過發送從機設備地址來選擇需要進行通信的從設備的,SPI主機不需要發送從機設備地址,而是直接將相應的從機設備片選信號拉低。
- SCK,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線連接多個從設備的結構如下圖所示:
?
1.1 SPI工作模式
SPI由四種工作模式,通過串行時鐘極性(CPOL: Clock Polity)和相位(CPHA:Clock Phase)的搭配來得到四種工作模式:
值 | 描述 |
CPOL=0 | 串行時鐘空閑狀態為低電平 |
CPOL=1 | 串行時鐘空閑狀態為高電平 此時可以通過配置時鐘相位CPHA(Clock Phase)來選擇具體的傳輸協議 |
CPHA=0 | 串行時鐘的第一個跳變沿(上升沿或下降沿)來采集數據 |
CPHA=1 | 串行時鐘的第二個跳變沿(上升沿或下降沿)來采集數據 |
這四種工作模式如下圖所示:
1.2 什么是SPI的 CPHA 第一個上升沿,第二個上升沿?
SPI協議的CPHA(Clock Phase)相位決定是在第一個跳變沿還是在第二個跳變沿采集數據,那么什么時第一個跳變沿,什么又是第二個跳變沿哪?問下"百度AI助手好了",結果輸出如下:
但是,百度AI助手大模型這里總結提煉的東西大部分是正確,但是中間的CPOL(Clock Polarity)和CPHA(Clock Phase)組合之后的采集沿是在第一個跳變沿采集還是在第二個跳變沿采集,百度AI助手大模型搞錯了。這就是AI大模型助手的問題,有時間會給出看似正確但是實際上細節錯誤的東西。
不過這些百度AI助手提取出來的信息對于我來講還是有效的,第一它給出了一些SPI CPOL(Clock Polarity)和CPHA(Clock Phase)的組合概念提煉,第二它給出了引用鏈接來源,我去讀一下它的引用鏈接不就能得到有用信息了么,贊。
把百度AI助手提供的有用信息總結一下就是:
SPI協議中的CPHA(Clock Phase)決定了數據傳輸采樣和移位方式,具體涉及到時鐘信號的跳變沿。在一個時鐘周期內,會有兩次跳變沿:上升沿(從低電平到高電平的變化)和下降沿(從高電平到低電平的變化)。
- 當CPHA=0時,表示數據在使用信號的第一個跳變沿(即上升沿或下降沿,具體取決于CPOL的設置)進行采樣。
- 當CPHA=1時,表示數據在時鐘信號的第二個跳變邊沿進行采樣。
結合CPOL(Clock Polarity)的設置,可以形成SPI的四種工作模式:
- Mode0 (CPOL=0, CPHA=0):數據在時鐘的第一個跳變沿采樣,因為CPOL=0 低電平表示空閑Idle,所以第一個跳變沿是上升沿(由低到高)采樣。
- Mode1 (CPOL=0, CPHA=1):數據在時鐘的第二個跳變沿采樣,因為CPOL=0 低電平表示空閑Idle,所以第二個跳變沿是下降沿(由高到低)采樣。
- Mode2 (CPOL=1, CPHA=0):數據在時鐘的第一個跳變沿采樣,因為CPOL=1?高電平表示空閑Idle,所以第一個跳變沿是下降沿(由高到低)采樣。
- Mode3(CPOL=1, CPHA=1):數據在時鐘的第二個跳變沿采樣,因為CPOL=1?高電平表示空閑Idle,所以第二個跳變沿是上升沿(由低到高)采樣。
參考如下鏈接里的博文,給出了總結的圖片,圖片總結的很完備了
SPI中的CPHA,CPOL詳解-CSDN博客
我自己對SPI上升沿下降沿的理解,自己畫的圖: