武大网站建设,网站正常打开速度慢,福永网站建设公司,合肥做装修哪个网站好什么是 I2C 总线I2C 总线#xff08;Inter-Integrated Circuit Bus#xff09;是设备与设备间通信方式的一种。它是一种串行通信总线#xff0c;由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展[1]。I2C 总线包含两根信号线#xff0c;一根… 什么是 I2C 总线I2C 总线Inter-Integrated Circuit Bus是设备与设备间通信方式的一种。它是一种串行通信总线由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展[1]。I2C 总线包含两根信号线一根为信号线 SDA 另一根为时钟线 SCL 。总线上可以挂载多个设备以 7 位 I2C 地址为例总线上最多可以挂载 27 - 1 个设备即 127 个地址 0x00 不用类似于网络中的广播地址。I2C 还包括一个子集叫 SMBus System Management Bus是 1995 年由 Intel 提出的[2]。为什么说是子集是因为 SMBus 是 I2C 的简化版电气特性和传输速率等方面上略有不同。下图展示了一个 I2C 主设备和三个 I2C 从设备的示意图总线上只能有一个主设备而通常情况下你的主机如 Raspberry PiArduino就是主设备传感器为从设备。图源WikipediaI2C 总线也并不是那么完美。因为 I2C 只有两根信号线与 SPI 的四根信号线相比传输速率上并不占优而且数据在同一时间内只能向一个方向传输。但反过来看I2C 总线的最大优点是只需要占用两个 IO 接口在单片机等 IO 接口数量较少的设备上也算是一种优势吧。在 Raspberry Pi 的引脚中引出了一组 I2C 接口其内部总线 ID 为 1引脚中的 GPIO 2 为 SDAGPIO 3 为 SCL如下图所示。至于 I2C-0它用于 Raspberry Pi 内部的 GPIO 扩展器、相机、显示器等其他设备。Raspberry Pi 的 I2C 引脚中内置了一个 1.8 kΩ 的上拉电阻这意味着在一般情况下使用 I2C 总线时不必再连接一个额外的上拉电阻。Raspberry Pi B/2B/3B/3B/Zero 引脚图相关类I2C 操作的相关类位于 System.Device.I2c 和 System.Device.I2c.Drivers 命名空间下。I2cConnectionSettingsI2cConnectionSettings 类位于 System.Device.I2c 命名空间下表示 I2C 设备的连接设置。public sealed class I2cConnectionSettings{public I2cConnectionSettings(int busId, int deviceAddress);}UnixI2cDevice 和 Windows10I2cDeviceUnixI2cDevice 和 Windows10I2cDevice 类位于 System.Device.I2c.Drivers 命名空间下。两个类均派生自抽象类 I2cDevice分别代表 Unix 和 Windows10 下的 I2C 控制器使用时按照所处的平台有选择的进行实例化。这里以 UnixI2cDevice 类为例说明。public class UnixI2cDevice : I2cDevice{public UnixI2cDevice(I2cConnectionSettings settings);public override void Read(Spanbyte buffer);public override byte ReadByte();public override void Write(ReadOnlySpanbyte data);public override void WriteByte(byte data);}I2C 总线的通信步骤在开始实验之前首先说明一下 I2C 总线的读取和写入的步骤。因为 .NET 帮我们封装好了一些操作方法这大大简化了 I2C 的操作难度即使你没有丰富的硬件知识也可以顺利的操作硬件所以我们不必像开发单片机一样去研究设备之间通信的时序图当然如果通信出现错误的话还是需要用时序图帮助判断。读取向从设备写入要读取的寄存器的地址这类似于数组的指针需要先定位到相应的位置才能读取。通常地址是一位的只需要调用 WriteByte() 方法即可但也有特殊情况比如两个字节的地址或者命令地址时就需要调用 Write() 方法。读取从设备中的数据定位完成后就可以向从设备请求数据了。如果要读取一个字节的数据那么就调用 ReadByte()方法如果要读取多个字节首先需要实例化一个 byte 数组通过调用 Read() 方法来读取多个数据读取的数据取决于数组的长度。比如要读取 8 个字节的数据代码如下C# Spanbyte readBuffer stackalloc byte[8]; sensor.Read(readBuffer);写入写入一般用于配置从设备的寄存器。因为你不可能只向从设备写入寄存器的地址吧所以通常会调用 Write() 方法。比如向地址为 0x01 的寄存器写入一个字节的数据代码如下Spanbyte writeBuffer stackalloc byte[] { 0x01, 0xFF }; sensor.Write(writeBuffer);温湿度传感器读取实验本实验选用的传感器为奥松的 DHT12。主要考虑到这个传感器读取非常简单不用配置价格便宜很适合用来练手。数据手册地址https://wenku.baidu.com/view/325b7096eff9aef8941e06f9.html 。 提示数据手册Datasheet是电子元件的使用说明书包括介绍、电气特性、通信协议、性能等方面的内容。拿到数据手册时我们应该关注什么1. 关注该元件的通信协议。有些设备支持多种通信协议如本实验用到的 DHT12 不仅支持 I2C还支持 1-Wire 协议。选择合适的通信协议进行编程。2. 关注打算使用的通信协议的细节。比如 I2C 总线你需要关注元件的地址、各个寄存器的地址、最大传输速率等等。3. 关注该元件的通信的细节。有些设备的通信很简单并不需要拐弯抹角但还有一些设备需要发送一些额外的命令。比如你在发送完寄存器地址后还需要紧接着发送一段命令用于决定是读还是写该寄存器返回数据时是按字节byte返回还是按字word返回等。4. 关注各个寄存器的作用和配置。数据手册中基本上都会把每个寄存器逐条列出注意细节即可。传感器图像硬件需求DHT12x14.7 kΩ 电阻x2杜邦线若干电路SCL - SCLSDA - SDAVCC - 5VGND - GND如果你的 DHT12 是裸板的话需要像电路图中一样给 SDA 和 SCL 加上上拉电阻。代码打开 Visual Studio 新建一个 .NET Core 控制台应用程序项目名称为“Dht12”。引入 System.Device.Gpio NuGet 包。新建类 Dht12替换如下代码在 Program.cs 中将主函数代码替换如下static void Main(string[] args){ I2cConnectionSettings settings new I2cConnectionSettings(1, Dht12.DefaultI2cAddress); UnixI2cDevice device new UnixI2cDevice(settings);using (Dht12 dht new Dht12(device)) {while (true) { Console.WriteLine($Temperature: {dht.Temperature.ToString(0.0)} °C, Humidity: {dht.Humidity.ToString(0.0)} %); Thread.Sleep(2000); } }}发布、拷贝、更改权限、运行效果图原文地址https://www.cnblogs.com/zhanggaoxing/p/10908670.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com