Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
I2C_IIC
EEPROM
I2C驱动at24c02问题已解决
发布于 2018-10-22 03:31:34 浏览:5383
订阅该版
想用RTT里面I2C总线驱动24c02 AT24C02线程代码: ```c static const char * i2c_bus_device_name = "i2c1"; static const rt_uint8_t eeprom_addr = 0x50; /* 1010A2A1A0 - R/W */ struct rt_i2c_bus_device * i2c_device = RT_NULL; /* I2C设备句柄 */ void AT24C02_thread_entry(void* parameter) { rt_uint8_t buffer[2]; rt_uint8_t uart_rx_data; /* 打开iic */ if (AT24C02_open(i2c_bus_device_name) != RT_EOK) { rt_kprintf("i2c1 open error.
"); } if(AT24C02_write_reg(0x01, 0x06)!=RT_EOK)//往地址0x01写0x06 { // rt_kprintf("write Date1 fail!
"); } if(AT24C02_write_reg(0x02, 0x09)!=RT_EOK)//往地址0x02写0x09 { // rt_kprintf("write Date2 fail!
"); } while (1) { if(AT24C02_read_reg(0x01, 1, &buffer[0])!=RT_EOK) { // rt_kprintf("Read Date1 fail!
"); } else { rt_kprintf("%02X ", buffer[0]); rt_kprintf(""); } if(AT24C02_read_reg(0x02, 1, &buffer[1])!=RT_EOK) { // rt_kprintf("Read Date1 fail!
"); } else { rt_kprintf("%02X ", buffer[1]); rt_kprintf(""); } rt_thread_delay(1000); } } //返回值: 0,成功 / -1,错误代码 rt_err_t AT24C02_open(const char *name) { rt_err_t res; /* 查找系统中的iic设备 */ i2c_device = rt_i2c_bus_device_find(name); /*查找I2C设备*/ /* 查找到设备后将其打开 */ 是这里查找设备并未注册i2c1吗?有知道原因的吗? if (i2c_device == RT_NULL) { rt_kprintf("can't find AT24C02 %s device
", i2c_bus_device_name); return -RT_ERROR; } rt_kprintf("AT24C02 set i2c bus to %s
", i2c_bus_device_name); return RT_EOK; } //写AT24C02单个寄存器 //reg:寄存器地址 //data:数据 //返回值: 0,正常 / -1,错误代码 rt_err_t AT24C02_write_reg(rt_uint8_t reg, rt_uint8_t data)往地址里写数据这样对吗? { struct rt_i2c_msg msgs; rt_uint8_t buf[2] = {reg, data}; msgs.addr = eeprom_addr; /* 从机地址 */ msgs.flags = RT_I2C_WR; /* 写标志 */ msgs.buf = buf; /* 发送数据指针 */ msgs.len = 2; if (rt_i2c_transfer(i2c_device, &msgs, 1) == 1) { // rt_kprintf("write EEPROM fail!
"); return RT_EOK; } else { return -RT_ERROR; } } //读取寄存器数据 //reg:要读取的寄存器地址 //len:要读取的数据字节数 //buf:读取到的数据存储区 //返回值: 0,正常 / -1,错误代码 rt_err_t AT24C02_read_reg(rt_uint8_t reg, rt_uint8_t len, rt_uint8_t *buf)从地址里面读取数据这样写对吗? { struct rt_i2c_msg msgs[2]; msgs[0].addr = eeprom_addr; /* 从机地址 */ msgs[0].flags = RT_I2C_WR; /* 写标志 */ msgs[0].buf = ® /* 从机寄存器地址 */ msgs[0].len = 1; /* 发送数据字节数 */ msgs[1].addr = eeprom_addr; /* 从机地址 */ msgs[1].flags = RT_I2C_RD; /* 读标志 */ msgs[1].buf = buf; /* 读取数据指针 */ msgs[1].len = len; /* 读取数据字节数 */ if (rt_i2c_transfer(i2c_device, msgs, 2) == 2) { // rt_kprintf("read EEPROM fail!
"); return RT_EOK; } else { return -RT_ERROR; } } ``` 有没有高手帮忙看看,谢谢! ![1.png](https://oss-club.rt-thread.org/uploads/201810/22/032424l7655682o57yo85y.png) ![2.png](https://oss-club.rt-thread.org/uploads/201810/22/032405ok1h0212sygn1k0g.png)
查看更多
18
个回答
默认排序
按发布时间排序
还没想好
2018-10-22
这家伙很懒,什么也没写!
是读写数据错误,还是读写数据失败了?
fengye
2018-10-22
这家伙很懒,什么也没写!
iic1没有注册成功
fengye
2018-10-22
这家伙很懒,什么也没写!
关键查找设备成功了呀! /* 查找系统中的iic设备 */ i2c_device = rt_i2c_bus_device_find(name); /*查找I2C设备*/ /* 查找到设备后将其打开 */ 是这里查找设备并未注册i2c1吗?有知道原因的吗? if (i2c_device == RT_NULL) { rt_kprintf("can't find AT24C02 %s device\r\n", i2c_bus_device_name); return -RT_ERROR; } rt_kprintf("AT24C02 set i2c bus to %s\r\n", i2c_bus_device_name); return RT_EOK;
yangjie
认证专家
2018-10-22
hello
读写有问题吗
fengye
2018-10-22
这家伙很懒,什么也没写!
>读写有问题吗 --- 读写都出错
yangjie
认证专家
2018-10-23
hello
[i=s] 本帖最后由 yangjie 于 2018-10-23 10:44 编辑 [/i] >读写都出错 --- 确保系统已经注册了“i2c1” 在写完之后不能马上读,中间一定要延时。 参考[https://www.rt-thread.org/qa/thread-3471-1-1.html](https://www.rt-thread.org/qa/thread-3471-1-1.html)
fengye
2018-10-23
这家伙很懒,什么也没写!
>确保系统已经注册了“i2c1” > >在写完之后不能马上读,中间一定要延时。 --- 系统注册i2c1是要在哪里添加i2c1初始化吗? 查看了一下uart的使用例子,串口用uart_device = rt_device_find(name); 就可以使用对应的串口了,因为board.c里面 void rt_hw_board_init(void) { /* NVIC Configuration */ NVIC_Configuration(); /* Configure the SysTick */ SysTick_Config( SystemCoreClock / RT_TICK_PER_SECOND ); #if STM32_EXT_SRAM EXT_SRAM_Configuration(); #endif rt_hw_usart_init();//串口 rt_hw_i2c_init();//挂在I2C1到总线上 rt_console_set_device(RT_CONSOLE_DEVICE_NAME); #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); #endif } 然后我在里面添加 rt_hw_i2c_init();//挂在I2C1到总线上 结果死在if (rt_strncmp(object->name, name, RT_NAME_MAX) == 0)这里了,什么原因?大神指导指导呀
yangjie
认证专家
2018-10-23
hello
i2c初始化在drv_i2c.c中有的,使用了INIT_DEVICE_EXPORT(drv_i2c_init);进行自动初始化,不需要自己初始化 使用的时候需要将drv_i2c.c中对应的i2c底层硬件PIN脚设置一下 用户I2C设备名称,必须和drv_i2c.c注册的I2C设备名称(I2C_BUS_NAME)一致
fengye
2018-10-23
这家伙很懒,什么也没写!
[i=s] 本帖最后由 fengye 于 2018-10-23 19:05 编辑 [/i] 我用的不是HAL库,没有drv_i2c.c这个文件呀!用的普通库函数这个是要在哪里找呢?
fengye
2018-10-25
这家伙很懒,什么也没写!
>i2c初始化在drv_i2c.c中有的,使用了INIT_DEVICE_EXPORT(drv_i2c_init);进行自动初始化,不需要自己初始化 > ... --- 谢谢,我用的标准库,在i2c.c中修改了相应的端口,目前出现了一个新问题根据I2C设备应用笔记我写了往相应地址写数据函数,第一次调用时数据写不进去,函数如下: rt_err_t AT24C02_write_reg(rt_uint8_t reg, rt_uint8_t data) { struct rt_i2c_msg msgs; rt_uint8_t buf[2] = {reg, data}; msgs.addr = eeprom_addr; /* 从机地址 */ msgs.flags = RT_I2C_WR; /* 写标志 */ msgs.buf = buf; /* 发送数据指针 */ msgs.len = 2; if (rt_i2c_transfer(i2c_device, &msgs, 1) == 1) { return RT_EOK; } else { rt_kprintf("write EEPROM fail!\r\n"); return -RT_ERROR; } } 加了延时也不行,能帮我看看吗,线程是这样的: void AT24C02_thread_entry(void* parameter) { rt_uint8_t buffer[5]; rt_uint8_t uart_rx_data; /* 获得i2c 设备句柄*/ if (AT24C02_open(i2c_bus_device_name) != RT_EOK) { rt_kprintf("i2c1 open error.\r\n"); } rt_thread_delay(1000); if(AT24C02_write_reg(0x01, 0x21)!=RT_EOK)//往地址0x01写0x21 { rt_kprintf("write Date1 fail!\r\n"); } rt_thread_delay(10); if(AT24C02_write_reg(0x02, 0x22)!=RT_EOK)//往地址0x02写0x22 { rt_kprintf("write Date2 fail!\r\n"); } rt_thread_delay(10); if(AT24C02_write_reg(0x03, 0x23)!=RT_EOK)//往地址0x01写0x23 { rt_kprintf("write Date3 fail!\r\n"); } rt_thread_delay(10); if(AT24C02_write_reg(0x04, 0x24)!=RT_EOK)//往地址0x02写0x24 { rt_kprintf("write Date4 fail!\r\n"); } rt_thread_delay(10); while (1) { if(AT24C02_read_reg(0x01, 1, &buffer[0])!=RT_EOK) { rt_kprintf("Read Date1 fail!\r\n"); } else { rt_kprintf("%02X ", buffer[0]); rt_kprintf("\r\n "); } if(AT24C02_read_reg(0x02, 1, &buffer[1])!=RT_EOK) { rt_kprintf("Read Date2 fail!\r\n"); } else { rt_kprintf("%02X ", buffer[1]); rt_kprintf("\r\n "); } if(AT24C02_read_reg(0x03, 1, &buffer[2])!=RT_EOK) { rt_kprintf("Read Date3 fail!\r\n"); } else { rt_kprintf("%02X ", buffer[2]); rt_kprintf("\r\n "); } if(AT24C02_read_reg(0x04, 1, &buffer[3])!=RT_EOK) { rt_kprintf("Read Date4 fail!\r\n"); } else { rt_kprintf("%02X ", buffer[3]); rt_kprintf("\r\n "); } rt_thread_delay(1000); } } 就第一个数据写出错,后面三个数据都正常,finsh组件打印出来的效果如图: 帮我看看什么情况,谢谢了
撰写答案
登录
注册新账号
关注者
0
被浏览
5.4k
关于作者
fengye
这家伙很懒,什么也没写!
提问
3
回答
38
被采纳
0
关注TA
发私信
相关问题
1
NXP的I2C应该比ST的好用吧
2
Use of I2C device driver
3
关于I2C 驱动问题请教
4
我如何知道这个iic的io配置和我电路设计的是一致的?
5
I2C模拟读操作失败,不知道问什么进不去读函数
6
RTT的I2C有官方文档资料没有
7
求 STM32F103 IIC 自定义IO初始化 代码
8
报一个LPC4008代码中I2C的bug
9
RTOS IIC总线使用
10
关于在RTT中使用STM32 I2C的疑问
推荐文章
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
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
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
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部