LinuxI2C应用编程——访问EEPROM

news2024/11/14 12:21:01

文章目录

  • 介绍
  • 读芯片手册
  • 代码
  • 编译运行

阅读博文:LinuxI2C应用编程——I2C-Tools的使用

介绍

EEPROM (Electrically Erasable Programmable read only memory),指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。

读芯片手册

首先按如图所示的方式接好拓展版和EEPROM。

在这里插入图片描述
由原理图可知,它的地址为0x50,借助i2cdecect工具可以查看E2PROOM所在插槽对应芯片的哪一个I2C控制器。输入:i2cdetect -y -a 1,地址0x50在I2C控制器1上。
在这里插入图片描述
查阅芯片手册,本实验的E2PROOM,型号为AT24C02,其对应的存储空间为(256*8)位

指定地址写的时序图:
在这里插入图片描述
当前地址读:
在这里插入图片描述
指定地址读:
在这里插入图片描述

指定地址连续读:
在这里插入图片描述
由于执行写一个字节后会进入内部的写循环,在这段时间,所有的输入被禁止,循环时间是10ms,需要利用定时器延时毫秒,使用nanosleep函数,设置时间结构体,最小单位是纳秒。
在这里插入图片描述

在这里插入图片描述

代码

内核提供了驱动程序 drivers/i2c/i2c-dev.c,编写应用后通过它可以直接使用下面的 I2C 控制器驱动程序来访问 EEPROM设备

#include <sys/ioctl.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <i2c/smbus.h>
#include "i2cbusses.h"
#include <time.h>


//要达到以下目标
/* ./at24c02 <i2c_bus_number> w "100ask.taobao.com"
 * ./at24c02 <i2c_bus_number> r
 */
 int main(int argc,char **argv)  				
{									
	unsigned char dev_addr = 0x50; //设置设备地址
	unsigned char mem_addr = 0; //设置存储空间的地址,从0开始读
	unsigned char buf[32]; //只读32个字节

	int file;
	char filename[20];
	int* str;
	if(argc != 3 && argc != 4)/*当输入的参数个数不是3或者4的时候,也就是不符合要求*/
	{
		printf("Usage:\n");
		printf("write eeprom: %s /dev/i2c-0|1|2 w string\n",argv[0]);//命令格式的提示信息
		printf("read  eeprom: %s /dev/i2c-0|1|2 r \n",argv[0]);
		return -1;
	}
	file = open_i2c_dev(argv[1][0]-'0', filename, sizeof(filename), 0); //打开iic设备
	//open_i2c_dev的第一个参数需要是i2c控制器的编号:整数
	//argv[1] 是字符串,需要取出第0个字符
	if(file < 0)
	{	
		printf("can't open %s\n",filename);
		return -1;
	}
	//设置地址
	if(set_slave_addr(file, dev_addr, 1))  //设为1是强制设置
	{
		printf("can't set_slave_addr %s\n",filename);
		return -1;		
	}
	if (argv[2][0] == 'w')
	{
		// write str: argv[3]
		str = argv[3];

		req.tv_sec  = 0;
		req.tv_nsec = 20000000; /* 20ms */
		
		while (*str)
		{
			// mem_addr, *str
			// mem_addr++, str++
			//使用SMBus协议写一个字节
			ret = i2c_smbus_write_byte_data(file, mem_addr, *str);
			//写入设备错误
			if (ret)
			{
				printf("i2c_smbus_write_byte_data err\n");
				return -1;
			}
			// wait tWR(10ms)
			nanosleep(&req, NULL);
			
			mem_addr++;
			str++;
		}
		
		ret = i2c_smbus_write_byte_data(file, mem_addr, 0); // string end char
		if (ret)
		{
			printf("i2c_smbus_write_byte_data err\n");
			return -1;
		}
	}
	else
	{
		// read
		//使用I2c协议连续读多个字节
		ret = i2c_smbus_read_i2c_block_data(file, mem_addr, sizeof(buf), buf);
		//读取设备错误
		if (ret < 0)
		{
			printf("i2c_smbus_read_i2c_block_data err\n");
			return -1;
		}
		
		buf[31] = '\0';
		printf("get data: %s\n", buf);
	}
	
	return 0;
	
}

编译运行

由于源码内部用到了i2c协议和smbus协议,将两个协议的头文件和.c文件拷贝到代码目录下,编写Makefile进行交叉编译,目录结构如图所示:
在这里插入图片描述

