I2C总线器件编程开发关键技术
2018-12-06黄忠良
黄忠良
(沙洲职业工学院,江苏 张家港 215600)
在微机控制领域,作为外围芯片的I2C总线器件因结构简单,可靠性高,得到了广泛应用。例如存储芯片24C02,用于记录密码及公里数等,广泛用于汽车仪表系统。I2C(Inter-Integrated Circuit)总线又称IIC总线或I2C总线,是PHLIPS公司推出的一种高性能串行总线。采用I2C串行总线技术可以精简系统硬件设计,提高系统可靠性,同时,系统也易于扩充与升级。24C02作为I2C总线接口存储芯片,属串行EEPROM,容量2 kbit,断电后数据不会丢失,常用于记录密码及公里数等场合。
1 24C02及I2C总线接口电路
24C02引脚图如图1所示,24C02与51单片机接口电路如图2所示。
图1 24C02引脚
应用I2C总线器件进行编程时,由单片机主机完成I2C总线初始化、数据传送、产生时钟信号和终止发送功能,从机24C02接收主机发送的数据。I2C总线具有总线裁决功能,主要依靠从机设备地址实现。对于24C02,8位从机设备地址的高4位固定为1010,后3位为A2、A1、A0,最后1位是数据传送的方向位 (R/W),主机将数据写入从机为“0”,主机从从机读出数据为“1”。
图2 24C02与单片机接口电路
2 I2C总线的数据传送
2.1 起始条件与停止条件
只有在起始条件满足后才能进行数据传送,起始条件与停止条件如图3所示。
图3 起始条件与停止条件
从图3可看出,当SCL处于高电平期间,SDA从高电平向低电平跳变时产生起始条件。当SCL处于高电平期间时,SDA从低电平向高电平跳变时产生停止条件。
2.2 I2C位数据传输规定
位数据的有效性及应答信号时序如图4所示。
图4 位数据的有效性及应答信号时序
主机进行数据传送时,从最高位开始逐位传送,时钟信号线为高电平期间,位数据必须保持不变。另外,每传送8位数据 (即一个字节)后,从机都必须产生一个应答信号。
3 I2C总线接口数据读写时序与编程
3.1 24C02字节读取时序
从机读操作有3种不同的方式:读当前地址内容、读随机地址内容、读顺序地址内容。图5为24C02读随机地址内容操作时序。
图5 24C02字节读时序
随机读操作允许主机对存储器的任意字节进行读操作,主机首先通过发送起始信号、从机设备地址和它想读取的字地址执行一个伪写操作。在从机应答之后,主机重新发送起始信号和从机设备地址,注意此处R/W位为1,从机响应并发送应答信号,然后输出所要求的一个8位字节数据,主机不发送应答信号但产生一个停止信号。
3.2 24C02字节写入时序
24C02字节写操作时序如图6所示。
图6 24C02字节写时序
主机先发送起始命令,然后发送从机设备地址数据,主机在收到从机产生的应答信号后,再发送一个字的地址数据,主机再次收到从机的应答信号后,最后发送数据到相应存储单元。从机再次应答,并在主机产生停止信号后开始内部数据的擦写,在内部擦写过程中,从机不再应答主机的任何请求。
3.3 24C02字节写入编程
下列代码完成24C02字节写入。
void write_byte (uchar add,uchar dat )
{
void init ();//I2C总线初始化
void start (void);//起始条件
I2Cwr_byte (0xa0);//写24C02地址
void ack (void);//从机24C02应答
I2Cwr_byte (add);//写单元地址
void ack (void);//从机24C02应答
I2Cwr_byte (dat);//写数据
void ack (void);//从机24C02应答
void stop (void);//结束条件
}
说明:上述用到的几个被调用函数定义如下。
①void init ();//I2C总线初始化
{
sda=1;
scl=1;
}
②void start (void);//起始条件
{
scl=0;//拉低SCL再改SDA以防误操作
delay ();
sda=1;
delay ();
scl=1;
delay ();
sda=0;
delay ();
}
③I2Cwr_byte(uchar dat) /*单字节传送操作*/
{
uchar i;
scl=0;//时钟线上的信号为低电平期间,数据线上电平状态允许变化
for (i=0;i<8;i++) //采用逐位传送方式
{
if (dat&0x80);//为先传最高位状态作准备
{
sda=1;
}
else
{
sda=0;
}
dat=dat<<1;//准备传送后面一位
delay ();
scl=1;//总线数据传送
delay ();
scl=0;
delay ();
}
sda=1;//主机释放总线
delay ();
}
④void stop (void);//停止条件
{
scl=0;//先拉低SCL,再改变SDA
delay ();
sda=0;
delay ();
scl=1;
delay ();
sda=1;
delay ();
}
⑤void ack (void) //从机应答
{
uchar I;
scl=1;
delay ();
while ((sda==1) && (i<200)) i++;//等待接收应答或作超时处理
scl=0;
delay ();
}
另外,有关24C02字节的读取编程见图5。
4 结束语
24CXX芯片目前已广泛应用在断电后仍然需要保持存储数据的场合。上述I2C总线存储单元读写编程方法已在Proteus上仿真调试成功。就I2C总线器件编程开发而言,正确理解操作时序至关重要,否则会导致通信失败。