自学内容网 自学内容网

2025蓝桥杯(单片机)备赛--扩展外设之I2C的重要应用--AT24C02(七)

1.AT24C02数据手册使用

a. AT24C02 features:

               工作电压: 2.7V-5.5V(1.8V-5.5V)

                通信协议:I2C

                容量:2K

                数据保留时长:100年

        b.原理图接线说明:

板子实际接线:

  注意:SCL,SDA要上拉电阻,用来输出高电平;

                        WP接地,允许正常的读/写的操作;

地址范围:AT24C02为8位(0x00-0xff)

二、设备操作

(1)写数据

BYTE WRITE:写入操作需要在器件地址字和确认之后使用 8 位数据字地址。收到此地址后,EEPROM 将再次响应 0,然后输入第一个 8 位数据字。收到 8 位数据字后,EEPROM 将输出一个零,寻址器件(如微控制器)必须以停止条件终止写入序列。此时, EEPROM 进入内部定时写入周期 tWR 到非易失性存储器。在此写入周期内,所有输入均被禁用,并且在写入完成之前 EEPROM 不会响应(参见第 8 页的图 11)。

这里我们主要用的是写一个字的数据:

        观察 figure 7.并依据原理图可知,

            device address : 0xA0(W) 0XA1(R)

    依据 figure 8 可知:

   在AT24C02上写一个字的代码:

    void AT24C02_WriteByte(u8 address,u8 dat)
    {
        I2C_Start();
        I2C_WriteByte(0xa0);
        I2C_WaitACK();
        I2C_WriteByte(address);
        I2C_WaitACK();
        I2C_WriteByte(dat);
        I2C_WaitACK();
        I2C_Stop();
        I2C_Delay(DELAY_TIME);//加上延时好点
    }

(2)读数据

随机读取需要一个“虚拟”字节写入序列来加载数据字地址。一旦器件地址字和数据字地址被 EEPROM 计时并确认,微控制器必须生成另一个启动条件。微控制器现在通过发送读/写选择位为高电平的器件地址来启动当前地址读取。EEPROM 确认器件地址并串行时钟输出数据字。微控制器不响应零,但会生成以下停止条件(参见第 12 页的图 11)。

   我们主要使用随机读取的方式:

            依据 figure 11有代码:

u8 AT24C02_ReadByte(u8 address)
{
    u8 dat=0;
    I2C_Start();
    I2C_WriteByte(0xa0);
    I2C_WaitACK();
    I2C_WriteByte(address);
    I2C_WaitACK();
    
    I2C_Start();
    I2C_WriteByte(0xa1);
    I2C_WaitACK();
    dat=I2C_ReadData();
    I2C_WriteACK(1);
    I2C_Stop();
    return dat;
}   

三、I2C时序说明

I2C协议:分为六部分: 开始、停止、读一个字节、写一个字节、发送应答位、接受应答位

SCL为高电平时是读取数据的,为低电平时SDA可改变数据的,如果在SCL为高电平时,SDA发生改变,则视为开始或者结束的标志,

SCL由主机控制;一般先控制SDA,再控制SCL; SCL ,SDA默认保持高电平

1.开始:

        SCL为高电平时,SDA产生下降沿

void I2C_Start(void)
{
SDA=1;
SCL=1;
SDA=0;
SCL=0;
}

        SDA=1;SCL=1;SDA=0;SCL=0;

2.停止:

        SCL为高电平时,SDA产生上升沿 

void I2C_Stop(void)
{
SDA=0;
SCL=1;
SDA=1;
}

I2C为高位先行!!!!

3.发送一个字节:

SCL为高电平时,SDA保持稳定不变,SCL为低电平时,SDA可转换电平

void I2C_SendByte(u8 byte)
{
u8 i=0;
for(i=0;i<8;i++)
{
SCL=0;
if(byte & 0x80) SDA  = 1;
        else SDA  = 0;
//SDA=byte&0x80;
SCL=1;
byte<<=1;
}
SCL=0;
}

4.读取一个字节:

SCL高电平,读取SDA,再拉低SCL让从机改变SDA;

u8 I2C_ReadByte(void)
{
u8 i=0;
u8 dat=0;
for(i=0;i<8;i++)
{
SCL=1;
dat<<=1;
if(SDA) dat|=1;
SCL=0;
}
return dat;
}

5.发送应答位:

拉低SCL,改变SDA,拉高SCL,拉低SCL

void I2C_SendACK(u8 ackbit)
{
SCL=0;
SDA=ackbit;
SCL=1;
SCL=0;
}

6.等待应答位:

拉高SCL,SDA保持空闲,读取SDA,拉低SCL

bit I2C_WaitACK(void)
{
bit rack=0;
SDA=1;
SCL=1;
rack=SDA;
SCL=0;
return rack;
}

四、AT24C02存取数据代码

1.51单片机数据类型所占字节:

其它编译器:

2.进行u16位数据存取

// 0000 0000 0000 0000  //u16,
 //         0000 0000  //u8,u8读取u16数据时,会优先读取低八位
write_at24c02(0x00,wdat_u16>>8);//右移存高八位
write_at24c02(0x01,wdat_u16);//存低八位 
rdat=(read_at24c02(0x00)<<8+read_at24c02(0x01));//读取u16

3.进行float读取

    write_at24c02(0x03,(u16)(wdat_float*1000)/256);
    write_at24c02(0x04,(u16)(wdat_float*1000)%256);
    rdat_float=(read_at24c02(0x03)*256+read_at24c02(0x04))/1000.0f;

4.进行字符串数据存取

u8 wdat_string[]={"hello world"};
for(i=0;i<sizeof(wdat_string);i++)
{
    write_at24c02(0x10+i, wdat_string[i]);
}
for(i=0;i<sizeof(wdat_string);i++)
{
    rdat_string[i]=read_at24c02(0x10+i);
}

2025蓝桥杯(单片机)备赛--扩展外设控制之DS18B20(六)-CSDN博客

2025蓝桥杯(单片机)备赛--基本外设控制之共阳数码管(四)-CSDN博客

2025蓝桥杯(单片机)备赛--基本外设控制之继电器和蜂鸣器(三)-CSDN博客

2025蓝桥杯(单片机)备赛--基本外设控制之LED(二)_2024蓝桥杯单片机资料-CSDN博客

2025蓝桥杯(单片机)备赛--基本框架搭建(一)_蓝桥杯单片机大赛-CSDN博客


原文地址:https://blog.csdn.net/m0_75014814/article/details/143807894

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!