购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第六章

实例四
——I2C总线接口

6.1 I2C总线

I2C总线是一种广泛应用且功能强大的实现设备间通信的同步串行通信总线。I2C总线使用两个双向的集电极开路或漏极开路线路,即串行数据线(SDA)和串行时钟线(SCL)。SDA和SCL都是双向的,均需要采用电流源或上拉电阻连接至VCC,上拉电阻的大小取决于I2C线路上的电容量。为了实现连接设备的线与功能,连接至I2C总线的设备接口输出部分必须是漏极开路(Open Drain, OD)驱动或集电极开路OC(Open Collector, OC)驱动。I2C总线采用SCL上的时钟信号实现位信息的同步,通过SDA传输数据,即在SCL线高电平SDA线需保持稳定。

I2C总线上有两类节点,主节点和从节点。主节点产生时钟并初始化与从节点的通信。从节点接收时钟并对主节点的呼叫做出反馈。I2C总线是多主控总线,这意味着可以存在多个主控节点。此外,可以在消息之间(STOP信号之后)改变主节点和从节点。无论何种情况,I2C总线上的设备有四种潜在的操作模式:主发送、主接收、从发送、从接收。实际应用中,大部分设备只使用单一的角色,以及工作在相对应的两个模式下。I2C总线设备的连接如图 6.1。

图 6.1 基于I2C总线的设备连接

I2C总线典型的应用电压为+5V和+3.3V。I2C总线可以连接的节点数量受地址空间和总线400 pF电容的限制。因此,实际通信距离在几米之内。同时,相对较高的阻抗和较低的抗扰度要求I2C总线上的设备具有共用接地电位。I2C总线在标准模式时速率为 100kbps,快速模式时速率为 400kbps,快速+模式时速率为 1Mbps,高速模式时速率为 3.4Mbps,可采用 10 kbp s的低速模式,也允许采用其他的时钟频率。

I2C总线支持多种采用不同技术(CMOS, NMOS, bipolar)实现的设备的连接。总线上的低电平和高电平依赖于连接设备的VDD。设备输入参考电平定义为VDD的 30%和 70%,即VIL不高于 0.3*VDD,VIH不低于 0.7*VDD。图 6.2 为不同电压供电设备采用同一I2C总线连接。图6.2 中I2C总线以VDD1 为参考,VDD2 和VDD3 是可以不同于VDD1 的。

图 6.2 不同电压供电设备采用同一I2C总线连接

除了数据位 0 和 1 之外,I2C总线使用了与数据位不同的START和STOP信号,以用作消息定界符。I2C总线定义了以START信号开始、以STOP信号结束的三种基本传输类型:主节点写数据至指定从节点的单消息,主节点从指定从节点读数据的单消息,主节点给一个或多个从节点发布至少两个读或写信息的组合格式消息。在I2C总线空闲的情况下,才可以初始化(启动)数据传输。在STOP信号之后,如果SDA和SCL均为高,则认为总线空闲。I2C通信协议如图 6.3 所示。

图 6.3 I2C通信协议

从图 6.3 可知,I2C总线数据的传输过程,START起始条件、STOP中止条件以及有效数据位。I2C总线上所有数据的传输以START开始,以STOP结束。当SCL为高时,SDA从高到低的转换,定义为START起始条件。当SCL为高时,SDA从低到高的转换,定义为STOP中止条件。在SCL高电平期间,SDA必须保持稳定。只有当SCL为低电平时,SDA才可以实现高低电平转换。

SDA传输的每个字节必须是 8 位长度。每次可以传输的字节数不设限制。每个传输的字节之后必须有确认位(ACK)。数据采用MSB在前原则传输。由于各种原因当从设备无法接收或传输完整字节时,从设备可以拉低SCL时钟线,以强制主设备进入等待状态。当从设备准备好并且释放SCL后,数据传输继续。I2C总线上的数据传输如图 6.4。

图 6.4 I2C总线上的数据传输

