STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储

article/2025/10/9 10:55:19

目录

  • STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)
  • STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解)
  • STC8H开发(三): 基于FwLib_STC8的模数转换ADC介绍和演示用例说明
  • STC8H开发(四): FwLib_STC8 封装库的介绍和使用注意事项
  • STC8H开发(五): SPI驱动nRF24L01无线模块
  • STC8H开发(六): SPI驱动ADXL345三轴加速度检测模块
  • STC8H开发(七): I2C驱动MPU6050三轴加速度+三轴角速度检测模块
  • STC8H开发(八): NRF24L01无线传输音频(对讲机原型)
  • STC8H开发(九): STC8H8K64U模拟USB HID外设
  • STC8H开发(十): SPI驱动Nokia5110 LCD(PCD8544)
  • STC8H开发(十一): GPIO单线驱动多个DS18B20数字温度计
  • STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储

AT24C系列

AT24C系列是常见的EEPROM存储芯片, 常用于保存参数及掉电记忆的数据

  • 容量: 型号代表了其容量, 从AT24C01到AT24C1024, 存储容量为1K BIT ~ 1024K BIT, 注意单位是Bit, 如果转换为字节就是128字节 ~ 128K字节
  • 电压: 整个系列有2.7V (2.7V至5.5V)和1.8V (1.8V至5.5V)两个版本, 都兼容3.3V和5V
  • 封装: 8-lead PDIP, 8-lead JEDEC SOIC, 8-lead MAP, 5-lead SOT23, 8-lead TSSOP 和 8-ball dBGA2

与其他存储器件相比

  • 容量小
  • 皮实, 几近无限的擦写次数: 10万次以上, 典型值为百万
  • 超长的数据保持: 40年以上
  • 工作温度范围: 工业级[-55℃,125℃]
  • I2C总线, 只需要SCL和SDA两个接口, 并且可以和其他I2C设备复用
  • 支持写保护

因为这些特点, AT24C常用于一些容量小但是稳定性要求高, 并且需要反复擦写的场景.

AT24C的设备地址和存储地址

设备地址

AT24C的设备地址都是一个字节, 以二进制1010开头, 通过A0,A1,A2这三个pin进行调整. 根据容量不同, 设备地址和寻址范围有区别

AT24C01 - AT24C16

这个系列的存储地址只有一个字节, 所以内存寻址只有256字节(2048 bit), 对于AT24C01, AT24C02可以直接寻址, 对于更大容量的型号, 需要结合设备地址对内存地址分page访问

  • AT24C01, AT24C02: 设备地址 0xA0 - 0xAE, 第8位是R/W, 同一个I2C总线上可以并存8个同类设备
  • AT24C04: 0xA0 - 0xAC, 第7位是page选择, 第8位是R/W, 同一个I2C总线上可以并存4个同类设备
  • AT24C08: 0XA0 - 0xA8, 第6,7位是page选择, 第8位是R/W, 同一个I2C总线上可以并存2个同类设备
  • AT24C16: 0XA0, 第5, 6,7位是page选择, 第8位是R/W, 同一个I2C总线上只能存在1个同类设备

AT24C32, AT24C64

  • 从这个容量开始, 存储地址变成两个字节
  • 设备地址 0xA0 - 0xAE, 第8位是R/W, 同一个I2C总线上可以并存8个同类设备

AT24C128, AT24C256, AT24C512

  • 设备地址 0xA0 - 0xA6, 第5位固定为0, 第8位是R/W, 同一个I2C总线上可以并存4个同类设备
  • 存储地址两个字节

AT24C1024

  • 设备地址 0xA0 - 0xA4, 第5位固定为0, 第7位是page选择, 第8位是R/W, 同一个I2C总线上可以并存2个同类设备
  • 存储地址两个字节, 所以内存寻址只有64K字节, 128K需要分两个page进行访问

通过STC8H访问AT24C系列存储芯片

注意

访问AT24C时I2C总线的频率不能太高.

  • AT24C系列的I2C总线最高频率是400KHz(2.7V), 在1.8V时频率会降到100KHz
  • 市面上的兼容芯片可能会达不到前面的指标
  • STC8H系列的主频基本上从24MHz起步, 甚至直接运行在36.864MHz上
  • STC8H I2C总线的频率是基于FOSC计算的, 在最初的调试阶段, 务必设置一个较大的预分频, 这样可以确保问题不出在频率过高上

