RTT_IIC_读写AT24C02
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相关推荐
- STM32CubeMx HAL库使用硬件IIC读写AT24C02
介绍使用硬件IIC接口读写AT24C02,STM32自带硬件IIC,比较好用,没必要千篇一律的使用模拟IIC.作为一个IIC的使用例子,可以适当修改用于其他IIC接口设备通信控制. 一.测试环境 ST ...
- linux下at24c02驱动程序,Linux下iic(i2c)读写AT24C02
linux内核上已有iic的驱动,因此只需要对该iic设备文件进行读写则能够控制外围的iic器件.这里以AT24C02为对象,编写一个简单的 linux内核上已有iic的驱动,因此只需要对该iic设备 ...
- 基于STM32的I2C通信 2(读写AT24C02)
本文采用STM32的模拟I2C对 EEPROM(AT24C02)进行读写操作. 1.EEPROM(24C02):I2C接口 1.1-24C02器件介绍: AT24C02的总容量是256个字节,也就是2 ...
- proteus教程——读写AT24C02
1.延时问题 有些教材和技术资料对IIC基本信号的脉宽和延时有一定的时间要求,在上述基本信号和数据传送子函数中加入了若干延时操作指令:另一些教材和技术资料则无此要求.经编者实验验证,80 C51单片机 ...
- STM32CubeMX学习教程之十:硬件I2C读写AT24C02
完整源码下载: https://github.com/simonliu009/STM32CubeMX-hardware-I2C-AT24C02 网上有流传已久一种说法,就是STM的I2C有bug,不好 ...
- at24c16如何划分出多个读写区_读写AT24C02,并用1602显示
#include #include /*********************************LCD定义部分********************************/ //输入方式设 ...
- STM32基于HAL工程硬件I2C读写AT24C02/04/08数据
STM32基于HAL工程硬件I2C读取AT24C02数据 ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!
- STM32的IIC(模拟)读写AT24c02
1.GPIO的工作模式有八种.IIC的SCL可设置为输出,但是SDA需要收发信号,所以要设置为输入和输出两种形式. #define SDA_IN() {GPIOB->CRL&=0X0FF ...
- c语言AT源码,51单片机读写AT24C02源代码(详细注释)
在P1口上接八个led灯,结果就显示在这八个灯上面.AT24C02的接线方式见程序的顶部的定义.以下是源代码: #include //包含头文件 typedef unsigned char uchar ...
最新文章
- 浅谈如何在C#Winform程序中正确使用登录窗体
- mysql十大报错_MySQL十大报错函数
- JDBC连接数据库及其执行操作
- 整合框架过程记录日志
- PHP str_replace() 和str_ireplace()函数
- qt执行命令行失败_QT缺少 qtcore4.dll,debug下运行不成功
- 高效新思路!实例分割算法!腾讯、华科出品!入选ICCV 2021!
- 44膜型键盘_小学四年级数学上册考试必考题型:判断题练习题
- TI DSP位域寄存器文件(Bit Field and Register-File Struc...
- MyBatis Review——多对多映射
- 成员变量和局部变量详解
- 数学建模:方差分析模型
- 最小二乘法拟合空间直线的原理及实现
- 计算机配置怎么造假,骗局揭秘:卖你一台假电脑 再送你一个假鲁大师
- Chromecast是什么
- 数学家吴文俊批判“中国式奥数”:害人害数学
- stata回归分析与系数检验专题【计量经济系列(三)】
- RSS推送技术——打造自己的今日头条
- IDEA 开发工具安装教程及破解步骤(激活至2099年)
- 价格屠夫乐视杀入4K电视市场
热门文章
- 超简易实现电脑微信多开
- 基于Asterisk的VoIP开发指南…
- xp系统开我的世界服务器,winxp系统我的世界如何联机
- 阿里云EMR Remote Shuffle Service在小米的实践
- 华为电脑wrtw29安装Linux,Huawei/华为笔记本MateBook 13 WRT-W19怎么样,华为13寸笔记本电脑配置性能评测!...
- cf1900左右的dp
- 电子顺磁共振ESR测试
- 日常生活开支记账明细_学会记账对个人理财的好处
- 解决问题:excel保护工作表密码忘记了怎么办?
- 将PPT中画的图转成eps格式的有效方法