本文作者:豆面

24c08怎么用?

豆面 2025-01-14 04:30:01 24
24c08怎么用?摘要: AT24C08是一种串行CMOS类型的EEPROM存储芯片,属于AT24C0x系列,该系列包括AT24C01、AT24C02、AT24C04、AT24C08和AT24C16等型号,...

AT24C08是一种串行CMOS类型的EEPROM存储芯片,属于AT24C0x系列,该系列包括AT24C01、AT24C02、AT24C04、AT24C08和AT24C16等型号,容量分别为1K(128 x 8)、2K(256 x 8)、8K(1024 x 8)、16K(2048 x 8),AT24C08的容量为16Kbit,即2048字节,分为两个存储块,每个块有256字节。

AT24C08的主要功能特性

24c08怎么用?

1、I2C总线接口

AT24C08支持I2C总线数据传送协议,允许任何将数据传送到总线的器件作为发送器,从总线接收数据的器件作为接收器。

I2C总线由数据线SDA和时钟线SCL构成,数据传输速率可达400KHz。

2、低电压和标准电压运行

该芯片可以在低电压(1.8V)和标准电压(5.5V)下工作,适用于不同的电源环境。

3、硬件数据保护

AT24C08具备写保护引脚,可以防止意外的数据写入操作。

4、自定时写入周期

24c08怎么用?

内部具有页缓冲区,向AT24C0x写入数据后需要等待5至10毫秒的自定时写入周期,才能将数据写入到内部EEPROM区域。

5、高数据传送速率

支持高达400KHz的数据传送速率,兼容低速100KHz的IIC总线。

6、数据保存时间

数据可保存长达100年,且具备100万次的擦写周期。

AT24C08的设备地址介绍

AT24C08的标准设备地址是7位,其中高四位固定为1010,接下来的两位由硬件引脚决定,最后一位是读/写位,具体地址如下:

第一块区域:0x50(十六进制),对应的二进制是1010000

第二块区域:0x51(十六进制),对应的二进制是1010001

24c08怎么用?

第三块区域:0x52(十六进制),对应的二进制是1010010

第四块区域:0x53(十六进制),对应的二进制是1010011

读写权限组合后的设备地址如下:

读权限的设备地址

第一块区域:0xA1(十六进制),对应的二进制是10100001

第二块区域:0xA3(十六进制),对应的二进制是10100011

第三块区域:0xA5(十六进制),对应的二进制是10100101

第四块区域:0xA7(十六进制),对应的二进制是10100111

写权限的设备地址

第一块区域:0xA0(十六进制),对应的二进制是10100000

第二块区域:0xA2(十六进制),对应的二进制是10100010

第三块区域:0xA4(十六进制),对应的二进制是10100100

第四块区域:0xA6(十六进制),对应的二进制是10100110

AT24C08的读写操作流程

按字节写数据指令流程

1、发送起始信号:当时钟线SCL为高电平时,数据线SDA由高电平跳变为低电平。

2、发送设备地址(写权限):发送7位设备地址和写位(0),如0xA0。

3、等待应答信号:设备返回低电平应答信号。

4、发送存储地址:指定要写入的数据存储地址。

5、等待应答信号:设备再次返回低电平应答信号。

6、发送数据:将要写入的数据发送到总线上。

7、等待应答信号:设备返回低电平应答信号。

8、发送停止信号:当时钟线SCL为高电平时,数据线SDA由低电平跳变为高电平。

按页写数据指令流程

1、发送起始信号

2、发送设备地址(写权限)

3、等待应答信号

4、发送存储地址

5、等待应答信号

6、循环发送最多8个字节的数据:每次发送一个字节并等待应答信号。

7、发送停止信号

任意地址读数据指令流程

1、发送起始信号

2、发送设备地址(写权限)

3、等待应答信号

4、发送存储地址

5、重新发送起始信号但不产生停止信号

6、发送设备地址(读权限)

7、等待应答信号

8、读取数据:每读取一个字节后发送ACK信号。

9、发送非应答信号:在最后一个字节读取后发送非应答信号。

10、发送停止信号

示例代码

以下是使用Keil5和STM32F103ZET6进行AT24C08读写操作的示例代码:

