单片机的常用通信方式有IIC、SPI、UART等等。通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。协议定义了数据单元使用的格式,信息单元应该包含的信息与含义,连接方式,信息发送和接收的时序,从而确保网络中数据顺利地传送到确定的地方。
这里讲一下利用通信协议来实现单片机对EEPROM的读和写操作。
IIC串行总线简介:I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。
I2C总线通过上拉电阻接正电源(因此处于高阻态,正常情况为高电平,可被拉低)。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。
每个接到I2C总线上的器件都有唯一的地址。主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由总线上接收数据的器件则为接收器。
EEPROM简介:EEPROM(带电可擦可编程只读存储器)是用户可更改的只读存储器,其可通过高于普通电压的作用来擦除和重编程(重写)。在这里主要介绍AT24C02芯片。
接下来具体讲一下如何利用IIC通信协议来实现单片机和EEPROM的读写数据。
一、数据位的有效性规定
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定(否则则认为是起始信号或者停止信号),只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
二、写操作
单片机往EEPROM里面进行“写”数据的流程图如下
①起始信号和停止信号
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。
起始信号和停止信号要注意建立的时间。
(1)起始信号
VoidI2CStart(void)
{ SDA = 1;
SomeNop( ); //等待时间可以统一定为大于10us
SCL = 1;
SomeNop( );
SDA = 0;
SomeNop( );
}
(2)终止信号
voidI2cStop(void)
{
SDA = 0;
SomeNop( );
SCL = 1;
SomeNop( );
SDA = 1;
SomeNop( );
}
②发送从机地址和数据
总线上可以连接的器件数与器件地址的可编程位数有关,AT24C系列E2PROM芯片地址的固定部分为1010,A2、A1、A0引脚接高、低电平后得到确定的3位编码。形成的7位编码即为该器件的地址码。单片机进行写操作时,首先发送该器件的7位地址码和写方向位“0”(共8位,即一个字节),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为相应,单片机收到应答后就可以传送数据了。
传送数据时,单片机首先发送一个字节的被写入器件的存储区的首地址,收到存储器器件的应答后,单片机就逐个发送各数据字节,但每发送一个字节后都要等待应答。
那么具体如何发送一个字节呢?
在SCL=0时,一位一位的(先发送最高位)将要发送的字节送到SDA总线上,将字节右移7位即得到最高位,赋给SDA,然后将字节左移一位,次高位变为最高位,继续将“最高位”赋给SDA,重复八次就可以将一个字节发送到SDA上了。
根据这种方法将器件地址、器件内地址、数据传输完后产生一个停止信号,就完成了写的操作。
应答信号 I2C总线数据传送时,每成功地传送一个字节数据后,接收器都必须产生一个应答信号,应答的器件在第9个时钟周期时,将SDA线拉低,表示其已收到一个8位数据。(所以在设计程序时要对是否有应答信号做出判断,利用while(SDA)来等待应答响应,并返回一个值,比如有应答返回1,无应答返回0)
24C02在接收到起始信号和从器件地址之后响应一个应答信号,如果器件已选择了写操作,则在每接收一个8位字节之后响应一个应答信号;当24C02工作于读模式时,在发送一个 8 位数据后释放SDA线并监视一个应答信号,一旦接收到应答信号,24C02继续发送数据,如主器件没有发送应答信号器件停止传送数据且等待一个停止信号。
以上就是“写”的操作流程,只要按照上面的流程图来即可。
三、读操作
读出过程
单片机先发送该器件的7位地址码和写方向位“0”(“伪写”),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为回应。然后,再发一个字节的要读出器件的存储区的首地址,收到应答后,单片机要重复一次起始信号并发出器件地址和读方向位(“1”),收到器件应答后就可以读出数据字节,每读出一个字节,单片机都要回复应答信号。当最后一个字节数据读完后,单片机应返回以“非应答”(高电平),并发出终止信号以结束读出操作。
简单说就是 起始信号→发送器件7位地址码和写方向位“0”→发送器件内地址→起始信号→发送器件地址和读方向位“1”→读取数据→停止信号→返回数据值。
总结
总的来说,要注意以下几点
①要掌握读和写的具体流程是怎么样的。读的时候比写多一个起始信号,因为两次发送的7位地址码后面跟着的读写方向位是不一样的。
②要注意起始信号和停止信号如何建立。起始信号是SCL在高电平时SDA产生下降沿,停止信号是SCL在高电平时SDA产生上升沿,而且要注意建立需要一定的时间。
③每发送一个字节都要对应答信号进行判断,有应答返回1,无应答返回0。