详解AT24CXX驱动开发(linux platform tree - i2c应用)

目录

概述

1 认识AT24Cxx

1.1 AT24CXX的特性

1.2 AT24CXX描述

1.2.1 引脚

1.2.2 容量描述

1.2.3 设备地址

1.3 操作时序

1.3.1 写单个字节时序

1.3.2 写page字节时序

1.3.3 读取当前数据时序

1.3.4 随机读取数据

1.3.5 连续读取多个数据

2 驱动开发

2.1 硬件接口

2.2 代码实现

2.2.1 查看设备信息

2.2.2 编写代码

2.2.3 编写Makefile 

2.3 编译代码

3 测试

4 逻辑分析仪查看波形

4.1 写数据波形

4.2 读数据波形


概述

        本文以AT24C02为例,对该类型芯片做全面剖析,详细介绍该芯片的硬件特性和软件设计方面的方法和技巧,其中包括单字节的读和写,连续字节的读写方法、以I2C波形分析。并且在linux平台上,使用I2C接口,编写一个实用案例,实现该芯片的驱动程序。并使用逻辑分析仪工具,详尽解析其工作的波形。

1 认识AT24Cxx

1.1 AT24CXX特性

AT24CXX是一款可进行多次擦除和写数据的串行EEPROM,采用标准的I2C驱动方式,非常方便电路设计和软件程序的设计。总结其特点如下:

1)宽电压:该芯片的工作电压范围为 1.8V ~ 5.5V。可以满足不同MCU平台的设计要求。

2)写保护功能:AT24CXX提供一个引脚WP用于enable或者disable写数据功能,防止由于操作不当,导致存储数据被改写。

3)其可同时支持100K bit/s 和 400K bit/s.

使用时注意: 100 kHz (1.8V, 2.5V, 2.7V) , 400 kHz (5V)

4)使用寿命很长: 擦写次数可达到100 0000 次, 数据保存可达100年

1.2 AT24CXX硬件描述

1.2.1 引脚

          AT24CXX有很多类型,例如: AT24C02A/04A/08A/16A/32A 等待,单其封装形式,基本上一致。标准引脚如下表:

1)WP 为写保护引脚,当WP为低电平是,读写功能被enable;当WP为高电平时, 写数据功能被disable, 这时,只能进行读操作。

2)A0 ~ A2为 地址引脚,对于AT24C02,其可表达的地址空间为:000 ~ 111

AT24CXX芯片封装形式如下图:

1.2.2 容量描述

下面以 AT24C02A/04A/08A 为例,描述其存储空间

芯片型号容量空间( bit)页数( byte)
AT24C02A2048256
AT24C04A4096512
AT24C08A81921024

1.2.3 设备地址

参看设备地址表,可知不同型号的芯片,其可使用的地址空间是不一样的。

1) AT24C02: A0A1A2三个地址引脚都可以使用,其可表达的地址范围为: 000 ~ 111

2) AT24C04: A2A1可用, 其可表达的地址范围为: 00 ~ 11

3) AT24C04: A2可用, 其可表达的地址范围为: 0 ~ 1

4) bit: R/W

(R/W)bit 位的值含义
1读数据
0写数据

1.3 操作时序

1.3.1 写单个字节时序

下图为写一个字节的波形图形:

剖析操作步骤如下:

step - 1: Master SDA发起start信号

step - 2: Master 发送设备地址信息, 最低位 bit0 置位为 bit0=0,表示可进行写操作。

step - 3: AT24CXX 响应ACK

step - 4: Master 发送写数据的地址位

Step - 5: AT24CXX 响应ACK

Step - 6: Master 发送写数据

Step - 7: AT24CXX 响应ACK

step - 8: Master SDA发起stop信号

1.3.2 写page字节时序

下图为写一个page的波形图形:

剖析操作步骤如下:

step - 1: Master SDA发起start信号

step - 2: Master 发送设备地址信息, 最低位 bit0 置位为 bit0=0,表示可进行写操作。

step - 3: AT24CXX 响应ACK

step - 4: Master 发送写数据的起始地址

Step - 5: 连续发送数据

for( i = 0; i < n; i++)

{

      Master_send_data();

      Slave_response_ack();

}

step - 6: Master SDA发起stop信号

1.3.3 读取当前数据时序

下图为读当前地址的波形图形:

剖析操作步骤如下:

step - 1: Master SDA发起start信号

step - 2: Master 发送设备地址信息, 最低位 bit0 置位为 bit0=1,表示可进行读操作。

step - 3: AT24CXX 响应ACK

step - 4: AT24CXX 发送写数据

Step - 5: Master 发送NO ACK

step - 6: Master SDA发起stop信号

1.3.4 随机读取数据

下图为随机读取数据的波形图形:

剖析操作步骤如下:

