24c08怎么用?
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的主要功能特性
1、I2C总线接口:
AT24C08支持I2C总线数据传送协议,允许任何将数据传送到总线的器件作为发送器,从总线接收数据的器件作为接收器。
I2C总线由数据线SDA和时钟线SCL构成,数据传输速率可达400KHz。
2、低电压和标准电压运行:
该芯片可以在低电压(1.8V)和标准电压(5.5V)下工作,适用于不同的电源环境。
3、硬件数据保护:
AT24C08具备写保护引脚,可以防止意外的数据写入操作。
4、自定时写入周期:
内部具有页缓冲区,向AT24C0x写入数据后需要等待5至10毫秒的自定时写入周期,才能将数据写入到内部EEPROM区域。
5、高数据传送速率:
支持高达400KHz的数据传送速率,兼容低速100KHz的IIC总线。
6、数据保存时间:
数据可保存长达100年,且具备100万次的擦写周期。
AT24C08的设备地址介绍
AT24C08的标准设备地址是7位,其中高四位固定为1010,接下来的两位由硬件引脚决定,最后一位是读/写位,具体地址如下:
第一块区域:0x50(十六进制),对应的二进制是1010000
第二块区域:0x51(十六进制),对应的二进制是1010001
第三块区域: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
文章转载或复制请以超链接形式并注明出处杰瑞科技发展有限公司