#include "stm32f10x.h"
// I2C相关GPIO初始化
void IIC_Init(void) {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ICC_APB2Periph_AFIO, ICC_APB2Periph_GPIOC, ICC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; // SCL, SDA
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_SetBits(GPIOB, GPIO_Pin_8 | GPIO_Pin_9); // 设置为高电平
}
void IIC_Start(void) {
    IIC_SDA_OUT();
    IIC_SDA = 1; IIC_SCL = 1; delay_us(4);
    IIC_SDA = 0; delay_us(4); IIC_SCL = 0; // 钳住I2C总线,准备发送或接收数据
}
void IIC_Stop(void) {
    IIC_SDA_OUT();
    IIC_SCL = 0; IIC_SDA = 0; delay_us(4);
    IIC_SCL = 1; delay_us(4); IIC_SDA = 1; // 发送I2C总线结束信号
}
void IIC_Send_Byte(unsigned char byte) { // 发送一个字节
    unsigned char i;
    for (i = 0; i < 8; i++) {
        IIC_SDA = (byte & 0x80) >> 7;
        byte <<= 1;
        IIC_SCL = 1; delay_us(5); IIC_SCL = 0; delay_us(5);
    }
}
unsigned char IIC_Read_Byte(void) { // 读取一个字节
    unsigned char i, receive = 0;
    for (i = 0; i < 8; i++) {
        IIC_SCL = 1; delay_us(5);
        if (READ_SDA()) receive |= (1 << (7  i)); // 如果读到高电平,receive的对应位置1
        else receive &= ~(1 << (7  i)); // 如果读到低电平,receive的对应位置0
        IIC_SCL = 0; delay_us(5);
    }
    return receive;
}
unsigned char IIC_Wait_Ack(void) {
    unsigned char ack = 0;
    IIC_SCL = 1; delay_us(5); // 第九个时钟周期释放SDA,检测ACK应答信号
    ack = READ_SDA(); delay_us(5); // 如果读到低电平,表示收到ACK应答信号
    IIC_SCL = 0; delay_us(5); // 第十个时钟周期拉低SCL,为下一个传输做准备
    return !ack; // 如果收到ACK应答信号,返回0;否则返回1
}
void IIC_Ack(void) { // 发送ACK应答信号
    IIC_SCL = 1; delay_us(5); // 第九个时钟周期释放SDA,检测ACK应答信号
    IIC_SDA = 0; delay_us(5); // 发送ACK应答信号(低电平)
    IIC_SCL = 0; delay_us(5); // 第十个时钟周期拉低SCL,为下一个传输做准备
}
void IIC_NAck(void) { // 发送非ACK应答信号
    IIC_SCL = 1; delay_us(5); // 第九个时钟周期释放SDA,检测ACK应答信号
    IIC_SDA = 1; delay_us(5); // 发送非ACK应答信号(高电平)
    IIC_SCL = 0; delay_us(5); // 第十个时钟周期拉低SCL,为下一个传输做准备
}
void IIC_WriteByte(unsigned char deviceAddr, writeMode, address, unsigned char data) {
    IIC_Start(); // 开始信号
    IIC_Send_Byte(deviceAddr << 1 | writeMode); // 发送设备地址+写模式标志位
    if (!IIC_Wait_Ack()) return; // 等待应答信号,如果未收到则退出
    IIC_Send_Byte(address); // 发送存储器地址
    if (!IIC_Wait_Ack()) return; // 等待应答信号,如果未收到则退出
    IIC_Send_Byte(data); // 发送数据
    if (!IIC_Wait_Ack()) return; // 等待应答信号,如果未收到则退出
    IIC_Stop(); // 停止信号
}
unsigned char IIC_ReadByte(unsigned char deviceAddr, readMode, address) {
    unsigned char data;
    IIC_Start(); // 开始信号
    IIC_Send_Byte(deviceAddr << 1 | readMode); // 发送设备地址+读模式标志位
    if (!IIC_Wait_Ack()) return 0xFF; // 等待应答信号,如果未收到则退出
    IIC_Send_Byte(address); // 发送存储器地址
    if (!IIC_Wait_Ack()) return 0xFF; // 等待应答信号,如果未收到则退出
    IIC_Start(); // 重新开始信号,准备读取数据
    IIC_Send_Byte(deviceAddr << 1 | readMode); // 发送设备地址+读模式标志位
    if (!IIC_Wait_Ack()) return 0xFF; // 等待应答信号,如果未收到则退出
    data = IIC_Read_Byte(); // 读取数据
    IIC_NAck(); // 发送非ACK应答信号
    IIC_Stop(); // 停止信号
    return data; // 返回读取的数据
}

通过以上内容,详细介绍了AT24C08的工作原理、主要功能特性、设备地址以及读写操作的具体实现方法,AT24C08作为一种常用的EEPROM存储芯片,具有广泛的应用前景和重要的实用价值,掌握其使用方法和时序要求,对于嵌入式系统开发具有重要意义。

文章版权及转载声明

作者:豆面本文地址:https://www.jerry.net.cn/articals/16189.html发布于 2025-01-14 04:30:01
文章转载或复制请以超链接形式并注明出处杰瑞科技发展有限公司

阅读
分享