接线

对于DIP8封装, 接线方式都是一样的, 测试使用的是 STC8H3K64S2, 可以直接替换为 STC8H 其它型号, 除了下面的4个pin, 还需要选择将A0, A1, A2 接GND或接VCC

P32   -> SCL
P33   -> SDA
GND   -> GND
3.3V  -> VCC

AT24C08访问示例

这个例子演示了单字节存储地址系列型号的访问方式

#include "fw_hal.h"// 设置地址 0xA0, 对应A0,A1,A2三个pin都接地, 测试中根据自己的接线修改
#define AT24C_ADDR  0xA0__CODE int8_t dat[20] = {0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB};// I2C初始化
void I2C_Init(void)
{// 主设备模式I2C_SetWorkMode(I2C_WorkMode_Master);/*** I2C 总线频率 = FOSC / 2 / (__prescaler__ * 2 + 4) 这里设成最大值0x3F*/I2C_SetClockPrescaler(0x3F);// 选择I2C端口I2C_SetPort(I2C_AlterPort_P32_P33);// 启用 I2CI2C_SetEnabled(HAL_State_ON);
}// GPIO初始化
void GPIO_Init(void)
{// SDAGPIO_P3_SetMode(GPIO_Pin_3, GPIO_Mode_InOut_QBD);// SCLGPIO_P3_SetMode(GPIO_Pin_2, GPIO_Mode_Output_PP);
}int main(void)
{uint8_t offset, i, buf[20];SYS_SetClock();// 开启 UART1, baud 115200 with Timer2, 1T mode, no interruptUART1_Config8bitUart(UART1_BaudSource_Timer2, HAL_State_ON, 115200);GPIO_Init();I2C_Init();// 对地址0x00连续写入12个字节I2C_Write(AT24C_ADDR, 0x00, dat, 12);while(1){// 分4次, 起始地址递增, 每次连续读出6个字节并通过串口输出for (offset = 0; offset < 4; offset++){I2C_Read(AT24C_ADDR, offset, buf, 6);for (i = 0; i < 6; i++){UART1_TxHex(buf[i]);UART1_TxChar(':');}UART1_TxString("  ");SYS_Delay(10);}UART1_TxString("\r\n");// 间隔1秒SYS_Delay(1000);}
}

代码地址

  • GitHub https://github.com/IOsetting/FwLib_STC8/blob/master/demo/i2c/at24c/at24c08_stc8h3k.c
  • Gitee https://gitee.com/iosetting/fw-lib_-stc8/blob/master/demo/i2c/at24c/at24c08_stc8h3k.c

AT24C32访问示例

这个例子演示了双字节存储地址系列型号的访问方式

#include "fw_hal.h"// AT24C device address, change according to the voltage level of A0/A1/A2
#define AT24C_ADDR  0xA0
// Test data
__CODE int8_t dat[20] = {0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB};void I2C_Init(void)
{// Master modeI2C_SetWorkMode(I2C_WorkMode_Master);/*** I2C clock = FOSC / 2 / (__prescaler__ * 2 + 4)*/I2C_SetClockPrescaler(0x3F);// Switch alternative portI2C_SetPort(I2C_AlterPort_P32_P33);// Start I2CI2C_SetEnabled(HAL_State_ON);
}void GPIO_Init(void)
{// SDAGPIO_P3_SetMode(GPIO_Pin_3, GPIO_Mode_InOut_QBD);// SCLGPIO_P3_SetMode(GPIO_Pin_2, GPIO_Mode_Output_PP);
}int main(void)
{uint8_t offset, i, buf[20];SYS_SetClock();// UART1 configuration: baud 115200 with Timer2, 1T mode, no interruptUART1_Config8bitUart(UART1_BaudSource_Timer2, HAL_State_ON, 115200);GPIO_Init();I2C_Init();// 与AT24C08示例的区别在于使用了16bit地址I2C_Write16BitAddr(AT24C_ADDR, 0x0000, dat, 12);while(1){for (offset = 0; offset < 4; offset++){// 与AT24C08示例的区别在于使用了16bit地址I2C_Read16BitAddr(AT24C_ADDR, 0x0000|offset, buf, 6);for (i = 0; i < 6; i++){UART1_TxHex(buf[i]);UART1_TxChar(':');}UART1_TxString("  ");SYS_Delay(10);}UART1_TxString("\r\n");SYS_Delay(1000);}
}

