【物联网智能网关-07】PCF8591 AD转换模块I2C通信实现

简介: 最早接触I2C接口是在2007年初次接触.NET Micro Framework的时候,当时并没有和实际的硬件打交道,而是从软件层面封装了一个可以进行I2C总线虚拟通信的模拟器

.NET Micro Framework 和.NET Compact Framework不同,并不是.NET Framework的子集,而是更贴近硬件底层,它提供了许多诸如GPIO、PWM、SPI、I2C和OneWire等硬件操作类库。由此可以让普通的软件开发人员相对平滑的过度到硬件开发领域,也足以让以前相对封闭的硬件系统通过二次开发的方式扩展硬件模块成为一种流行(随着物联网技术的深入发展,未来软件不仅需要组态化,硬件其实更需要组态化)。

由于非硬件研发出身,最早接触I2C接口是在2007年初次接触.NET Micro Framework的时候,当时并没有和实际的硬件打交道,而是从软件层面封装了一个可以进行I2C总线虚拟通信的模拟器(参见博文《.Net MicroFramework研究—带I2C总线的模拟器》),后来在2008年为TI DM355的芯片移植.NET Micro Framework,我的任务就是I2C、USB等硬件驱动的开发。在TI DM355上有一个红外遥控接收器单元(MSP430单片)和DM355通过I2C接口进行通信,从而让.NET Micro Framework可以接收遥控器的按键信息。

后续在Cortex-M3平台,所接触的模块都是SPI接口的,I2C接口的反而没有,所以相关接口一直没有调试。最近有一个客户在使用物联网智能网关时候,发现引出的IO不够,需要扩展几路AD,推荐了一个基于PCF8591芯片的AD/DA转换模块,所以我才得以再次深入研究I2C接口。

如下是.NET Micro Framework的I2C接口类库:

public class I2CDevice : IDisposable

    {

        public I2CDevice.ConfigurationConfig;

        protectedbool m_disposed;

        publicI2CDevice(I2CDevice.Configurationconfig);

        public static I2CDevice.I2CReadTransaction CreateReadTransaction(byte[] buffer);

        public static I2CDevice.I2CWriteTransaction CreateWriteTransaction(byte[] buffer);

        public void Dispose();

        public int Execute(I2CDevice.I2CTransaction[] xActions, int timeout);

        public class Configuration

        {

            publicreadonly ushortAddress;

            publicreadonly intClockRateKhz;

            publicConfiguration(ushort address, int clockRateKhz);

        }

        public sealed class I2CReadTransaction : I2CDevice.I2CTransaction{}

        public class I2CTransaction

        {

            publicreadonly byte[]Buffer;

            protectedI2CTransaction(byte[] buffer);

        }

        public sealed class I2CWriteTransaction : I2CDevice.I2CTransaction{}

   }

I2C的读写操作通过定义I2CDevice.I2CTransaction数组,可以实现批量操作。

物联网智能网关基于STM32F207/STM32F407芯片,其I2C接口即支持主模式也支持从模式(I2C接口类仅支持主模式),总线速度支持两种,标准速度(高达100KHz)和快速(400KHz),I2C地址支持7位和10位两种(驱动只支持7位地址)。

PCF8591芯片是8位A/D和D/A转换器,4路模拟输入,1路模拟输出。其I2C地址是可以进行硬件编码的(3个地址引脚A0、A1和A2),其地址编码规则如下:
1.png
对I2C来说,一般读操作的时候地址的最低位为1,写操作的时候地址的最低位为0。我们选用的模块,看原理图可知,A2、A1和A0管脚都被直接连接到GND,所以这部分都是0,所以对读地址来说是0x91,写地址是0x90。.NET Micro Framework底层I2C驱动实现的时候,地址会自动左移,最低位是不算地址的一部分的(所以才说是7位地址支持),所以我们在填写I2C模块地址的时候,要填写的是读地址(或写地址)右移一位的数字,也就是0x48。

总线频率我们理论上可以选择10K到400K,这里我们选择100K。

下面我们详细介绍一下PCF8591是如何进行AD读取和DA输出的。

读AD操作:
2.png
写DA操作
3.png
控制字的定义如下:
4.png
对AD0~AD3通道来说,我们常用的控制字的值为0x0,0x1,0x2,0x3。

对DA来说,我们常用的控制字的值为0x40。

注意:如果我们循环读取AD0至AD3,由于读周期读取的AD转换值,其实是上一次的转换结果,所以我们读取AD1的时候,其实是读取的AD0,依次类推(上电第一次读取的值是0x80)。

