Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
EEPROM
I2C 驱动AT24C64
发布于 2021-05-10 11:13:48 浏览:1453
订阅该版
你好, 测试I2C程序出现,24C02可以正常读写,但24C64却不可以。阅读代码,咨询一下问题, ```c rt_size_t rt_i2c_master_send(struct rt_i2c_bus_device *bus, rt_uint16_t addr, rt_uint16_t flags, const rt_uint8_t *buf, rt_uint32_t count) ``` 24C64 的地址是16位,24C02的地址是8位。。。 这里是`rt_uint8_t *buf`, 用24C64的EEPROM 是不是需要该 `rt_uint16_t *buf` ?
查看更多
7
个回答
默认排序
按发布时间排序
flashman2002
2021-05-10
这家伙很懒,什么也没写!
我记得有个软件包at24cxx,http://packages.rt-thread.org/detail.html?package=at24cxx,请你查询一下。修改后测试一下是否可用即可。
Acuity
2021-05-10
这家伙很懒,什么也没写!
24C64是16位寻址,读写有稍稍区别,参考这个EEPROM通用驱动库,输入你的型号即可: [https://acuity.blog.csdn.net/article/details/115646666](https://acuity.blog.csdn.net/article/details/115646666)
邹成伟
2021-05-11
这家伙很懒,什么也没写!
尝试修改了 msh /> msh />at24cxx_eeprom_sample EEPROM write data is: a,b,c,d,e,f,g,h EEPROM read data is: 代码如下,不知哪里出了问题。 /** at24cxx设备结构体 */ struct at24cxx_device { struct rt_device parent; struct rt_i2c_bus_device *bus; }; /** at24cxx设备用户操作配置结构体 */ struct at24cxx_config { rt_uint32_t size; //设备的总容量 rt_uint16_t addr; //设备地址 rt_uint16_t flags; //I2C操作标志 }; static rt_size_t at24cxx_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) { struct at24cxx_device *at24cxx; const struct at24cxx_config *cfg; struct rt_i2c_msg msg[2]; rt_uint8_t mem_addr[2] = {0,}; rt_size_t ret = 0; RT_ASSERT(dev != 0); at24cxx = (struct at24cxx_device *) dev; RT_ASSERT(at24cxx->parent.user_data != 0); cfg = (const struct at24cxx_config *) at24cxx->parent.user_data; if(pos >= cfg->size) //寻址地址超标 { return 0; } if(pos + size > cfg->size) // size超标 { size = cfg->size - pos; } msg[0].addr = cfg->addr; msg[0].flags = cfg->flags | RT_I2C_WR; if(cfg->size < 257) // at24c01 at24c02, 一页8字节,寻址地址8位 { mem_addr[0] = (rt_uint8_t) pos; msg[0].buf = (rt_uint8_t *) mem_addr; msg[0].len = 1; } else // at24c04/08/16 一页16字节,寻址地址9/10/11位 { mem_addr[0] = (pos >> 8); mem_addr[1] = (rt_uint8_t) pos; msg[0].buf = (rt_uint8_t *) mem_addr; msg[0].len = 2; } msg[1].addr = cfg->addr; msg[1].flags = cfg->flags | RT_I2C_RD; msg[1].buf = (rt_uint8_t *) buffer; msg[1].len = size; ret = rt_i2c_transfer(at24cxx->bus, msg, 2); return (ret == 2) ? size : 0; } static rt_size_t at24cxx_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) { struct at24cxx_device *at24cxx; const struct at24cxx_config *cfg; struct rt_i2c_msg msg[2]; rt_uint8_t mem_addr[2] = {0,}; rt_size_t ret = 0; RT_ASSERT(dev != 0); at24cxx = (struct at24cxx_device *) dev; RT_ASSERT(at24cxx->parent.user_data != 0); cfg = (const struct at24cxx_config *) at24cxx->parent.user_data; if(pos > cfg->size) { return 0; } if(pos + size > cfg->size) { size = cfg->size - pos; } // 写入寻址地址 msg[0].addr = cfg->addr; msg[0].flags = cfg->flags | RT_I2C_WR; if(cfg->size < 257) // at24c01 at24c02, 一页8字节,寻址地址8位 { mem_addr[0] = (rt_uint8_t) pos; msg[0].buf = (rt_uint8_t *) mem_addr; msg[0].len = 1; } else // at24c04/08/16 一页16字节,寻址地址9/10/11位 { mem_addr[0] = (pos >> 8); mem_addr[1] = (rt_uint8_t) pos; msg[0].buf = (rt_uint8_t *) mem_addr; msg[0].len = 2; } // 使用RT_I2C_NO_START,直接写入buffer数据 msg[1].addr = cfg->addr; msg[1].flags = cfg->flags | RT_I2C_WR | RT_I2C_NO_START; msg[1].buf = (rt_uint8_t *) buffer; msg[1].len = size; ret = rt_i2c_transfer(at24cxx->bus, msg, 2); return (ret == 2) ? size : 0; } /* RT-Thread device interface */ static rt_err_t at24cxx_init(rt_device_t dev) { return RT_EOK; } static rt_err_t at24cxx_open(rt_device_t dev, rt_uint16_t oflag) { return RT_EOK; } static rt_err_t at24cxx_close(rt_device_t dev) { return RT_EOK; } static rt_err_t at24cxx_control(rt_device_t dev, int cmd, void *args) { return RT_EOK; } #ifdef RT_USING_DEVICE_OPS /** at24cxx设备操作ops */ const static struct rt_device_ops at24cxx_ops = { at24cxx_init, at24cxx_open, at24cxx_close, at24cxx_read, at24cxx_write, at24cxx_control }; #endif /** * @brief at24cxx设备注册 * @param[in] *fm_device_name 设备名称 * @param[in] *i2c_bus i2c总线设备名称 * @param[in] *user_data 用户数据 at24cxx_config * @return 函数执行结果 * - RT_EOK 执行成功 * - Others 失败 */ rt_err_t at24cxx_register(const char *fm_device_name, const char *i2c_bus, void *user_data) { static struct at24cxx_device at24cxx_drv; struct rt_i2c_bus_device *bus; bus = rt_i2c_bus_device_find(i2c_bus); if (bus == RT_NULL) { return RT_ENOSYS; } at24cxx_drv.bus = bus; at24cxx_drv.parent.type = RT_Device_Class_Block; #ifdef RT_USING_DEVICE_OPS at24cxx_drv.parent.ops = &at24cxx_ops; #else at24cxx_drv.parent.init = at24cxx_init; at24cxx_drv.parent.open = at24cxx_open; at24cxx_drv.parent.close = at24cxx_close; at24cxx_drv.parent.read = at24cxx_read; at24cxx_drv.parent.write = at24cxx_write; at24cxx_drv.parent.control = at24cxx_control; #endif at24cxx_drv.parent.user_data = user_data; return rt_device_register(&at24cxx_drv.parent, fm_device_name, RT_DEVICE_FLAG_RDWR); } static struct at24cxx_config at24c64_config = { .size = 8192, // 容量,单位字节 .addr = 0x50, // 注意该地址为没有移位之前的地址不是0xA0 .flags = 0, }; static int at24cxx_eeprom_sample(void) { rt_err_t ret; rt_uint8_t read_buf[8]={0}; rt_uint8_t write_buf[8] = {'a','b','c','d','e','f','g','h'}; ret = at24cxx_register("at24c64", "i2c1", &at24c64_config); //寻找设备 rt_device_t at24c64_dev = rt_device_find("at24c64"); if (at24c64_dev == RT_NULL) { rt_kprintf("at24c64 sample run failed! can't find %s device!\n", "at24c64"); } rt_device_open(at24c64_dev, RT_DEVICE_FLAG_RDWR); if(4 == rt_device_write(at24c64_dev, 0, write_buf, 4)) { rt_kprintf("EEPROM write data is: %c,%c,%c,%c,%c,%c,%c,%c \r\n",write_buf[0],write_buf[1],write_buf[2],write_buf[3],write_buf[4],write_buf[5],write_buf[6],write_buf[7]); } else { rt_kprintf("EEPROM write data faild! \n"); } if(4 == rt_device_read(at24c64_dev, 0, read_buf, 4))//0x08地址读数据 { rt_kprintf("EEPROM read data is: %c,%c,%c,%c,%c,%c,%c,%c \r\n",read_buf[0],read_buf[1],read_buf[2],read_buf[3],read_buf[4],read_buf[5],read_buf[6],read_buf[7]); } else { rt_kprintf("EEPROM read data faild! \n"); } return 0; }
游走在01的海洋
2021-06-06
In the end, it's not the years in your life that count. It's the life in your years.
一、既然一个可以,一个不行,那就找差别; 1.地址不一致;需要修改地址的相关函数; 2.既然不一样,对应的存储方式是否也不一致;也就是查询、确定地址的方式是否也不一致; 二、建议查询一下对应存储芯片的相关数据手册;
HSDL_6947
2023-03-16
这家伙很懒,什么也没写!
解决了吗,我用64的也读写不了,请教一下
RWZZ_6063
2023-03-16
这家伙很懒,什么也没写!
可以看看,AT 自己的驱动
geng_2000_2022
2023-03-17
这家伙很懒,什么也没写!
可以将地址分为2个8位的啊,我用24c128,而且iic期间地址设置不要加最后一位是7位的。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.5k
关于作者
邹成伟
这家伙很懒,什么也没写!
提问
27
回答
12
被采纳
1
关注TA
发私信
相关问题
1
at24cxx.c文件的bug
2
AT24CXX写入不成功
3
现有的at24cxx软件包支持AT24CM02这个芯片吗
4
IIC读写EEPROM的接口如何高效一些
5
有没有Write Cycle比较小的EEPROM,比如1ms?
6
单片机Flash小可以用IIC通讯的EEPROM可以存程序吗
7
添加eeprom和铁电存储器,怎么修改Kconfig,让env工具有添加选项?
8
I2C驱动at24c02问题已解决
9
使用at24cxx读写的问题
10
keli 中挂载AT24C02时使用env环境配置了AT24包+软件IIC
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
freemodbus主机在freertos的适配,参考rtthread例程
2
开源共生 商业共赢 | RT-Thread 2024开发者大会议程正式发布!
3
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
4
RT-Thread EtherKit开源以太网硬件正式发布
5
还在担心bsp不好维护吗?快使用yml管理主线bsp
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
12
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
7
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部