Makefile内容:

all:
	$(CROSS_COMPILE)gcc -I ./include -o at24c02_test at24c02_test.c i2cbusses.c smbus.c

在这里引入CROSS_COMPILE变量,指定交叉编译。

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

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

相关文章

SSMP整合案例(15) 解决分页中删除最后一页的最后一条数据,导致查询错位问题

上文 我们还是做了个比较重要的是 将我们的查询全部逻辑改为了分页查询 但是 目前 我们的删除和分页配合起来 它会有一点点问题 例如 这种情况 我们最后一页只有一条数据了 我们操作删除 将这条数据给他干掉 删除完之后 它会调分页查询 但我们当前页的条件还是之前的 例如 我…

【网络】UDP协议详解

目录 UDP的感性理解 UDP协议格式 UDP协议格式感性理解 UDP特点 UDP的缓冲区 UDP的感性理解 UDP的传输过程类似于寄信&#xff0c;假设你要写一封家书寄回家里&#xff1a;首先你要在信封上填写好寄件人和收件人的地址&#xff0c;其次在贴好邮票&#xff0c;最后将信件投放…

MySQL数据库 库表操作

1. (1) mysql> create database Market; 创建数据库 mysql> use Market 使用Market数据库(2) mysql> create table customers(-> c_num int(11) primary key auto_increment,-> c_name varchar(50),-> c_contact varchar(50),-> c_city varc…

ChatGPT炒股:从巨潮资讯网上批量下载特定主题的股票公告

巨潮资讯网是股票公告的指定披露渠道之一&#xff0c;上面有非常详细的A股股票公告内容。 现在&#xff0c;我们要获取2023-01-04~2023-07-04期间所有新三板公司中标题包含“2023年日常性关联交易”的公告。 首先从network中获取到真实网址&#xff1a;http://www.cninfo.com…

大一下学期期末考wp

【web】 1.sign 打开题目 发现有1000个页面 打开第9999个和第9998个页面&#xff0c;发现是utf-8编码 当再随机打开其他页面时&#xff0c;页面又出现了另外一种情况 于是我们猜测&#xff0c;flag是由utf-8编码的&#xff0c;编码被拆散了随机放在10000个页面中的几个页面中…

找不到msvcp140.dll解决方法有哪些?那个修复方法更简单

是使用Windows操作系统的计算机时&#xff0c;总是不可避免会遇到系统报错。像计算机提示找不到msvcp140.dll&#xff0c;msvcp140.dll是一个Windows操作系统中的动态链接库文件&#xff0c;它属于Microsoft Visual C Redistributable包的一部分。这个文件包含了一些供C程序使用…

计算机的大脑 CPU

晶体管 N型MOS管P型MOS管 算术逻辑单元 ALU 晶体管–>门电路–>加法器–>ALU 既可以做逻辑运算、也可以做逻辑运算、成为计算机CPU中非常核心的组件。 指令 一条指令只完成一个基本操作的精简指令集 RISC 、它们的指令长度基本上是固定的。比如 ARM一条指令可以…

【SLAM14讲】02 视觉SLAM基本架构

一、传感器 1.1 安装位置分类 根据安装位置分为两类&#xff1a; 携带于机器人本体 上的传感器&#xff0c;比如激光传感器、相机、轮式编码器、惯性测量单元&#xff08;Inertial Measurement Unit, IMU&#xff09;等等&#xff0c;它们测到的通常都是一些间接的物理量而不…

一键创建日期命名的txt文件(方便日报)

背景 刚工作&#xff0c;免不了写日报&#xff0c;写日计划的时候。为了方便&#xff0c;写了一个bat文件直接点击即可创建今天时间命名的txt文件 代码 win10我的笔记本 echo set tmp%date:~3,4%%date:~8,2%%date:~11,2% type nul > %tmp%.txtwindows 下创建文件就是 t…

排序算法性能分析

目录 实现插入排序、冒泡排序、选择排序、合并排序、快速排序算法&#xff08;从小到大&#xff09; ①插入排序 ②冒泡排序 ③选择排序 ⑥快速排序 五种排序 现在有10亿的数据&#xff08;每个数据四个字节&#xff09;&#xff0c;请快速挑选出最大的十个数&#xff0…

红黑树与234树

红黑树 参考&#xff1a;宇文新粥&#xff1a;红黑树红黑树可视化 234树 这个树有三种节点&#xff0c;分别包含1/2/3个元素&#xff0c;下方可以有2/3/4个子节点理解234树的插入 红黑树与234树之间的关系 红黑树有几个特性&#xff0c;但如果从234树的角度理解红黑树&…

在微软十年了!

时光飞逝&#xff0c;光阴如梭。 2013 年的 7 月 8 号&#xff0c;我在隔壁的交大软院毕业后&#xff0c;正式入职紫竹微软。 至今&#xff0c;已是整整 10 年了。 记得当时的闵行回市区的交通还不是那么堵&#xff0c;坐 5点半的班车下班&#xff0c;S4中环一路走&#xff0c;…

【C++ OJ练习】4.字符串中的第一个唯一字符

1.题目链接 力扣 2.解题思路 利用计数排序的思想 映射进行计数 最后计数为1的那个字符就是唯一字符 从前往后遍历 可以得到 第一个唯一字符 3.代码 class Solution { public:int firstUniqChar(string s) {//使用映射的方式统计次数 计数排序思想int count[26] { 0 };fo…

机器视觉硬件选型-工业光源-环形光源

视觉人机器视觉-硬件发货前硬件确认效果 工业光源根据灯的几何形状可分为条形光源,分区光源&#xff0c;环形光源、圆顶&#xff08;积分&#xff09;光源、平面光源&#xff0c;同轴光源&#xff0c;方形光源&#xff0c;线扫光源&#xff0c;点光源&#xff0c;线光源等等。 …

在上海滩,听懂5G时代的浪奔浪流

几天前的“湾区升明月”上&#xff0c;赵雅芝与吕良伟合唱了一首《上海滩》。“浪奔&#xff0c;浪流”的歌词一出&#xff0c;无数记忆涌上了一代人的心头。 上海这座城市&#xff0c;始终代表着进取、创新、引领&#xff0c;代表着面向世界的中国形象。黄浦江的浪花&#xff…

【尚医通】vue3+ts前端项目开发笔记 2 —— 创建项目、封装网络请求、集成elment-plus 、重置样式、准备状态管理/路由 等开发前准备

尚医通开发记录(Vue3TypeScriptPiniaAxios) 一、接口地址 服务器地址:http://syt.atguigu.cn 医院接口&#xff1a;http://139.198.34.216:8201/swagger-ui.html 公共数据接口&#xff1a;http://139.198.34.216:8202/swagger-ui.html 会员接口&#xff1a;http://139.198.34…

掌握文件转换的技巧:在线工具帮你轻松转换为PDF格式

许多文件都有自己的原始格式&#xff0c;然而这些格式都可以进行修改。遇到无法打开或信息丢失的情况时&#xff0c;可以进行格式转换&#xff0c;其中效果最好的就是PDF格式&#xff0c;无论在哪个平台上查看文档&#xff0c;都有自己的格式&#xff0c;能够在所有平台上查看的…

中国首个铝基轻量化平台?纯电中型 SUV 奇瑞eQ7将于7月12日发布

奇瑞新能源将于7月12日发布首台量产车奇瑞eQ7&#xff0c;并公布中国首个铝基轻量化平台。 车型参数&#xff1a;奇瑞 eQ7是一款定位纯电动中型SUV&#xff0c;采用后置后驱和油冷扁线三合一电机技术。其以全铝车身和全铝平台为基础&#xff0c;整备质量为185kg。车身尺寸为467…

表中签到ID格式是以逗号分隔,需将ID拆开并分成多条数据

原有数据格式&#xff1a; 拆分后数据格式&#xff1a; 拆分SQL: select bc.资源名称,bc.资源ID,bc.签到时间,bc.签到人,bb.column_value 签到附件ID from report_fir.V_kw_checksign_info bc,table(hbrmw6.split_string(bc.签到附件ID,,)) bb; HBRMW6.split_string函数创…

mysql数据库内存占用高原因(数据库内存占用高)

1、查看数据库分配内存大小 ( mysql内存计算器&#xff0c;具体地址为http://www.mysqlcalculator.com/ ) select VARIABLE_NAME,VARIABLE_VALUE/1024/1024 MB from information_schema.GLOBAL_VARIABLES WHERE VARIABLE_NAME in (key_buffer_size,query_cache_size,tmp_tabl…