外观
I2C AT24CXX 示例
2026-10-15
概述
本文介绍如何在 睿擎工业开发平台 中创建并运行 I2C EEPROM 示例工程,基于 RT-Thread 设备驱动框架, 演示 I2C 总线的设备查找、在位检测、数据写入、数据读取与回读校验的完整流程。
AT24CXX EEPROM 简介
AT24CXX 系列是采用 I2C 总线接口的串行 EEPROM。器件以从设备方式挂载在总线上,支持标准模式与快速模式,最高通信速率 400 kbit/s。该器件具备非易失性存储特性,掉电后数据不会丢失,适用于参数配置、标定数据等需要长期保存的小容量存储场景。
硬件连接
开发板的 I2C 总线与 AT24CXX EEPROM 已完成硬件连接,芯片位置如图所示:

查看排针原理图与引脚对应图(对照接线)


完整排针引脚表见 硬件连接 — HAT 扩展排针引脚对应关系。
查询配置树获取 I2C 资源
根据 GD32H77D 配置树可知:
- GD32H77D 片内集成多路 I2C 控制器,本示例使用
i2c1,用户可在配置树文件中按实际硬件选择其他实例;
构建与烧录
创建工程点击展开
依次点击 “文件” -> “新建” -> "RT-Thread RuiChing App 项目"。

在弹出新建向导中选择 开发版 、BSP: 、示例 、 调试器/下载器。选择好之后点击 “完成”。

点击 “完成” 后,等待工程创建完成。

创建完成。

构建工程点击展开
单击工程使工程进入 Active-Debug 模式。

点击工具栏上的构建按钮进行工程编译。

构建成功后,会显示构建成功的信息。

固件下载点击展开
下载 GinoPi 固件镜像

下载完成后复位开发板,并通过控制台 UART 查看启动信息

核心示例代码
- I2C AT24CXX 示例
static int _at24cxx_test(at24cxx_device_t dev, const char *name)
{
uint8_t read_buf[TEST_LEN + 1] = {0};
rt_err_t result;
uint16_t i;
result = at24cxx_check(dev);
if (result != RT_EOK)
{
rt_kprintf("[%s] check failed\n", name);
return -1;
}
rt_kprintf("[%s] check ok\n", name);
result = at24cxx_write(dev, TEST_ADDR, (uint8_t *)_write_buf, TEST_LEN);
if (result != RT_EOK)
{
rt_kprintf("[%s] write failed\n", name);
return -1;
}
rt_kprintf("[%s] write ok: %s\n", name, _write_buf);
result = at24cxx_read(dev, TEST_ADDR, read_buf, TEST_LEN);
if (result != RT_EOK)
{
rt_kprintf("[%s] read failed\n", name);
return -1;
}
read_buf[TEST_LEN] = '\0';
rt_kprintf("[%s] read ok: %s\n", name, read_buf);
if (memcmp(_write_buf, read_buf, TEST_LEN) == 0)
{
rt_kprintf("[%s] verify ok: write == read\n", name);
}
else
{
rt_kprintf("[%s] verify fail: write != read\n", name);
rt_kprintf(" write:");
for (i = 0; i < TEST_LEN; i++)
rt_kprintf(" %02X", _write_buf[i]);
rt_kprintf("\n");
rt_kprintf(" read :");
for (i = 0; i < TEST_LEN; i++)
rt_kprintf(" %02X", read_buf[i]);
rt_kprintf("\n");
return -1;
}
return 0;
}
int i2c_at24cxx_example(int argc, char *argv[])
{
at24cxx_device_t dev;
const char *name;
const char *i2c_bus;
uint8_t ee_type;
if (argc < 4)
{
rt_kprintf("Usage: %s <name> <i2c_bus> <type>\n", argv[0]);
rt_kprintf("\n");
rt_kprintf(" <name> device name, e.g. eeprom0\n");
rt_kprintf(" <i2c_bus> I2C bus name, e.g. i2c1\n");
rt_kprintf(" <type> EEPROM type:\n");
rt_kprintf(" 0 AT24C01 128 bytes\n");
rt_kprintf(" 1 AT24C02 256 bytes\n");
rt_kprintf(" 2 AT24C04 512 bytes\n");
rt_kprintf(" 3 AT24C08 1KB\n");
rt_kprintf(" 4 AT24C16 2KB\n");
rt_kprintf(" 5 AT24C32 4KB\n");
rt_kprintf(" 6 AT24C64 8KB\n");
rt_kprintf(" 7 AT24C128 16KB\n");
rt_kprintf(" 8 AT24C256 32KB\n");
rt_kprintf(" 9 AT24C512 64KB\n");
rt_kprintf("\n");
rt_kprintf("Examples:\n");
rt_kprintf(" %s eeprom0 i2c1 4\n", argv[0]);
rt_kprintf(" %s eeprom1 i2c2 4\n", argv[0]);
return -1;
}
name = argv[1];
i2c_bus = argv[2];
ee_type = atoi(argv[3]);
if (ee_type >= AT24CTYPE)
{
rt_kprintf("Error: invalid EEPROM type %d\n", ee_type);
return -1;
}
dev = at24cxx_create(name, i2c_bus, 0, ee_type);
if (dev == RT_NULL)
{
rt_kprintf("Error: at24cxx_create '%s' failed\n", name);
return -1;
}
rt_kprintf("[%s] init ok: bus=%s type=%d\n", name, i2c_bus, ee_type);
_at24cxx_test(dev, name);
at24cxx_delete(dev);
return 0;
}运行示例
操作步骤
- 确认
AT24CXX EEPROM已连接至i2c1总线(如上图所示); - 将程序下载到开发板;
- 打开串口终端连接开发板;
- 在终端输入
i2c_at24cxx_example 11 i2c1 4命令,参数依次为设备名称11(可自定义)、 I2C 总线i2c1、EEPROM 型号4(AT24C16,2 KB); - 观察终端输出的在位检测、写入、读取与校验结果。
型号必须与实际器件一致
预期结果
在终端输入 i2c_at24cxx_example 11 i2c1 4 命令后,各阶段均输出 ok,且读出数据与写入数据一致:
RT-Thread 终端
msh >i2c_at24cxx_example 11 i2c1 4
[11] init ok: bus=i2c1 type=4
[11] check ok
[11] write ok: Hello RuiChing!
[11] read ok: Hello RuiChing!
[11] verify ok: write == read