IIC通信以及AT24C02使用

1.什么是通信协议

简而言之,通信即为单片机与模块,或是单片机与单片机等相互连接,通信方式通常分为:
并行传输:一次传输一个字节;串行传输(iic,usart,spi):一次传输一个位,八次传输一个字节;
同步:有时钟(主设备上)线;异步:无时钟线,但必须有规定的协议

①什么是IIC协议

I2C 总线是一种串行数据总线,只有二根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,两条线可以挂多个设备。 IIC设备(绝大多数)里有个固化的地址,只有在两条线上传输的值等于IIC设备的固化地址时,其才会作出响应。通常我们为了方便把IIC设备分为主设备和从设备,基本上谁控制时钟线(即控制SCL的电平高低变换)谁就是主设备。注:IIC通信为半双工通信! 即不能同时收发数据。

简而言之,IIC通信就是通过SDA和SCL两信号线与单片机进行通信。
如图:AT24C02
引脚5和引脚6分别代表SCL(时钟线),SDA(数据线);使用时同单片机的SCL和SDA引脚相连即可开始通信。

②IIC协议原理讲解

以下我直接用两种图片说明(理解即可):

IIC通信起始信号和停止信号
IIC数据传输及响应信号
概述了IIC通信的全过程。

③IIC协议代码讲解

由图可知,IIC总线在SCL为高时,SDA拉低,从而发送一个起始信号

void start()// 启动I2C总线 
{
       sda = 1;//确保SDA线为高电平
       flash();//flash为一个延时函数
       scl = 1; //确保SCL高电平
       flash();
       sda = 0;//在SCL为高时拉低SDA线,即为起始信号
       flash();
       scl = 0;//将SCL线拉低,为后面SDA的电平变化做准备
       flash();
}

由图可知SCL为高时,SDA拉高,从而发送一个结束信号

void stop()// 停止I2C总线
{
       sda = 0;//确保SDA线为低电平
       flash();
       scl = 1;//确保SCL高电平
       flash();
       sda = 1;//在SCL为高电平时拉高SDA线,即为停止信号,此时SDA和SCL均为高,同时完成IIC初始化过程
       flash();
}

通过IIC通信,发送一个8位的数据

void writex(unsigned char j)// 向IIC总线上写8位
{
    unsigned char i,temp;
    temp = j;
    for(i=0; i<8; i++)//循环8次,每次发送一位数据
 
    {
 
       temp = temp<<1;//将temp左移一位,如果temp最高位是1,左移后将产生进位,进位标志CY=1,如果temp最高位是0,左移后不会产生进位,进位标志CY=0
       scl = 0;//将SCL总线拉低,为SDA电平变化做准备
       flash();
       sda = CY;//根据进位标志CY更改SDA的电平
       flash();
       scl = 1;//将SCL拉高,告诉IIC器件现在可以检测SDA的电平了
       flash();
    }
 
    scl = 0;//8位数据传输完成后,将SCL拉低
    flash();
    sda = 1;//将SDL拉高,开始为IIC设备的应答ACK做准备
    flash();  
}

通过IIC通信,读取一个8位的数据

unsigned char readx()//从IIC总线读8位
{
    unsigned char i,j,k=0;
    scl = 0;//确保SCL为低,为后续SDA电平变化做准备
    flash();
    sda = 1;//从单片机角度释放SDA总线,为IIC设备操作SDA线做准备
    for(i=0; i<8; i++)//循环8次,读取8位SDA值
    {
       flash();
       scl = 1;//将SCL拉高,此时IIC设备的SDA电平不再变化,为单片机读SDA做准备
       flash();
       if(sda==1) j = 1;
       else j = 0;//将SDA电平赋值给j
       k = (k<<1)|j;//将j左移赋值给k,小端传输
       scl = 0;//将SCL拉低,告诉IIC设备现在可以改变SDA的值了,进行下一位的传输
      }
    flash();
    return(k);//将8位数据返回,完成一个数据读取过程
}

IIC通信应答信号

void clock()// I2C总线应答子函数
{
       unsigned char i = 0;
       scl = 1;//将SCL拉高
       flash();
       while((sda==1)&&(i<255)) i++;//在这里检测SDA的电平变化,若SDA被拉低,即收到应答信号,则退出while循环,若i=255,则按超时处理,同样退出循环
       scl = 0;//将SCL拉低,为后续SDA电平变化做准备
       flash();
}

2.AT24C02模块

①AT24C02是什么

AT24C02是一个2K位串行CMOS E2PROM,有一个16字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能, 如果WP管脚连接到Vcc,所有的内容都被写保护只能读。当WP管脚连接到Vss or GND 或悬空允许器件进行正常的读/写操作。

在蓝桥杯中,24C02C的仿真图如下:
24C02C

②如何实现AT24C02与单片机通信

AT24C02的存储容量为2K bit,内容分成32页,每页8Byte,共256Byte,操作时有两种寻址方式:芯片寻址和片内子地址寻址。

(1)芯片寻址:AT24C02的芯片地址为1010,其地址控制字格式为1010A2A1A0R/W。其中A2,A1,A0可编程地址选择位,A2,A1,A0引脚接高、低电平后得到确定的三位编码,与1010形成7位编码,即为该器件的地址码。A0、A1、A2引脚是器件地址输入端,这些输入脚用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0,通过改变A2,A1,A0的引脚状态,共有8种组合,所以一个IIC总线最大可级联8个器件。R/W为芯片读写控制位,该位为0,表示芯片进行写操作。在下面的分析及程序中,只有一个AT24C02器件,A2,A1,A0全部悬空,即全部为0,地址控制字为1010000*,*为R/W位。

蓝桥杯中,A0,A1,A2接地为0,所以芯片选址为0xa0;

(2)片内子地址寻址:芯片寻址可对内部256B中的任一个进行读/写操作,其寻址范围为00~FF,共256个寻址单位。如0x80等等

③代码解析

正常情况下,EEPROM要经过两次寻址,即芯片寻址和片内子地址寻址
先寻找是哪个器件,再寻址该芯片的寻址单位。

下面是AT24C02芯片的存储功能的写功能
写操作

读取AT24C02存储的内容时,进行两次寻址
读操作
有两个IIC_Start(),是因为先要寻找到芯片地址,然后0xa1对该地址进行读操作。
讲完了AT24C02后,对于IIC通信的理解,实际上IIC是一种通信协议,它的作用是与芯片之间进行交流,数据传输。

下面是一个例程(通过AT24C02断电保存数据且数码管+1)
点击下载代码,提取码:pd2f。

原创文章 2 获赞 5 访问量 124

猜你喜欢

转载自blog.csdn.net/name_longming/article/details/106151754