1、根据board.h步骤配置IIC

1.1、打开RT-Thread Settings里的模拟IIC

去RT-Thread Settings里找到模拟iic,打开,然后保存,就配置好了;

1.2、打开"BSP_USING_I2Cx"宏定义

图中I2C1和I2C2都打开了,实际用的是I2C2;

1.3、根据实际的GPIO配置IIC的SCL和SDA引脚

根据硬件来连,PB8是SCL,PB9是SDA;

2、at24cxx软件包

2.1、安装软件包

打开RT-Thread Settings,搜索“at24cxx”,选择安装然后保存,就可以看到packages下面多了一个“at24cxx”的文件夹;

2.2、配置软件包

打开软件包的readme,可以看到注意事项如下,我打开at24cxx.h默认就是AT24C02,5ms;

  • 请在at24cxx.h中修改EE_TYPE为自己使用的型号(默认为AT25C512) 。
  • 请在at24cxx.h中修改EE_TWR为自己使用EEPROM的Write Cycle Time,具体值请查看芯片datasheet(默认为5ms) 。
  • 从设备地址为7位地址 0x50, 而不是 0xA0 。

2.2.1、芯片型号 EE_TYPE

#ifndef EE_TYPE
#define EE_TYPE     AT24C02
#endif

2.2.2、写周期时间 EE_TWR

#define EE_TWR      5

打开数据手册,就可以看到write cycle最大时间是5ms;

2.2.3、器件的IIC地址

IIC通讯中,主机在发送起始信号之后,会发送一个字节的数据,前7位是从机的地址,最后一位是R/W读写标志;

24C02是2K,A0/A1/A2均为0,根据数据手册的图这个字节也就是,1 0 1 0 0 0 0 R/W

写:R/W=0,1 0 1 0 0 0 0 0,即0xA0;

读:R/W=1,1 0 1 0 0 0 0 1,即0xA1;

再看rtt中关于发送地址的代码,分析完就很清楚了:

写:addr1 = msg->addr << 1;

已知addr1=0xA0,所以msg->addr = addr1 >> 1 = 0xA0 >> 1 = 0x50;

2.3、测试

配置完软件包后,编译、烧录,打开终端,输入at24cxx可查看命令;

3、查看AT24C02在IIC通信中的流程

修改下DBG_LVL才能看到下面输出的信息;

at24cxx check

因为已经地址255写过一次了,所以修改为了0x58,这样在check的时候不会读一次数据就结束,而是有读数据,写数据,再读数据的过程。

根据log中的信息,可以看到AT24C02在IIC通信过程中具体的流程。

4、不用软件包,根据rtt模拟iic驱动写一下24C02读写字节的代码

4.1、头文件

#ifndef APPLICATIONS_AT24C02_IIC2_AT24C02_H_
#define APPLICATIONS_AT24C02_IIC2_AT24C02_H_#include <rtthread.h>
#include "drv_soft_i2c.h"#define AT24C02_I2C_BUS_NAME    "i2c2"      //挂载IIC2上,P89、PB9
#define AT24C02_I2C_ADDR        0x50        //AT24C02从机地址
#define AT24C02_SIZE            256         //AT24C02大小,共256字节
#define AT24C02_CHECK_VALUE     0x5a//初始化AT24C02
rt_err_t at24c02_init();#endif /* APPLICATIONS_AT24C02_IIC2_AT24C02_H_ */

4.2、源文件

