【RT-Thread Master】at24cxx软件包使用笔记

article/2025/9/19 20:17:56

硬件介绍

  • RT-Thread版本:V4.1.0
  • 软件包名称:at24cxx
  • MCU型号:AT32F407VET7
  • EEPROM型号:AT24C16

使用说明

1、使用menuconfig将软件包添加进入工程,路径如下所示。
在这里插入图片描述
2、把IIC总线打开,这里使用软件IIC,如果已经打开了就不用再次打开,IIC所用的引脚暂时先不管。
在这里插入图片描述
3、然后编译工程。
在这里插入图片描述
4、编译完成以后,打开工程,可以发现IIC驱动已经被添加进来了,at24cxx软件包也添加进来了。
在这里插入图片描述
5、然后我们进入at24cxx.h文件,修改我们EEPROM型号。我这里是AT24C6。
在这里插入图片描述
6、然后我们进入rtconfig.h文件里面,修改我们的IIC引脚。默认是22和23,这里我直接使用GET_PIN来获取引脚,但是这种方式的缺点就是每次menuconfig以后都要去修改一次,不过我也不是经常去menuconfig,测试时就暂时先这么改吧。

7、然后我们将工程编译一下,没有错误,下载到板子上。在shell中输入at24cxx,然后回车,就会弹出几个命令。分别是probe,read,write。
在这里插入图片描述
8、要想使用read/write命令,要先使用probe命令对AT24CXX进行初始化。于是输入下面的命令进行初始化。
at24cxx probe i2c1
9、然后就可以使用at24cxx read 和at24cxx write命令进行读写了。当然这个命令做得太简单了,只是读写都是从0地址开始,读写指定的位置的。而我想读写任意位置的数据,因此需要对命令进行改造一下。经过修改后的函数如下,这样我就可以读写任意位置的数据了。我们来演示一下。