有了以上知识,我们就可以进行编程了,核心代码如下:

      public static void Main()

      {

           I2CDeviceI2CBus = new I2CDevice(new I2CDevice.Configuration(0x48, 100));

            byte[]bytAD = new byte[4];

            bytebytDA = 0;

            while(true)

            {

                for(byte i = 0; i < 4; i++)

                {

                    byte[]bytWData = new byte[1]{ i };

                    byte[]bytRData = new byte[1];

                    I2CDevice.I2CTransaction[] i2c = newI2CDevice.I2CTransaction[2];

                    i2c[0] = I2CDevice.CreateWriteTransaction(bytWData);

                    i2c[1] = I2CDevice.CreateReadTransaction(bytRData);

                    I2CBus.Execute(i2c, 100);

                    bytAD[i - 1 < 0 ? 3 : i- 1] = bytRData[0];

                }

                Debug.Print("AD0=" + ShowData(bytAD[0]) + " AD1=" + ShowData(bytAD[1]) + " AD2=" + ShowData(bytAD[2]) + " AD3=" + ShowData(bytAD[3]));

                byte[]bytWData1 = new byte[2]{ 0x40, bytDA };

                I2CDevice.I2CTransaction[] i2c1 = newI2CDevice.I2CTransaction[1];

                i2c1[0] = I2CDevice.CreateWriteTransaction(bytWData1);

                I2CBus.Execute(i2c1, 100);

                Debug.Print("DA0=" + ShowData(bytDA));

                bytDA += 10;

                Thread.Sleep(1000);

            }

        }

PCF8591模块和物联网智能网关接线有四根,分别是VCC、GND、SCL和SDA,VCC可以接5V或3.3V(我们接3.3V)、SCL接PB6,SDA接PB7。程序部署运行的效果图如下:

image.png

通过旋转模块的上的模拟开关,我们会发现AD3的值可以由0向255变化。

注意:为了正常运行本实例,物联网智能网关固件版本需要升级到V1.7.15以上,TinyBooter也需要同步升级。

固件下载地址:http://www.sky-walker.com.cn/MFRelease/firmware/MFv42_YF_Wisteria207.rar

 ----------------------------------------------------   

源码下载:http://www.sky-walker.com.cn/MFRelease/Sample/PCF859IT_I2C.rar

MF简介:http://blog.csdn.net/yefanqiu/article/details/5711770

MF资料:http://www.sky-walker.com.cn/News.asp?Id=25

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
1月前
|
人工智能 监控 物联网
深度探索人工智能与物联网的融合:构建未来智能生态系统###
在当今这个数据驱动的时代,人工智能(AI)与物联网(IoT)的深度融合正引领着一场前所未有的技术革命。本文旨在深入剖析这一融合背后的技术原理、探讨其在不同领域的应用实例及面临的挑战与机遇,为读者描绘一幅关于未来智能生态系统的宏伟蓝图。通过技术创新的视角,我们不仅揭示了AI与IoT结合的强大潜力,也展望了它们如何共同塑造一个更加高效、可持续且互联的世界。 ###
|
1月前
|
安全 物联网 物联网安全
智能物联网安全:物联网设备的防护策略与最佳实践
【10月更文挑战第26天】随着物联网(IoT)技术的快速发展,智能设备已广泛应用于智能家居、工业控制和智慧城市等领域。然而,设备数量的激增也带来了严重的安全问题,如黑客攻击、数据泄露和恶意控制,对个人隐私、企业运营和国家安全构成威胁。因此,加强物联网设备的安全防护至关重要。
101 7
|
1月前
|
传感器 存储 运维
智能物联网:LoRaWAN技术在低功耗广域网中的应用
【10月更文挑战第26天】本文详细介绍了LoRaWAN技术的基本原理、应用场景及实际应用示例。LoRaWAN是一种低功耗、长距离的网络层协议,适用于智能城市、农业、工业监控等领域。文章通过示例代码展示了如何使用LoRaWAN传输温湿度数据,并强调了其在物联网中的重要性和广阔前景。
111 6
|
1月前
|
传感器 监控 物联网
智能物联网:LoRaWAN技术在低功耗广域网中的应用
【10月更文挑战第27天】LoRaWAN技术是低功耗广域网(LPWAN)的重要代表,以其远距离通信、低功耗和低成本部署等优势,广泛应用于智能城市、农业监测和环境监测等领域。本文介绍LoRaWAN的工作原理及其实际应用,并提供示例代码展示如何使用LoRaWAN进行数据传输。
68 2
|
1月前
|
存储 边缘计算 物联网
揭秘边缘计算:物联网时代的分布式智能
揭秘边缘计算:物联网时代的分布式智能
51 0
|
1月前
|
物联网 智能硬件
物联网技术:连接智能生活的桥梁
物联网技术:连接智能生活的桥梁
|
1月前
|
安全 物联网 物联网安全
智能物联网安全:物联网设备的防护策略与最佳实践
【10月更文挑战第27天】随着物联网技术的快速发展,智能设备已广泛应用于生活和工业领域。然而,物联网设备的安全问题日益凸显,主要威胁包括中间人攻击、DDoS攻击和恶意软件植入。本文探讨了物联网设备的安全防护策略和最佳实践,包括设备认证和加密、定期更新、网络隔离以及安全标准的制定与实施,旨在确保设备安全和数据保护。
76 0
|
2月前
|
安全 5G 网络性能优化
|
3月前
|
监控 负载均衡 安全
微服务(五)-服务网关zuul(一)
微服务(五)-服务网关zuul(一)
|
10天前
|
NoSQL 前端开发 测试技术
👀探秘微服务:从零开启网关 SSO 服务搭建之旅
单点登录(Single Sign-On,简称SSO)是一种认证机制,它允许用户只需一次登录就可以访问多个应用程序或系统。本文结合网关和SaToken快速搭建可用的Session管理服务。
55 8

相关产品

  • 物联网平台