#include "at24c02.h"#define LOG_TAG               "AT24C02"
#define LOG_LVL               LOG_LVL_DBG
#include <ulog.h>/* I2C总 线 设 备 句 柄 */
static struct rt_i2c_bus_device *i2c_bus = RT_NULL;//读at24c02中addr地址的数据,并返回
static uint8_t at24c02_read_byte(uint8_t addr)
{struct rt_i2c_msg msg;uint8_t buffer[2];uint8_t data;msg.addr = AT24C02_I2C_ADDR;msg.flags = RT_I2C_WR;buffer[0] = addr;msg.buf = buffer;msg.len = 1;//发送要读数据的地址rt_i2c_transfer(i2c_bus, &msg, 1);msg.flags = RT_I2C_RD;msg.buf = &data;//读数据rt_i2c_transfer(i2c_bus, &msg, 1);return data;
}//写at24c02中addr地址的数据
static rt_err_t at24c02_write_byte(uint8_t addr,uint8_t data)
{struct rt_i2c_msg msg;uint8_t buffer[2];buffer[0] = addr;buffer[1] = data;msg.addr = AT24C02_I2C_ADDR;msg.flags = RT_I2C_WR;msg.buf = buffer;msg.len = 2;//发送要写数据的地址、写的数据if(rt_i2c_transfer(i2c_bus, &msg, 1) != 1){return RT_ERROR;}return RT_EOK;
}static rt_err_t at24c02_check(uint8_t check)
{uint8_t temp;temp = at24c02_read_byte(AT24C02_SIZE-1);if(temp != check){at24c02_write_byte(AT24C02_SIZE-1,check);rt_thread_mdelay(5);                        //wait 5mstemp = at24c02_read_byte(AT24C02_SIZE-1);if(temp != check){return RT_ERROR;}}return RT_EOK;
}//初始化AT24C02
rt_err_t at24c02_init()
{//查找I2C总线设备,获取I2C总线设备句柄i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(AT24C02_I2C_BUS_NAME);if (i2c_bus == RT_NULL){LOG_D("can't find device!\n");return RT_ERROR;}//检查AT24C02if(at24c02_check(AT24C02_CHECK_VALUE) != RT_EOK){LOG_D("at24c02 check fail!\n");return RT_ERROR;}LOG_D("at24c02 check ok!\n");return RT_EOK;
}

4.3、main.c

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include "drv_common.h"
#include "at24c02.h"#define LOG_TAG         "main"
#define LOG_LVL         LOG_LVL_DBG
#include <ulog.h>int main(void)
{//设置LED为推挽输出rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);LOG_I("init at24c02...");at24c02_init();while (1){rt_pin_write(LED0_PIN, PIN_HIGH);       //设置高电平rt_thread_mdelay(500);rt_pin_write(LED0_PIN, PIN_LOW);        //设置低电平rt_thread_mdelay(500);}return RT_EOK;
}

RTT_IIC_读写AT24C02相关推荐

  1. STM32CubeMx HAL库使用硬件IIC读写AT24C02

    介绍使用硬件IIC接口读写AT24C02,STM32自带硬件IIC,比较好用,没必要千篇一律的使用模拟IIC.作为一个IIC的使用例子,可以适当修改用于其他IIC接口设备通信控制. 一.测试环境 ST ...

  2. linux下at24c02驱动程序,Linux下iic(i2c)读写AT24C02

    linux内核上已有iic的驱动,因此只需要对该iic设备文件进行读写则能够控制外围的iic器件.这里以AT24C02为对象,编写一个简单的 linux内核上已有iic的驱动,因此只需要对该iic设备 ...

  3. 基于STM32的I2C通信 2(读写AT24C02)

    本文采用STM32的模拟I2C对 EEPROM(AT24C02)进行读写操作. 1.EEPROM(24C02):I2C接口 1.1-24C02器件介绍: AT24C02的总容量是256个字节,也就是2 ...

  4. proteus教程——读写AT24C02

    1.延时问题 有些教材和技术资料对IIC基本信号的脉宽和延时有一定的时间要求,在上述基本信号和数据传送子函数中加入了若干延时操作指令:另一些教材和技术资料则无此要求.经编者实验验证,80 C51单片机 ...

  5. STM32CubeMX学习教程之十:硬件I2C读写AT24C02

    完整源码下载: https://github.com/simonliu009/STM32CubeMX-hardware-I2C-AT24C02 网上有流传已久一种说法,就是STM的I2C有bug,不好 ...

  6. at24c16如何划分出多个读写区_读写AT24C02,并用1602显示

    #include #include /*********************************LCD定义部分********************************/ //输入方式设 ...

  7. STM32基于HAL工程硬件I2C读写AT24C02/04/08数据

    STM32基于HAL工程硬件I2C读取AT24C02数据 ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!

  8. STM32的IIC(模拟)读写AT24c02

    1.GPIO的工作模式有八种.IIC的SCL可设置为输出,但是SDA需要收发信号,所以要设置为输入和输出两种形式. #define SDA_IN() {GPIOB->CRL&=0X0FF ...

  9. c语言AT源码,51单片机读写AT24C02源代码(详细注释)

    在P1口上接八个led灯,结果就显示在这八个灯上面.AT24C02的接线方式见程序的顶部的定义.以下是源代码: #include //包含头文件 typedef unsigned char uchar ...

最新文章

  1. 浅谈如何在C#Winform程序中正确使用登录窗体
  2. mysql十大报错_MySQL十大报错函数
  3. JDBC连接数据库及其执行操作
  4. 整合框架过程记录日志
  5. PHP str_replace() 和str_ireplace()函数
  6. qt执行命令行失败_QT缺少 qtcore4.dll,debug下运行不成功
  7. 高效新思路!实例分割算法!腾讯、华科出品!入选ICCV 2021!
  8. 44膜型键盘_小学四年级数学上册考试必考题型:判断题练习题
  9. TI DSP位域寄存器文件(Bit Field and Register-File Struc...
  10. MyBatis Review——多对多映射
  11. 成员变量和局部变量详解
  12. 数学建模:方差分析模型
  13. 最小二乘法拟合空间直线的原理及实现
  14. 计算机配置怎么造假,骗局揭秘:卖你一台假电脑 再送你一个假鲁大师
  15. Chromecast是什么
  16. 数学家吴文俊批判“中国式奥数”:害人害数学
  17. stata回归分析与系数检验专题【计量经济系列(三)】
  18. RSS推送技术——打造自己的今日头条
  19. IDEA 开发工具安装教程及破解步骤(激活至2099年)
  20. 价格屠夫乐视杀入4K电视市场

热门文章

  1. 超简易实现电脑微信多开
  2. 基于Asterisk的VoIP开发指南…
  3. xp系统开我的世界服务器,winxp系统我的世界如何联机
  4. 阿里云EMR Remote Shuffle Service在小米的实践
  5. 华为电脑wrtw29安装Linux,Huawei/华为笔记本MateBook 13 WRT-W19怎么样,华为13寸笔记本电脑配置性能评测!...
  6. cf1900左右的dp
  7. 电子顺磁共振ESR测试
  8. 日常生活开支记账明细_学会记账对个人理财的好处
  9. 解决问题:excel保护工作表密码忘记了怎么办?
  10. 将PPT中画的图转成eps格式的有效方法