step - 1: Master SDA发起start信号

step - 2: Master 发送设备地址信息, 最低位 bit0 置位为 bit0=1,表示可进行读操作。

step - 3: AT24CXX 响应ACK

step - 4: Master 发送读字节地址

Step - 5: AT24Cxx 响应ACK

Step - 6: AT24Cxx 发送数据

Step - 7: Master收到数据后,发送NO ACK

step - 8: Master SDA发起stop信号

1.3.5 连续读取多个数据

下图为连续读取多个数据的波形图形:

操作逻辑如下:

step - 1: Master SDA发起start信号

step - 2: Master 发送设备地址信息, 最低位 bit0 置位为 bit0=1,表示可进行读操作。

step - 3: AT24CXX 响应ACK

Step - 4: AT24Cxx 发送数据

for( i = 0; i < n; i++)

{

         at24cxx_send_data();

         master_response_ack();

}

Step - 5: Master发送NO ACK

step - 6: Master SDA发起stop信号

2 驱动开发

2.1 硬件接口

在板卡ATK-DL6Y2C上,I2C2的对应接口:

        pinctrl_i2c2: i2c2grp {fsl,pins = <MX6UL_PAD_UART5_TX_DATA__I2C2_SCL 0x4001b8b0MX6UL_PAD_UART5_RX_DATA__I2C2_SDA 0x4001b8b0>;};

硬件实物图:

AT24CXX硬件工作电路

2.2 代码实现

       本程序主要应用Linux platform 驱动下的I2C接口,在用户层调用read 和write 函数直接操作芯片。linux内核已经实现I2C相关的驱动程序。用户只需在.dts中配置参数即可。

2.2.1 查看设备信息

使用i2c-tools 查看系统的i2信息,然后在/proc/device-tree目录下查看板卡i2c device tree,使用如下命令:

cd /sys/bus/i2c/devices
ls

可以看见: AT24C02挂载I2C-1总线下,其地址位0x50

查看地址下设备名称

cat 1-0050/name

2.2.2 编写代码

 创建drv_15_at24cxx.c,并在该文件中编写驱动程序

/***************************************************************
Copyright  2024-2029. All rights reserved.
文件名     : test_15_at24cxx.c
作者       : tangmingfei2013@126.com
版本       : V1.0
描述       : 测试at24cxx驱动程序
其他       : 无
日志       : 初版V1.0 2024/02/15***************************************************************/
#include <sys/types.h>
#include <sys/stat.h>
#include <linux/types.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <linux/fs.h>
#include <unistd.h>
#include <errno.h>
#include <assert.h>
#include <string.h>
#include <time.h>#define i2c_dev                              "/dev/i2c-1"
#define AT24CXX_ADDR                         0x50static int fd = -1;static int at24cxx_drv_init(void)
{fd = open(i2c_dev, O_RDWR);if( fd < 0 ){close( fd );printf("%s %s i2c device open failure: %s\n",__FILE__, __FUNCTION__, strerror(errno));return -1;}ioctl(fd, I2C_TENBIT, 0);ioctl(fd, I2C_SLAVE, AT24CXX_ADDR);printf("init at24cxx!\r\n");return fd;
}int read_page( unsigned char page, unsigned char *rbuff,  unsigned char length )
{unsigned char   tempbuff[1];int i = 0, ret;tempbuff[0] = page;  // address ret = write(fd, tempbuff, 1);if( ret < 0 ){printf("%d %s %s i2c device write address fail: %s\n",__LINE__, __FILE__, __FUNCTION__, strerror(errno));close(fd);return -1;}ret = read(fd, rbuff, length);if( ret < 0 ){printf("%d %s %s i2c device read data fail: %s\n", __LINE__ , __FILE__, __FUNCTION__, strerror(errno));close(fd);return -1;}printf(" read data to at24c02 in address = %d \r\n ", page);for( i=0; i< length; i++ ){printf(" %x \t ", rbuff[i]);}printf(" \r\n ");return 0;
}int write_page(  unsigned char page,  unsigned char *buff, unsigned char len)
{unsigned char   tempbuff[len+1];int i = 0, ret;printf(" write data to at24c02 in address = %d \r\n ", page);// step-1: write tempbuff[0] = page;for( i=1; i< sizeof(tempbuff); i++ ){tempbuff[i] = buff[i-1];printf(" %x \t ", tempbuff[i]);}printf(" \r\n ");ret = write(fd, tempbuff, sizeof(tempbuff));if( ret < 0 ){printf("%d %s %s i2c device write data failure: %s\n",__LINE__,  __FILE__, __FUNCTION__, strerror(errno));close(fd);return -1;}return 0;
}int main(void)
{#define LEN    8unsigned startpage = 8;unsigned char buff[LEN];unsigned char rbuff[LEN];int i = 0, index = 0, j= 0;fd = at24cxx_drv_init();for( j=0; j < 5; j++ ){// write data for(i = 0; i < sizeof( buff); i++ ){buff[i] = 0x20 + index;index++;}write_page( startpage, buff, sizeof( buff)); printf(" \r\n \r\n ");startpage += 8;usleep(20000);   //20ms }startpage = 8;for( j=0; j < 5; j++ ){read_page( startpage, rbuff, sizeof( rbuff));printf(" \r\n \r\n ");startpage += 8;usleep(20000); //20ms }return 0;
}

