张高兴的.NET Core IoT 入门指南:(四)使用 SPI 进行通信
什么是 SPI
和上一篇文章的 I2C 總線一樣,SPI(Serial Peripheral Interface,串行外設接口)也是設備與設備間通信方式的一種。SPI 是一種全雙工(數據可以兩個方向同時傳輸)的串行通信總線,由摩托羅拉于上個世紀 80 年代開發[1],用于短距離設備之間的通信。SPI 包含 4 根信號線,一根時鐘線 SCK(Serial Clock,串行時鐘),兩根數據線 MOSI(Master Output Slave Input,主機輸出從機輸入)和 MISO(Master Input Slave Output,主機輸入從機輸出),以及一根片選信號 CS(Chip Select,或者叫 SS,Slave Select)。所謂的時鐘線就是一種周期,兩臺設備數據傳輸不能各發各的,這樣就沒有意義,因此需要一種周期去對通信進行約束;數據線就是按照 MOSI 和 MISO 的中文翻譯理解即可;片選信號用于主設備選擇 SPI 上的從設備,I2C 是靠地址選擇設備,而 SPI 靠的是片選信號,一般來說要選擇哪個從設備只要將相應的 CS 線設置為低電平即可,特殊情況需要看數據手冊。下圖展示了一個 SPI 主設備和三個 SPI 從設備的示意圖。
圖源:Wikipedia
SPI 還有一個重要的概念就是時鐘的極性(CPOL,Clock Polarity)和相位(CPHA,Clock Phase),對其這里不過多解釋,我們只需要知道極性和相位的組合構成了 SPI 的傳輸模式(SPI Mode)。在數據手冊中,只要是 SPI 通信協議的,一定會給出傳輸模式,我們根據數據手冊進行設置即可。SPI 的傳輸模式是有固定編號的,下表給出了各個模式,常用的模式有 Mode0 和 Mode3。
| Mode0 | 0 | 0 |
| Mode1 | 0 | 1 |
| Mode2 | 1 | 0 |
| Mode3 | 1 | 1 |
該時序圖顯示了時鐘的極性和相位。圖源:Wikipedia
SPI 相比較 I2C 最大的優點就是傳輸速率高,并且數據在同一時間內可以雙向傳輸,這都得益于它的兩根輸入和輸出數據線。當然缺點也很明顯,比 I2C 多了兩根線,這就要多占用兩個 IO 接口。而且 SPI 采用 CS 線去選擇設備,不像 I2C 有尋址機制,如果你有很多個 SPI 設備需要連接的話 IO 接口的占用數量是相當高的。
在 Raspberry Pi 的引腳中,引出了兩組 SPI 接口。但有意思的是,在 Raspbian 中 SPI-1 是被禁用的,你需要修改一些參數去啟用 SPI-1。SPI 接口的引腳編號如下圖所示。
?
?提示
如何在 Raspbian 上開啟 SPI-1?(在 Win10 IoT 上 SPI-1 是開啟的)
1. 使用編輯器打開 /boot/config.txt ,如:sudo nano /boot/config.txt
2. 添加?dtoverlay=spi1-3cs?并保存
3. 重啟
Raspberry Pi B+/2B/3B/3B+/Zero 引腳圖
相關類
SPI 操作的相關類位于?System.Device.Spi?和?System.Device.Spi.Drivers?命名空間下。
SpiConnectionSettings
SpiConnectionSettings?類位于?System.Device.Spi?命名空間下,表示 SPI 設備的連接設置。
UnixSpiDevice 和 Windows10SpiDevice
UnixSpiDevice?和?Windows10SpiDevice?類位于?System.Device.Spi.Drivers?命名空間下。兩個類均派生自抽象類?SpiDevice,分別代表 Unix 和 Windows10 下的 SPI 控制器,使用時按照所處的平臺有選擇的進行實例化。這里以?UnixSpiDevice?類為例說明。
SPI 的通信步驟
初始化 SPI 連接設置?SpiConnectionSettings
一般情況下,我們只需要配置 SPI 的 ID,CS 的編號,時鐘頻率和 SPI 傳輸模式。其中像時鐘頻率、傳輸模式等設置都來自于設備的數據手冊。比如要使用 Raspberry Pi 的 SPI-0 去操作一個時鐘頻率為 5 MHz,SPI 傳輸模式為 Mode3 的設備,代碼如下:
SpiConnectionSettings settings = new SpiConnectionSettings(busId: 0, chipSelectLine: 0){
ClockFrequency = 5000000,
Mode = SpiMode.Mode3
};
讀取和寫入
讀取和寫入與 I2C 類似,這里不再過多贅述,詳見上一篇博客,這里只提供一個代碼示例。唯一要說明的就是使用全雙工通信?TransferFullDuplex()?時,要求寫入的數據和讀取的數據長度要一致,并且能否使用也需要看設備是否支持。比如從地址為 0x00 的寄存器中向后連續讀取 8 個字節的數據,并且向地址為 0x01 的寄存器寫入一個字節的數據,代碼如下:
加速度傳感器讀取實驗
本實驗選用的是三軸加速度傳感器?ADXL345?,數據手冊地址:http://wenku.baidu.com/view/87a1cf5c312b3169a451a47e.html?。
傳感器圖像
硬件需求
電路
VCC - 3.3 V
GND - GND
CS - CS0 (Pin24)
SDO - SPI0 MISO (Pin21)
SDA - SPI0 MOSI (Pin19)
SCL - SPI0 SCLK (Pin23)
代碼
打開 Visual Studio ,新建一個 .NET Core 控制臺應用程序,項目名稱為“Adxl345”。
引入?System.Device.Gpio?NuGet 包。
新建類?Adxl345,替換如下代碼:
在?Program.cs?中,將主函數代碼替換如下:
發布、拷貝、更改權限、運行
效果圖
原文地址:https://www.cnblogs.com/zhanggaoxing/p/10943822.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結
以上是生活随笔為你收集整理的张高兴的.NET Core IoT 入门指南:(四)使用 SPI 进行通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 站点部署,IIS配置优化指南
- 下一篇: ASP.NET Core 中使用IHtt