I2C总线上传输的设备地址为 7 位长度,之后的第八位为数据方向位(R/W)。第八位数值为 0,表示写操作,数值为 1 表示读操作。图 6.5 为完整的I2C数据传输。

图 6.5 完整的I2C数据传输

主设备产生STOP中止条件中止数据传输。如果主设备需要继续采用该总线通信,可以在不产生STOP中止条件的情况下产生一个重复性START起始条件(Sr)并且制定另一个从设备。采用该方式,可以组合多种形式的读写传输。图 6.6 为组合数据传输。

图 6.6 I2C组合数据传输

通常情况下,I2C总线采用 7 位地址空间,也可采用用 10 位地址空间。I2C总线上的每个设备均有一个特定的设备地址,以与总线上的其他设备相区分。许多从节点需要在上电时进行配置,以确定该设备功能或行为。主节点访问从节点的内部寄存器,实现从节点的配置。从节点可以有一个或多个寄存器,以保存信息、读或写数据。

I2C总线设备也采用 10 位地址,扩展了地址空间和设备数目。7 位地址的设备和 10 位地址的设备可以连接至同一I2C总线,且可以应用于I2C总线的所有速度模式。相对而言,10 位地址应用得不是那么广泛。10 位地址由两个字节组成,在START起始条件(S)或重复性START起始条件(Sr)之后传输。第一个字节的前七位是 1111 0XX,其中XX为 10 位地址的最高两位;第一个字节的第八位(R/W)决定了消息的传输方向。7 位地址设备的读写格式均适用于 10位地址设备。

6.2 TMP006 红外温度传感器

TMP006 是一款具有数字接口的非接触式红外温度传感器,主要用于物体表面温度测量 【16】 【17】 ,如图 6.7。

图 6.7 红外温度传感器TMP006 目标测量

保证目标温度测量和计算的精度,应用TMP006 时,需要考虑两个主要的基本测量限制:目标物体的表面发射率,以及TMP006 位置与目标大小的关系。TMP006 仅可用于红外辐射率大于 0.7 的目标表面温度计算,并且优选大于 0.9 的对象。当被测目标表面红外辐射率很低时,可以采用涂抹油漆的方式,以达到 0.8-0.96 的红外辐射率。测量时,将TMP006 直接放在目标物体的正面,并使目标表面与TMP006 平行,且距离d小于圆形目标半径r的 1/2,如图 6.7所示,这样就可以确保传感器捕获的红外信号至少有 90%来自目标。

TMP006 使用集成在硅片上的热电堆吸收被测目标的红外能量辐射,依据热电堆电压的相应变化以确定目标温度。TMP006 工作电压 3.3V,工作电流低至 240µA,工作温度范围–40°C~+125°C,数字输出传感器电压 7 μV/°C。TMP006 为 1.6mmX1.6mm晶圆芯片级封装(WCSP)器件(DSBGA)。

TMP006 在CC3200-LAUNCHXL开发板上的应用电路如图 6.8。

图 6.8 TMP006 电气原理图

从TMP006 电气原理图可知,设备地址ADDR(1:0)配置为 01B,未使用/DTRDY引脚,采用I2C接口输出传感数值。

TMP006 内部数据寄存器存储了配置信息、温度测量结果和状态信息,寄存器映射图如表6.1。

表 6.1 寄存器映射

如表 6.1 所示,TMP006 的温度寄存器Ta是一个 14 位只读寄存器,存储最近一次的局部参考温度转换数据Ta。上电或软复位后,在第一次温度转换完成之前,读取该温度寄存器的数值为 0 摄氏度(0000h)。TMP006 温度寄存器的数据采用二进制补码有符号整数格式,最小位为 1/32℃(0.03125),如表 6.2。

表 6.2 TM006 温度数据格式

传感器电压寄存器Vo是一个 16 位只读寄存器,数据采用二进制补码有符号整数格式。最低位LSB为 156.25nV。全范围数值是±5.12mV。红外检测对象的温度参考传感器电压寄存器数据与温度寄存器数据计算得出。关于TMP006 温度计算方程式请参考文档TMP006 User's Guide用户手册。