2.2.3 编写Makefile 

创建Makefile文件,编写代码

CFLAGS= -Wall -O2
CC=/home/ctools/gcc-linaro-4.9.4-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
STRIP=/home/ctools/gcc-linaro-4.9.4-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-striptest_15_at24cxx: test_15_at24cxx.o$(CC) $(CFLAGS) -o test_15_at24cxx test_15_at24cxx.o$(STRIP) -s test_15_at24cxxclean:rm -f test_15_at24cxx test_15_at24cxx.o

2.3 编译代码

       使用Make命令编译代码,然后将生成的执行文件copy到NFS下的共享目录中,方便在板卡中执行代码:

在板卡中可以看见:

3 测试

在板卡中运行程序后,可以看见:

4 逻辑分析仪查看波形

4.1 写数据波形

以连续写多个数据为例,分析芯片的驱动波形:

1)写地址波形

2)写数据波形

 

3)Stop 信号

4.2 读数据波形

以连续读多个数据为例,分析芯片的驱动波形:

1)写起始地址

3) 读数据byte

 4) 结束波形

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/699701.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis能保证数据不丢失吗?

引言 大家即使没用过Redis&#xff0c;也应该都听说过Redis的威名。 Redis是一种Nosql类型的数据存储&#xff0c;全称Remote Dictionary Server&#xff0c;也就是远程字典服务器&#xff0c;用过Dictionary的应该都知道它是一种键值对&#xff08;Key-Value&#xff09;的数…

ESP8266智能家居(5)——开发APP深入篇

1.代码解析 接下来重点介绍一下逻辑代码 这里面主要是设置mqtt服务器的IP地址和端口号&#xff0c;设置服务器的用户名和登录密码 绑定好订阅主题和发布主题&#xff08;和8266上的订阅、发布交叉就行&#xff09; 绑定界面&#xff0c;设置界面标题 绑定6个文本控件 将从mq…

pycharm找不到conda可执行文件怎么办?

问题&#xff1a;pycharm配置conda环境找不到conda可执行文件 解决办法&#xff1a; 1. 找到 anaconda 安装目录&#xff08;D:\Users\wl\anaconda3&#xff09; 2. 打开pycharm &#xff08;看图吧<手动狗头>&#xff09; 找到anaconda3\condabin\conda.bat 选择你要…

第八篇【传奇开心果系列】python的文本和语音相互转换库技术点案例示例:Google Text-to-Speech虚拟现实(VR)沉浸式体验经典案例

传奇开心果博文系列 系列博文目录python的文本和语音相互转换库技术点案例示例系列 博文目录前言一、雏形示例代码二、扩展思路介绍三、虚拟导游示例代码四、交互式学习示例代码五、虚拟角色对话示例代码六、辅助用户界面示例代码七、实时语音交互示例代码八、多语言支持示例代…

单片机02_寄存器_GPIO设置__点灯

芯片概述 C51&#xff1a;0口、1口、2口、3口&#xff0c;P00~p07、P10~P17、P20~P27、P30~P37 STM32&#xff1a;A口、B口、C口、D口&#xff0c;PA0~PA15/PA5 GPIOA.5 STM32F407ZGT6有7组GPIO端口&#xff0c;分别是&#xff1a;A B C D E F G&#xff0c;每组均有16个GPIO端…

【EI会议征稿通知】2024年软件自动化与程序分析国际学术会议(SAPA 2024)

2024年软件自动化与程序分析国际学术会议&#xff08;SAPA 2024) 2024 International Conference on Software Automation and Program Analysis 在当今科技社会中&#xff0c;软件产业呈快速发展趋势&#xff0c;软件自动化与程序分析技术在提高软件质量、降低开发成本、提升…

【风格迁移】CAST:对比学习,从图像特征而非其二阶统计量(Gram矩阵)中学习风格

CAST&#xff1a;对比学习&#xff0c;从图像特征而非其二阶统计量&#xff08;Gram矩阵&#xff09;中学习风格 提出背景5 why 分析5 so分析 CAST 框架多层风格投影器领域增强模块生成网络 效果对比 StyleGAN 提出背景 论文&#xff1a;https://arxiv.org/pdf/2205.09542.pdf…

【Java程序设计】【C00278】基于Springboot的数码论坛管理系统(有论文)