代码地址

  • GitHub https://github.com/IOsetting/FwLib_STC8/blob/master/demo/i2c/at24c/at24c32_stc8h3k.c
  • Gitee https://gitee.com/iosetting/fw-lib_-stc8/blob/master/demo/i2c/at24c/at24c32_stc8h3k.c

http://chatgpt.dhexx.cn/article/Z8vyPmxO.shtml

相关文章

STM32的硬件I2C与AT24C16

刚学STM32的时候就听闻STM32的硬件I2C存在重大bug&#xff0c;会导致运行卡死在等待ACK的过程中&#xff0c;所以一直以来对其避而远之&#xff0c;转而以模拟I2C取代之。最近这段时间一直在用STM32 CubeMX&#xff0c;图形化设置界面屡试不爽&#xff0c;连USB这种复杂外设都能…

STM32F030 硬件I2C驱动 AT24C16

网络上很多F1系列的ATC24的读写程序&#xff0c;但F0几乎没有。由于F0完全重写了I2C&#xff0c;所以以往的代码并不能直接使用&#xff0c;修改事件、接口上会浪费很多时间&#xff0c;特别是对于使用F0系列进行入门的新手。 在此十分感谢 畅学电子网 的对于AT24C16的资料&am…

EEPROM 之 AT24C16 - 备忘录

因为论坛里看到STM的I2C有点小bug&#xff0c;所以这里采用的是模拟I2C时序 【注】m0.6us表示的是这一段时间最小不能小于为0.6us&#xff0c;M0.6us表示的是这一段时间最大为0.6us 对AT24C16的操作有读和写&#xff0c;读又分为CURRENT ADDRESS READ、RANDOM READ、SEQUENTIAL…

S32K144:12.LPI2C驱动AT24C16

1.打开官方例程 2.修改引脚配置 3.时钟可按照实际情况修改&#xff0c;也可不用更改&#xff0c;本例时钟不做更改 4.配置LPI2C模块 设置从机地址&#xff1a;从机地址如下图所示&#xff0c;低三位表示为AT24C16的块地址&#xff0c;AT24C16将2KB的内存空间分为8个块&…

stm32cubemx I2C读取AT24C16

本文对如何使用stm32cube生成I2C工程不作说明&#xff0c;仅对在对AT24Cxx系列的使用时作出易忽略的说明&#xff1b; 1、at24cxx页面结构&#xff1a; 从该图可以看出16K&#xff08;bit&#xff09;共有128个页&#xff0c;每页由16byte构成。16k 128 * 16 * 8; 特别注意&…

STM32之 AT24C16(EEPROM)驱动代码(程序稳定,清晰明了)

AT24C16电路图 第一部分&#xff1a;IIC协议代码头文件(iic.h) #ifndef IIC_H #define IIC_H #include "stm32f10x.h" #include "sys.h" #include "delay.h"#define write 0 #define read 1//IIC总线地址接口定义 #define IIC_SCL PBout(7) #d…

GD32F4xx MCU控制I2C EEPROM(AT24C16)记录

1、AT24C16简介 1.1 主要参数 工作电压:1.8v ~ 5.5v存储空间:2048 Bytes ,分128页,16Bytes/页, 地址范围 0~2047。接口: I2C 总线I2C时钟频率: 1MHz( 5v ) , 400KHz( 1.8v, 2.5v, 2.7v)。1.2 电路连接 1.3 其他说明 AT24C16未使用器件地址引脚,总线上最多只可以连接一…

AT24C04、AT24C08、AT24C16系列EEPROM芯片单片机读写驱动程序

一、概述 在之前的一篇博文中&#xff0c;记录了AT24C01、AT24C02芯片的读写驱动&#xff0c;先将之前的相关文章include一下&#xff1a; 1.IIC驱动&#xff1a;4位数码管显示模块TM1637芯片C语言驱动程序 2.AT24C01/AT24C02读写&#xff1a;AT24C01/AT24C02系列EEPROM芯片单…

IIC方式读驱动AT24C16芯片

闲来无事&#xff0c;找了块msp430的板子编写了个IIC驱动AT24C16的程序。 IIC作是一种简单&#xff0c;双向&#xff0c;同步的二进制总线&#xff0c;由SDA数据线和SCL时钟线组成&#xff0c;所有接到IIC总线上的各设备的SDA数据线都连接到总线的SDA数据线上&#xff0c;用来…

