1、概述: 在使用单片机或芯片级通信时,I2C是一种必不可少的通信协议。 I2C只有两线接口:一条数据线 (SDA) ,另一条时钟线 (SCL),通信方式比较简单可靠。但由于SDA、SCL为漏极开路结构(OD),因此硬件设计时必须接有上拉电阻,阻值的大小常为 1k8,2K2,4k7和 10k;当I2C线空闲时,两根线均为高电平。 本文中以自己项目中所用到的具有I2C通信协议的EEPROM芯片24LC64为例,EEPROM芯片硬件电路如图1所示,数据线和时钟线处于空闲状态时,采用LOTO的OSC802示波器测量空闲时的波形如图2所示。 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg 图1 I2C芯片电路 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg 图2 示波器测量I2C空闲时状态 2、I2C协议 快速搭建单片机和芯片之间通信,首先要熟悉I2C通信协议,I2C协议主要是怎样判断数据的起始、停止、ACK;下面将一一介绍: 起始信号:当SCL为高电平期间,SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平信号。 停止信号:当SCL为高电平期间,SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。 I2C起始和停止信号示意如图3所示; file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg 图3 I2C起止信号 ACK:单片机每发送一个字节,就在时钟脉冲第9个周期期间释放数据线,由EEPROM芯片发送一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示EEPROM已经成功地接收了该字节。 对于反馈有效应答位ACK的要求是,EEPROM在第9个时钟脉冲之前的低电平期间将SDA线拉低或一直保持低电平;并且确保在该时钟的高电平期间为稳定的低电平。(通过示波器捕捉功能,采集到的波形如图4所示) file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.gif 图4 示波器测量I2C总线起始信号 同样应答信号在第9个时钟脉冲为高电平时,规定为非应答位(NACK),表示EEPROM接收该字节没有成功。对于反馈非应答位为NACK时,单片机将会继续发送相同的字节。(测量波形如图5所示) file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.gif 图5 非应答时信号状态3、数据的有效性I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
虽然只要求在高电平期间保持稳定,但是数据在SCL的上升沿到来之前就需准备好,数据是在SCL的上升沿打入到(EEPROM)中的。 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image011.gif 4、数据传输 在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。数据位的传输是边沿触发。但一般数据是以时钟脉冲高电平时SDA状态确定的。 单片机收到来自EEPROM发出的应答后就可以发送数据。传送数据时,单片机就逐个发送数据字节,但每发送一个字节后都要等待应答。 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image013.jpg 等待应答时,时钟脉冲将有一定时间处于低电平的延时,为传输下一个字节的数据做准备。采用LOTO示波器捕捉的信号波形如图8所示 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image015.gif 图7 单片机传输连续数据时序 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image017.gif 图8 示波器捕捉数据发送时序 ◆ 发送停止位. · EEPROM收到停止信号后,进入到一个内部的写入周期,需要一定时间(芯片不同时间不同),SCL和SDA被释放。此时任何操作都不会被EEPROM响应;(因此以这种方式的两次写入之间要插入一个延时,否则会导致失败)捕捉信号如同9所示 file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image019.gif file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image020.gif
|