基于Springboot的数码论坛管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的数码论坛系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;在系统首页可以查看首页、…

测试计划、测试方案、测试策略、测试用例的区别

一 测试计划 测试计划是指描述了要进行的测试活动的范围、方法、资源和进度的文档。它主要包括测试项、被测特性、各阶段的测试任务、时间进度安排&#xff0c;谁执行任务和风险控制等&#xff0c;可以包括测试策略。 二 测试方案 测试方案是指描述需要测试的特性、测试的方…

JavaSec 之 XXE 简单了解

文章目录 XMLReaderSAXReaderSAXBuilderDocumentBuilderUnmarshaller**SAXParserFactory**XMLReaderFactoryDigester总结 XMLReader public String XMLReader(RequestBody String content) {try {XMLReader xmlReader XMLReaderFactory.createXMLReader();// 修复&#xff1a…

Tomcat信创平替之TongWEB(东方通),安装步骤

我的系统: 银河麒麟桌面系统V10(SP1) 开局先吐槽一下(当然国产也是需要大量时间与金钱的投入),感觉国产软件进入死循环:国家推动国产→国产收费→还要钱?→用国外开源→国产无发普及→靠国家推动 正题: 1.先进入东方通申请使用 2.客服会发送一个TongWEB包与license.dat给你…

出生年(PTA团体天题练习题)巧用sprintf函数

以上是新浪微博中一奇葩贴&#xff1a;“我出生于1988年&#xff0c;直到25岁才遇到4个数字都不相同的年份。”也就是说&#xff0c;直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求&#xff0c;自动填充“我出生于y年&#xff0c;直到x岁才遇到n个数字都不相同的…

Sora 对未来视频创作伦理的挑战和思考

Sora 对未来视频创作伦理的挑战和思考 随着人工智能技术的飞速发展&#xff0c;AI视频模型Sora的出现为视频创作带来了革命性的变革。然而&#xff0c;在技术进步的同时&#xff0c;也带来了一些伦理问题值得我们深思。 1. 真实性和虚假信息: Sora能够生成逼真的视频画面&…

值得推荐的5 款免费好用的数据恢复软件,学生党快收藏吧!

数据丢失是很多人都会遇到的问题&#xff0c;今天我带来5款免费好用的数据恢复软件推荐。 在日常生活中&#xff0c;我们经常因为误删除、格式化、清空回收站等原因丢失数据。这时&#xff0c;我们可以使用数据恢复软件来帮助我们找回丢失的数据。市面上的数据恢复软件琳琅满目…

maven3下载地址(含旧版本)

因为现有的3.8版本与IDEA不兼容&#xff0c;我需要下载3.6版本&#xff0c;但是官网的位置非常隐蔽&#xff0c;找了很多资料才看到。故记录一下。Index of /dist/maven/maven-3 选择需要的版本 选择binaries 选择zip文件下载就可以了

操作系统(1)——学习导论(Ⅰ)

目录 小程一言专栏链接: [link](http://t.csdnimg.cn/6grrU) 学习导论什么是操作系统主要功能强调 操作系统历史硬件层面处理器重要特点and功能 存储器磁盘I/O设备小程常用的I/O设备及其特点 小程一言 本操作系统专栏&#xff0c;是小程在学操作系统的过程中的第一步&#xff…

go interface{} 和string的转换问题

1.遇到的问题 问题来源于,我sql模版拼接遇到的问题。 首先&#xff0c;这样是没有问题的。 var qhx interface{} "qhx"s : qhx.(string)fmt.Println(s) 但是当我在这段代码里用的时候:1.类型断言 var sqlStr "select * from tx_user where username %s"…

【自然语言处理】:实验4答案,预训练语言模型实现与应用

代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;只展示主要任务实验结果&#xff0c;如果需要详细的实验报告或者代码可以私聊博主&#xff0c;接实验技术指导1对1 实验要求布置请看http://t.csdnimg.cn/1sh7s 运行模型&#xff0c;测试模型在有 100%…

真Unity3D编辑器Editor二次开发

IMGUI Editor Label 改变颜色 分享一个很神奇的颜色 一开始这么写&#xff0c;以为不行的&#xff0c; private void OnGUI()(){GUILayout.Label("<colorred>name:</color>ffdasilufoi");//。。。。 } 结果这么写又好了&#xff0c; private GUIStyle m…

基于qt的图书管理系统----03核心界面设计

参考b站&#xff1a;视频连接 源码github&#xff1a;github 目录 1 添加软件图标2 打包程序3 三个管理界面设计4 代码编写4.1 加载界面4.2 点击按钮切换界面4.3 组团添加样式4.4 搭建表头4.5 表格相关操作 从别人那里下载的项目会有这个文件&#xff0c;里边是别人配置的路径…