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