hardware

【图文】Intel Edison C++ 开发之 I2C/IIC(Part1)–使用Eclipse IDE 在爱迪生上进行原生程序开发


这是一篇完整的关于在Intel Edison上进行原生程序开发的系列文章,以爱迪生通过I2C BUS连接温湿度传感器为例,详细地展示如何在 Eclipse上使用 C++ 进行 Edison 开发。文章将会涉及硬件、MRAA库、开发环境的设置、yocto linux 内核等内容,精彩内容不容错过。欢迎加入 Gekius 开发群(Q群: 329401876)深入讨论 Intel Edison IoT 及嵌入式开发的方方面面 :)

一、I2C/IIC BUS 

Intel Edison 是英特尔公司推出的面向 IoT 市场的新一代计算平台,要想深入地了解其开发的方方面面需要结合硬件进行研究,目前市面上的传感器已经向着集成化的方向发展,许多公司推出的产品中开始兼容各类IO接口,能方便快速地与MCU或者其它IC直接连接从而大大缩短产品开发的周期。而这些接口中常用的有 UART、I2C、SPI等,这里我们通过I2C(也叫 IIC,后面都使用I2C)的实例深入地了解Intel Edison在这方面的支持。

I2C是80年代由飞利浦公司开发,主要用于飞利浦内部开发的芯片通讯使用,因为其结构简单速度快(当时)的特点,随着06年授权的到期越来越多的公司开始争相研发兼容I2C的接口,其中不乏像 Intel, 意法半导体,摩托罗拉这样强有力的对手。到目前的版本已经可以支持工作在Ultra Fast-Mode模式下,频率可以达到5MHz,对于集成电路内部通信来说十分实用。

I2C是支持多主从设备,单模类型的串行总线,它包含两条通信线路 SDA/SCL,常用工作电压为 5V 或者 3.3V。SDA 为数据线用来在主从设备之间传输数据;SCL 为串行时钟输出,由主设备发出用以协调和控制传输过程。I2C在内部设计上使用漏极开路 (open-drain) 或者极电极开路 (open-collection) 的方式连接总线,使用上常在外部加上拉电阻来拉高总线电压,这样可以很大程度上提高抗干扰的能力。

I2C 多主从设备及不同供电器件共享总线

I2C 多主从设备及不同供电器件共享总线

I2C采用 7 bit 或者 10 bit 地址空间,总线速度在标准模式下可达 100 kbit/s,理论上支持更低速的传输率。目前的版本还支持 400 kbit/s fast mode, 1 Mbit/s fast mode plus,及 3.4 Mbit/s high speed mode,速度的提升让最初只是为集成系统内部通信为目的设计的总线,放开到能够适应外部高速周边器件。

I2C也有它的缺点,首先是地址空间比较窄可以同时支持设备数量上有限制;标准I2C设备使用静态地址,在总线上挂相同类型的设备会导致地址冲突无法使用;虽然速度有所提升,但较 SPI 等接口来说总线速度还是跟不上,对于高速器件来说无法满足要求;总线总电容不能高于 400 pF,也使得它的传输距离受到了限制。

但不管怎么说一种总线的出现只是为了某种特定的目的而生,类似于可穿戴设备往往考虑得更多的能耗和功率问题而非是速度,I2C正好满足了这一需求。

1. I2C 总线协议

使用I2C总线的设备扮演着两种角色,主机或者从机。同时有四种工作模式,分别为:主机发送,主机接收,从机发送和从机接收。同一时刻一个设备只工作在一种工作模式下。

I2C总线协议从外部上看,是以一个字节为单位传输数据,由主设备控制整个传输过程,从机在传输过程中可以“暂停”传输使得自己有机会处理数据,之后释放总线控制让主机继续传输,每当1个字节传输完毕后主从机会短暂互换模式,由从原接收方向原发送方发送 1 bit 的确认位,称之为 ACK (acknowledge),表示接收方已经正常接收到传送过来的一字节数据(NACK 表示接收不正常或者目前设备忙不能接收)。

因为I2C可以同时存在多个主从设备,就会出现争抢总线的情况。当没有设备使用总线时,因为open-drain的关系,设备与总线是断开的,因为总线上接有上拉电阻(通常设置得足够高,如 4.7kΩ),使得总线处于高电位。当设备占用总线时(逻辑电平0),三极管导通,因为上拉电阻足够大使得总线被下拉,电压趋近于0。也就是说只要有设备占用总线,总线上就会出现低电平。

典型的IIC single message 示例

图1. 典型的IIC single message 示例

图1显示出了一个典型的I2C传输过程,具体过程如下:

  1. 由主机发起通讯,主机发送“起始”信号,表现为 SCL为高电平,SDA同时出现下降沿,如图1绿点所示。
  2. 图1所示为主机发送,从机接收,由主机发送7位的从机地址,地址后一位为读写位,0表示主机要写数据,1为主机读数据,图上为0表示地址由主机发送给从机。
  3. 从机接比对自己的地址,如果相同,由从机向主机发送1位的确认位(ACK/NACK),图上为 NACK (此为设备协议指定,该传感器为被动式发送地址之后需要激活时间,因此返回 NACK )。
  4. 最后主机再次得到总线控制权,SCL 上升到达高电平之后,SDA出现上升沿,这代表“终止”信号如图中红点处所示

有几点值得关注的,I2C为电平有效,SCL低电平时主机改变 SDA 信号,在SCL上升时必须保持信号稳定,在SCL处于高电平时信号有效,数据被送往从机,此时主机还得维持SDA信号使得在整个SCL高电平期间让从机有时间稳定内部信号,也就是说对于标准模式下,从机需要在4 μs内让信号在内部稳定,整个过程如下图所示

I2C协议物理层

图2 I2C协议物理层

 

整个传输过程都由主机进行控制,从机只有在发送确认位的时候有 SDA 的控制权,此外在确认位之后I2C标准允许从机“占用” SCL(clock stretching ),表示从机目前无法进一步接收或者发送数据,需要等待,图1中终止信号之前很长一段低电平就是 clock strecching (在此实例中,传感器需要时间唤醒)。最后,图1所示的为 single message,也就是在传输完8位数据之后,立即终止。实际应用中还有 combined message,即让主机可以一次传输多个字节,combined message 标志为,传输完地址之后不出现终止信号,而是立即传输其它字节,整个过程完成后才出现终止信号,如下图所示。

combined message 实例

图3. combined message 实例

最后,因为I2C BUS上可以同时存在多个主从设备,这就会引发争用总线的问题,在上边我们提到过设备要“占用”总线,需要拉低总线电平,如果设备在传输数据过程中要写逻辑“1”时,设备会用总线电平跟自己希望发送的高电平(逻辑1)进行比较,如果发现不一致,那么就意味着同一时间有其它设备在使用总线,那么设备会放弃本次传输。在极端的情况下,多个设备在总线上传输的时间与信号一模一样,这样从机会认为只有一个数据被传输,而其它的数据会被忽略。

此外,对于I2C还需要关注缓存和复用技术(因为是双向总线),以及不同速率下传输等问题,这些我们将会在以后的文章中再针对具体问题进行说明,欢迎大家参与我们的讨论:)我们的Q群:329401876

hardware
Charles Chase 致力于为人类提供廉价持久能源的计划解决全球电力问题
hardware
【图文】Intel Edison Arduino kit 初步上手安装教程
Intel Edison
Intel Edison Kit for Arduino 开箱展示,SD卡尺寸电脑震撼到货(【Gekius】图文)
There are currently no comments.