AT24C16页写和多页写

AT24C16 2K字节(存储内存) 128&#xff08;页面数&#xff09;* 16 &#xff08;每页的字节数&#xff09; 2^11 (寻址地址位数 11位)。 AT24C16有128(2^7128)页只需要7位地址&#xff0c;分为高3位和低4位&#xff0c;高3位在设备地址中&#xff0c;低4位在字地址中。 设备…

EEPROM(AT24C16)页写算法

1. 写在前面 学习单片机或者从事嵌入式开发的&#xff0c;对于EEPROM绝不会陌生&#xff0c;尤其的24系列的EEPROM很是经典&#xff0c;或者与此兼容的FRAM系列&#xff0c;如AT24C02、AT24C16、FM24C16等。 驱动起这个系列的EEPROM&#xff0c;可以说是没有任何难点&#xff0…

AT24C16 读写注意点

开篇一张时序图镇楼&#xff1a; 这篇文章介绍了AT24C16的页写、连续读、写保护功能&#xff1a;AT24C16 读写_D.luffy的博客-CSDN博客_at24c16 页写算法我是参考这篇文章的&#xff1a;https://acuity.blog.csdn.net/article/details/78550427?utm_ char ee_24clxx_writeby…

AT24C16 读写

at24c16 有8块 256字节组成&#xff0c;共2K字节16K bit I2C开始信号后&#xff0c;第一个字节为器件地址&#xff0c;由10103位块地址1位读写标志组成&#xff0c; 3位块地址刚好可以表示 8个块&#xff0c; 所以一次写完256字节&#xff0c;换到下一下块的时候&#xff0c;要…

进程间通信的方式(附代码分析)

进程间通信的方式 1. 进程间通信的几种方式 管道 比如 ls | grep 1;也就是将 进程 ls 拿到的结果作为 grep 1 这个进程的输入。实现了进程间的通信。 消息队列 消息队列就是我们的内核给我们创建的一种消息队列。我们可以往其中发送消息&#xff0c;也可以从其中接收消息。 …

linux进程--进程间通信方式(一)

一、多进程 首先&#xff0c;先来讲一下fork之后&#xff0c;发生了什么事情。 由fork创建的新进程被称为子进程&#xff08;child process&#xff09;。该函数被调用一次&#xff0c;但返回两次。两次返回的区别是子进程的返回值是0&#xff0c;而父进程的返回值则是新进程…

进程间通信的方式——信号、管道、消息队列、共享内存

进程间通信的方式——信号、管道、消息队列、共享内存 多进程&#xff1a; 首先&#xff0c;先来讲一下fork之后&#xff0c;发生了什么事情。 由fork创建的新进程被称为子进程&#xff08;child process&#xff09;。该函数被调用一次&#xff0c;但返回两次。两次返回的区别…

Android 进程间通信的几种实现方式

一、概述 由于应用程序之间不能共享内存。在不同应用程序之间交互数据&#xff08;跨进程通讯&#xff09;&#xff0c;在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件&#xff1a;Activity、Content Provider、Broadcast和S…

进程间通信的方式及原理

# 进程间通信的方式 文章目录 # 进程间通信的方式消息队列使用步骤 管道 消息队列 信号 信号量 socket 消息队列 首先消息队列就是内核维护的一块链表区域&#xff0c;只要是有足够权限的进程都可以向队列中添加消息&#xff0c;只要是有读权限的进程都可以在里面拿出消息 克…

C | 进程间通信的方式

C | 进程间通信的方式 1.无名管道 无名管道是实现亲缘间进程通信的一种方式&#xff0c;属于半双工通信。 无名管道的实现是队列&#xff0c;不能使用lseek对读写指针偏移。 无名管道有两个端&#xff1a;数据流入端和数据流出端&#xff0c;也叫写端和读端。它们是两个固定…

面试题:进程间通信的方式

liunx六大进程间通信方式 管道&#xff0c;消息队列&#xff0c;共享内存&#xff0c;信号量&#xff0c;socket&#xff0c;信号&#xff0c;文件锁 1&#xff0c;管道 1&#xff0c;匿名管道&#xff1a; 概念&#xff1a;在内核中申请一块固定大小的缓冲区&…