第11章单片机与I2C总线芯片的接口 重点:2C通信协议、常见芯片的使用 难点:I2C通信协议 学时:4 11.1℃总线的基本概念 1.C总线概述 IC(Inter-Integrated Circuit)总线是由PHILIPS公司开发的2线式串行 总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用 的一种总线标准。它是同步通信的一种特殊形式,具有口线少,控制方式 简单,器件封装小,通信速率高等优点,被列入世界性的工业标准。现在 有许多外围器件与微控制器的接口采用℃串行总线。 2C总线协议定义如下: (1)只有在总线非忙时才被允许进行数据传送。 (2)在数据传送时,当时钟线为高电平,数据线必须为固定状态,不 允许有跳变。因为时钟线为高电平时,数据线的任何电平变化将被当作总 线的启动或停止条件。 2.C总线的电气特性与结构 I2C总线是由数据线SDA和时钟线SCL构成的串行总线,可发送和接 收数据。采用2C总线的器件均并联在总线上,每个器件内部都有2C接 口电路,用于实现与2C总线的连接,连接方式如图所示
一般具有I2C总线的器件其SDA和SCL引脚都是漏极开路(或集电极 开路)输出结构。因此实际使用时,SDA和SCL信号线都必须要加上拉电 阻Rp。上拉电阻一般取值3一1OK2。这种开漏结构使得当总线空闲时,这 两条信号线都保持高电平,几乎不消耗电流,电气兼容性好,上拉电阻接 5V电源就能与5V逻辑器件接口,上拉电阻接3V电源又能与3V逻辑器件 接口。因为是开漏结构,所以不同器件的SDA与SDA之间、SCL与SCL 之间可以直接相连,不需要额外的转换电路。 3.2C总线数据传输时序 SDA- SCL- 开始 结 (2)I2C总线上的数据传输格式 I2C总线上的数据传输必须遵循总线规范。主CPU发出起始信号表明 一次数据传送的开始,其后为寻址字节,寻址字节由高7位地址和一位方 向位组成,方向位表明主CPU与从器件之间的数据传送方向,该位为“0” 时表明CPU对从器件进行写操作,为“1”时是读操作。寻址字节后是按 指定地址读、写操作的数据字节与应答位。主CPU发出寻址信号后,地址 与自己相符的从器件便会产生一个应答信号。数据字节的后面也跟随一个 应答信号,应答信号在第9个时钟位上出现。当从器件输出低电平时为应 答信号,输出高平为非应答信号,如图所示。 主u时特L 从越件数甜输出
SDA线上的数据在时钟信号SCL高位时必须稳定。数据线上高低状态 只有当SCL线的时钟信号为低电平时才可变换,如图所示。 D 数据稳定 数稳定 数据变化 (3)I2C总线的数据传送时序 2C总线在起始位后的首字节决定哪个被控器被主控器选择。当主控器 输出一个地址时,系统中的每一器件都将起始位后的前七位地址和自己的 地址进行比较,如果相同,该器件认为自己被主控器寻址。该器件是作为 被控接收器还是被控发送器则取决于第8位(R/W位)。2C总线数据传输 时序如图11.5所示。 SDA- nao@e@四o29ea四f 一地址字节一十一数据字节…一 4.器件的寻址字节 在2C总线标准中,寻址字节由7位地址和1位方向位组成,从器件 的地址完全由引脚电平和器件类型决定,即上述的器件地址(高4位D7D4) 和引脚地址(低3位D3D1)。I2C总线中的外围芯片的器件地址由各厂家 按统一的标准制定,表为常用2C总线芯片的器件地址和引脚地址。 种类 器件地脚地 AT24C EEPROM 1010 A2A1 AT24C EEPROM 1010 A2A1 PCF85 实时时钟 1010 A0 PCF85 O扩展 0100 A2AI
PCF85 AD、DA 1001 A2A1 AD741 温度传感器 1001 A2A1 LM75 湿度传感器 PCF85 安时时钟 1010 A0 LED取动 0111 PCF85 LCD驭动 011 A0 X24C2E2PROM+看门豹1010 无 11.2虚拟I2C总线软件包 由于2C总线提供了较完善的总线协议、简单的串行连接方式,并提 供了总线操作的状态处理软件包,因而得到了广泛的应用。一些先进的微 处理器,特别是具有SOC特征的片上系统一般都将2C接口作为标准外设 接口,这就大大减轻了系统的设计复杂度和难度。对于一些不带标准2C接 口的微处理器,可以采用普通O口来模拟2C总线。北京航天航空大学的 何立民教授和周立功单片机公司都提出了虚拟2C总线软件包,只需两根 普通VO口线就可随时扩展I2C总线外围器件,大大方便了程序设计和编程 11.2.1虚拟12C总线汇编软件包 此软件包是周立功单片机公司提出的,用在单主2C总线上,硬件接 口是SDA,SCL,使用MCU的IVO口来模拟SDA、SCL总线。设计有/无 子地址的子程序是根据2C器件的特点,目的在于将地址和数据彻底分开。 软件包的函数如下。 IRDBYTE (无子地址)读单字节数据 (现行地址读) IWRBYTE (无子地址)写单字节数据 (现行地址写) IRDNBYTE(有子地址)读N字节数据 IWRNBYTE (有子地址)写N字节数据 (1)现行地址读/写即专指无子地址的器件,不给定子地址的读/写操
作。 (2)平台占用内部资源:R0,R1,R2,R3,ACC,Cy。 (3)使用前须定义变量:SLA器件从地址,SUBA器件子地址, NUMBYTE读/写的字节数,位变量ACK。 (4)使用前须定义常量:SDA、SCL总线位,MTD发送数据缓冲 区首址,MRD接收数据缓冲区首址。 (5)※子程序出口参数ACK为0时表示从器件无应答。 11.2.2虚拟2C总线C51程序软件包 此软件包用在单主方式下的I2C总线,硬件接口是SDA、SCL,使用 MCU的IVO口作SDA、SCL。软件包函数: (1)bit ISendStr(uchar sla,uchar suba,uchar*s,uchar no)(有子地 址)读N字节数据: (2)bit IRevStr((uchar sla,uchar suba,uchar*s,uchar no)(有子地 址)写N字节数据: ①、每一个函数都有返回值,当返回值为1时表示操作成功,否则操 作失败: ②、参数说明:sla为器件从地址,suba为器件子地址,*s数据接收 /发送区指针,o接收/发送字节数: ③、现行地址读/写:有子地址器件,不给定子地址的读/写操作: ④、设计有/无子地址子程序是根据2C器件的特点,把地址和数据彻 底分开: ⑤、使用时只要把2C.c复制到用户程序相应的目录,然后在用户主程 序开头加入#include<I2C.c>即可以使用上面的函数