TMP006 有一个用于寻址给定数据寄存器的 8 位指针寄存器,标识了在I2C总线上读写命令对应的数据寄存器。每个写命令均会设置该寄存器。在执行读命令之前,必须先执行写命令,以在该寄存器中设置合适的值。指针寄存器的上电复位POR值为 00h,该值将选择热电堆电压寄存器Vobject(Vo)。关于TMP006 的详细编程信息,请参见TMP006 数据手册。

6.3 I2C测试

6.3.1 TMP006 温度测试

I2C_demo示例程序,测试TMP006 温度传感器,测试数据如图 6.9 所示。

图 6.9 采用I2C_demo示例程序检测TMP006 温度传感器

从测试记录可知,测试过程中读取了如表 6.1 所示的TMP006 寄存器。其中,配置寄存器、生产商ID寄存器、设备ID寄存器内容与TMP006 数据手册一致。传感器电压寄存器数值为0xfe8d,由此可知传感器输出电压信号Vo。环境温度寄存器数值为 0x0f28,由此可知环境温度Ta。

基于以上两个数据,采用TMP006 对象温度计算公式 【16】 ,可计算出TMP006 采用红外方式检测的目标对象温度。

修改并采用CC3200 软件开发套件中提供的OOB示例程序,测试TMP006 温度传感器,测试数据如图 6.10 所示。

图 6.10 采用OOB示例程序检测TMP006 温度传感器

从测试数据可知,相关寄存器参数测试结果一致;由于测试时刻不同,传感器电压寄存器和温度寄存器略有差异。测试程序见 6.5,程序中调用了温度计算函数。

6.3.2 I2C通信距离测试

基于CC3200-LAUNCHXL开发板,采用相互读取I2C接口设备(振动和温度)的方式,在相同的环境下对I2C总线通信距离进行多次读取的功能测试,测试结果如表 6.3。

表 6.3 I2C总线测试记录

从上表可知,采用一致性较高的程序,通信成功与否与I2C接口设备、I2C总线模式、系统侧软件、通信距离、通信线缆均有关系。例如,通信距离越短,在各种模式或设备下读取操作更易于成功;相较于多芯线缆,单芯线缆更具有优势;相较于振动传感器,可以在更远的距离读取温度传感器参数;整体而言,标准模式下可以实现更远距离的I2C参数读取;在外接线缆的情况下,CC3200-LAUNCHXL开发板OOB读取几乎都不成功,只有采用 0.5 米单芯线缆时,I2C标准模式 100kbps工况下读取操作成功。

6.4 I2C程序

6.4.1 I2C引脚配置函数

I2C引脚配置程序如下:

6.4.2 I2C初始化函数

I2C初始化函数I2C_IF_Open()使能I2C接口、配置I2C为标准模式 100kbps或快速模式400kbps。

函数I2C_IF_Open()的定义如下:

6.4.3 用户命令解析函数(串口)

解析用户命令(串口),并调用相应的I2C应用程序接口函数API。

6.4.4 I2C命令处理函数

命令处理函数以读命令和读寄存器命令为例。读命令处理函数解析所获得读命令参数,例如I2C设备地址和读数据长度,同时,执行I2C读取操作,并给出操作结果。

读命令处理函数解析所获得读命令寄存器参数,例如I2C设备地址、寄存器偏移地址和读数据长度,同时,执行I2C写寄存器地址及读指定长度数据,并给出操作结果。

关于I2C总线写命令和写寄存器命令,参见CC3200 SDK软件开发套件中I2C_demo示例程序。

6.4.5 TMP006 温度读取函数

默认情况,TMP006 温度数值为摄氏温度。TMP006DrvGetTempBoth()为TMP006 环境温度和传感器参考温度读取函数。

温度计算函数如下:

采用I2C总线读取TMP006 温度传感器数据,主函数如下: /bNsYIpXhkVDV1HWSIrkSew0lVJi+O9EHM1O5QP0TxTnUDl+OXvQeGoV6NimBRPZ

点击中间区域
呼出菜单
上一章
目录
下一章
×