static uint8_t opt_buffer[2048];void at24cxx(int argc, char *argv[])
{static at24cxx_device_t dev = RT_NULL;uint16_t opt_addr, opt_len;if (argc > 1){if (!strcmp(argv[1], "probe")){if (argc > 2){/* initialize the sensor when first probe */if (!dev || strcmp(dev->i2c->parent.parent.name, argv[2])){/* deinit the old device */if (dev){at24cxx_deinit(dev);}dev = at24cxx_init(argv[2], atoi(argv[3]));}}else{rt_kprintf("at24cxx probe <dev_name> <AddrInput> - probe sensor by given name\n");}}else if (!strcmp(argv[1], "read")){if (dev){if( argc != 4 )	//at24cxx read 0 2048{rt_kprintf("example: at24cxx read addr len.\n");return ;}opt_addr = atoi(argv[2]);opt_len = atoi(argv[3]);if( opt_len > sizeof(opt_buffer) ){rt_kprintf("read len must less than %d.\n", sizeof(opt_buffer));return ;}/* read the eeprom data */if( at24cxx_read(dev, opt_addr, opt_buffer, opt_len) == RT_EOK ){rt_kprintf("read at24cxx ok\n");for(uint16_t i=0; i<opt_len; i++){					rt_kprintf("%02x ", opt_buffer[i]);}rt_kprintf("\n");for(uint16_t i=0; i<opt_len; i++){rt_kprintf("%02c ", opt_buffer[i]);}rt_kprintf("\n");}else{rt_kprintf("read at24cxx fail.\n");}									}else{rt_kprintf("Please using 'at24cxx probe <dev_name>' first\n");}}else if (!strcmp(argv[1], "write")){if (dev){if( argc != 4 ){rt_kprintf("example: at24cxx write address string.\n");return ;}opt_addr = atoi(argv[2]);if( at24cxx_write(dev, opt_addr, (uint8_t *)argv[3], rt_strlen(argv[3])) == RT_EOK ){rt_kprintf("write ok\n");}else{rt_kprintf("write fail\n");}}else{rt_kprintf("Please using 'at24cxx probe <dev_name>' first\n");}}else if (!strcmp(argv[1], "check")){if (at24cxx_check(dev) == 1){rt_kprintf("check faild \n");}}else{rt_kprintf("Unknown command. Please enter 'at24cxx0' for help\n");}}else{rt_kprintf("Usage:\n");rt_kprintf("at24cxx probe <dev_name>   - probe eeprom by given name\n");rt_kprintf("at24cxx check              - check eeprom at24cxx \n");rt_kprintf("at24cxx read               - read eeprom at24cxx data\n");rt_kprintf("at24cxx write              - write eeprom at24cxx data\n");}
}
MSH_CMD_EXPORT(at24cxx, at24cxx eeprom function);

10、我们从0地址开始读,读10个字节。命令格式如下:at24cxx read addr len。表示从addr地址开始读,读取len个字节,如果读取成功,就会将数据通过十六进制和字符的形式打印出来,是不是方便多啦。
在这里插入图片描述
11、写指令也是一样的,命令格式如下:at24cxx write addr string 表示从addr开始写,写入字符串string。
在这里插入图片描述
12、下面我就通过一个GIF来演示整个过程吧。因为我的项目中有使用easylog(一个打印日志的软件包,会影响我们观看shell的打印),因此我首先将esaylog先关闭,这步操作大家无需进行。
请添加图片描述
13、另外我还发现了一个问题,就是我的EEPROM是AT24C16,它是2048个字节大小的,但是我似乎无法正常读取256字节以后的地址。经过查看芯片手册发现,AT24C16一共有3位页地址,和8位的字地址,如下表所示。

页地址数据
第0页256字节
第1页256字节
,
第15页256字节

页地址,用来就控制这是第几页。字地址,用来表示页里面的第几个字节。
而页地址和字地址,是在什么时候发送的呢?我们去看EEPROM的芯片手册的,按字节写操作,会传入8位的字地址。这个就表示要写某页的第几个字节。
在这里插入图片描述
而页地址呢?怎么好像没有传入?别急,我们看下图,原来AT24C16没有器件地址,它的器件地址的3个位,用来作为页地址使用了。
也就是说,当我们要访问第256个地址的时候(从0开始计算),我们需要将页地址(器件地址)设置为1,字地址设置为0即可。
为
14、回过来看代码,我发现读写一个字节的函数的器件地址都是可设置的,AT24CXX_ADDR | dev->AddrInput就是EEPROM器件的地址。这个dev->AddrInput是我们使用probe命令的时候手动传入的,对于我们AT24C16而言使用上不太方便,因为我每次访问不同的地址就需要重新传一遍dev->AddrInput不太好,因此我对这两个读写函数改造一下,让dev->AddrInput可以根据我们传入的读写地址自动计算出来。于是修改后的读写一个字节的代码如下。

uint8_t at24cxx_read_one_byte(at24cxx_device_t dev, uint16_t readAddr)
{rt_uint8_t buf[2];rt_uint8_t temp;
#if (EE_TYPE > AT24C16)buf[0] = (uint8_t)(readAddr>>8);buf[1] = (uint8_t)readAddr;if (rt_i2c_master_send(dev->i2c, AT24CXX_ADDR, 0, buf, 2) == 0)
#elsedev->AddrInput = readAddr >> 8;//增加这么一句话,根据读取地址,自动计算页地址A2A1A0buf[0] = readAddr;/* 对于AT24C16而言,EEPROM未使用器件地址引脚,总线上最多只能连接一个16K器件,A2、A1、A0是悬空的,可以接GND。也正是因为如此,AT24C16的器件地址后3位都为页地址位。*/if (rt_i2c_master_send(dev->i2c, AT24CXX_ADDR | dev->AddrInput, 0, buf, 1) == 0)
#endif{return RT_ERROR;}read_regs(dev, 1, &temp);return temp;
}rt_err_t at24cxx_write_one_byte(at24cxx_device_t dev, uint16_t writeAddr, uint8_t dataToWrite)
{rt_uint8_t buf[3];
#if (EE_TYPE > AT24C16)buf[0] = (uint8_t)(writeAddr>>8);buf[1] = (uint8_t)writeAddr;buf[2] = dataToWrite;if (rt_i2c_master_send(dev->i2c, AT24CXX_ADDR, 0, buf, 3) == 3)
#elsedev->AddrInput = writeAddr >> 8;//增加这么一句话,根据写入地址,自动计算页地址A2A1A0buf[0] = writeAddr; //cmdbuf[1] = dataToWrite;//buf[2] = data[1];if (rt_i2c_master_send(dev->i2c, AT24CXX_ADDR | dev->AddrInput, 0, buf, 2) == 2)
#endifreturn RT_EOK;elsereturn -RT_ERROR;}

15、编译,下载,再去验证一下,看看能否成功读写0-2047地址的数据。如下图所示,正常啦。
在这里插入图片描述


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

相关文章

linux下编译和安装log4cxx,ubuntu下log4cxx安装使用

需要安装log4cxx&#xff0c;安装的过程中可是充满了坎坷。。。最大的问题是在make log4cxx时&#xff0c;总是报undefined XML什么什么的错误&#xff0c;查了一下也没解决了&#xff0c;然后把apr-utils删了重新装了一下就好了。。 log4cxx现在是apache的一个项目&#xff0c…

linux下编译和安装log4cxx,RedHat如何安装log4cxx日志库

log4cxx日志库是一种动态库&#xff0c;用于记录c的日志&#xff0c;那么RedHat系统下要如何安装log4cxx日志库呢&#xff1f;下面小编就给大家介绍下RedHat安装log4cxx日志库的步骤&#xff0c;感兴趣的朋友不妨来了解下吧。 首先&#xff0c;我得到信息&#xff0c;安装这个库…

AT24Cxx读写全面理解

AT24Cxx - 电可擦可写E2PROM 芯片介绍 基础介绍\引脚介绍 AT24Cxx系列EEPROM是由美国Mcrochip公司出品&#xff0c;1-512K位的支持I2C总线数据传送协议的串行CMOS E2PROM&#xff0c;可用电擦除&#xff0c;可编程自定时写周期&#xff08;包括自动擦除时间不超过10ms&#…

mongodb-cxx-driver使用

mongocxx driver 是构建在 MongoDB C driver 之上的 1.首先需要安装mongo-c-driver wget https://github.com/mongodb/mongo-c-driver/releases/download/ 1.23.1/mongo-c-driver-1.23.1.tar.gz tar xzf mongo-c-driver-1.23.1.tar.gz cd mongo-c-driver-1.23.1 mkdir cmak…

老胡的周刊(第095期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 tabby[2] 自托管的 AI 编码助手&#xff0c;…

程序员养生指北

吴小胖第八次推送 阅读时间预计3分钟~ 熬夜篇 互联网人熬夜是不能避免的&#xff0c;原因却各不相同。 不加班的时候&#xff0c;总会对自己说&#xff0c;今天一定早睡&#xff0c;然鹅... 午休篇 熬夜的程序员总想依靠午休补觉&#xff0c;然鹅... 更不幸的是&#xff0c;互联…

老杨说运维 | 中国IT运维市场的现状与趋势

文章内容来源《第一新声》 对擎创科技CEO杨辰(老杨)的专访 前言&#xff1a; 中国目前正面临百年未有之大变局&#xff0c;在这个变局中&#xff0c;不稳定性和不确定性正在增强。疫情持续反复、国际形势变化多端&#xff0c;导致国内多个行业出现发展增速下降、产供销节奏打…

老杨说运维 | 非常重要,事关转型

《荀子》有云&#xff1a;“水能载舟&#xff0c;亦能覆舟。”在公司日常运营过程中&#xff0c;数据指标就像是水&#xff0c;孕育着生命&#xff0c;承载着万物。科学的数据指标能指引公司在正确的道路上不断前进&#xff0c;使平淡无常的业务焕发新生&#xff0c;而不合理的…

学习springcloud的一些心得体会——老卫的天气预报系统

1&#xff1a;建立天气预报springboot系统 首先先建立一个天气预报的springboot系统&#xff0c;具体流程如下&#xff1a; &#xff08;1&#xff09;从cityList.xml中获取城市信息&#xff0c; &#xff08;2&#xff09;然后根据下面的链接获取各个城市的天气预报信息&am…

学习springboot项目的一些心得-----老卫的博客系统

去年年底接触了springboot框架&#xff0c;这两天复习了一遍&#xff0c;主要是跟着老卫博客系统这个课程学习的。 springboot介绍&#xff1a;总的感觉springboot就是基于spring开发的一套框架&#xff0c;好处就是不用配置复杂的依赖包&#xff0c;xml的一些文件&#xff0c…

thymeleaf和spring boot的集成踩坑总结(练习项目是老卫的博客项目)

bug1: 2019-08-08 16:44:38.102 ERROR 19810 — [nio-8080-exec-8] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-8080-exec-8] Exception processing template “users/list”: Error resolving template “users/list”, template might not exist or might not be …

《跟老卫学 HarmonyOS 开发》:以父之名・码力全开!写段 HarmonyOS 祝父亲节

#父亲节祝福语# 爸爸在我心中就像旗帜 他教会我做人与处事的方向 在父亲节这个特别的日子里 我想对爸爸说长大以后我就要成为您 使用ArkUI开发“父亲节的祝福” 使用ArkUI开发“父亲节的祝福”&#xff0c;效果如下&#xff1a; 使用DevEco Studio整体开发HarmonyOS整体时…

【老卫搞机】090期:键盘?主机?全功能键盘主机!

这是一台我个人DIY的第二代键盘主机&#xff08;第一代见&#xff1a;【老卫搞机】074期&#xff1a;键盘&#xff1f;主机&#xff1f;键盘主机&#xff01;_哔哩哔哩_bilibili&#xff09;。相比与第一代的作品&#xff0c;第二代产品除了USB 3接口、USB 2接口、mini HDMI接口…

【老卫拆书】009期:Vue+Node肩挑全栈!《Node.js+Express+MongoDB+Vue.js全栈开发实战》开箱

今天刚拿到一本新书&#xff0c;叫做《Node.jsExpressMongoDBVue.js全栈开发实战》&#xff0c;做个开箱。 外观 先从外观上讲&#xff0c;这本是全新的未开封的&#xff0c;膜还在。 这本书介绍从技术原理到整合开发实战&#xff0c;以丰富的项目展现全栈开发的一个技巧。 …

【老卫搬砖】034期:HarmonyOS 3.1 Beta 1初体验,我在本地模拟器里面刷短视频

今天啊打开这个DevEco Studio的话&#xff0c;已经提示有3.1Beta1版本的一个更新啊。然后看一下它的一些特性。本文也演示了如何在本地模拟器里面运行HarmonyOS版短视频。 主要特性 新特性包括&#xff1a; Added support for Windows 11 64-bit and macOS 13.x OSs, as well…

【老卫搞机】135期:华为开发者联盟社区2022年牛人之星奖品开箱!

首先祝大家兔年大吉&#xff0c;身体安康&#xff0c;钱兔似锦&#xff01;今天咱们来开箱一件特殊的奖品&#xff0c;来自华为开发者联盟社区的新年祝福——2022年牛人之星。 华为有钱&#xff01;惯例用的是顺丰快递&#xff0c;各位看一下这里面是有很多件的 有这两件。第一…

【老卫搞机】136期:华为开发者联盟社区2022年度战码先锋2期开源贡献之星

首先祝大家兔年大吉&#xff0c;身体安康&#xff0c;钱兔似锦&#xff01;接上次的“2022年牛人之星”&#xff08; https://developer.huawei.com/consumer/cn/forum/topic/0203109930647268095&#xff09;&#xff0c;今天咱们来开箱另外一件特殊的奖品&#xff0c;来自华为…

老卫带你学---SVM支持向量机

老卫带你学—SVM支持向量机 学习目标&#xff1a; 理解支持向量机的知识结构理解支持向量机的原理与目标理解算法推导的核心过程和意义&#xff08;关键是损失函数与约束条件的意义&#xff09;理解核函数的意义与方法 知识结构 hard margin SVM&#xff1a;可以容易的找到…

老卫带你学---推荐系统

机器学习的一种重要应用就是推荐系统。 比如我们的淘宝推荐&#xff0c;豆瓣推荐&#xff0c;优酷电影推荐等等都用到了推荐系统。 那我们来谈一谈推荐系统的细节。 推荐系统评价指标 要了解推荐系统&#xff0c;先了解其评价指标。 1.准确度 precisionTP/TPFP; recallTP/TP…

老卫带你学---最大熵模型与EM算法

最大熵模型与EM算法 最大熵模型与EM算法在机器学习里面尤为重要。接下来我们一步一步的介绍相关细节&#xff1a; 先验概率与后验概率 后验概率就是通过已有的数据来推断未知的数据&#xff0c;先验概率就是直接对未知的数据进行预测。 所以&#xff0c;我们机器学习的目标就…