19 i2c的dev-interface实现eeprom的读写

CH34X USB转I2C芯片调试:i2c-tools实战与性能调优指南 I2C(Inter-Integrated Circuit)是一种广泛应用于嵌入式系统的串行通信总线协议,它通过主从架构和简单的双线制(SDA数据线、SCL时钟线)实现设备间通信。其工作原理基于开漏输出和线与逻辑,需要上拉电阻确保信号电平,这是理解I2C总线稳定性的基础。该协议的技术价值在于支持多主多从、硬件地址寻址和低速设备互联,在传感器数据采集、EEPROM存储和IO扩展等场景中至关重要。当通过CH34X这类USB转I2C桥接芯片扩展主控能力时,标准工具链的适配成为关键。本文聚焦于在Linux环境下,如何 阅读详情

eeprom是用于存放小量数据的存储芯片。 at24c02就是使用i2c接口的eeprom的一种.

at24xxx eeprom的工作原理参考: http://blog.youkuaiyun.com/jklinux/article/details/74162876

dev-interface就是i2c控制器供应用程序调用的接口.不熟识的话请参考: http://blog.youkuaiyun.com/jklinux/article/details/78676741

主要的读写时序:
这里写图片描述

由上时序图可见,让eeprom在指定的位置(word address: 0 ~ 255)上存放数据(data)时, ioctl(fd, I2C_RDWR, …)函数需要调用一次, 需要一条struct i2c_msg消息.


这里写图片描述

由上时序图可见,读出eeprom在指定的位置(word address: 0 ~ 255)上存放数据时, ioctl(fd, I2C_RDWR, …)函数需要调用一次, 需要两条struct i2c_msg消息. 第一条写消息需要把要读的位置发给eeprom, 第二条读消息接收eeprom输出的数据.



实现eeprom里循环存放’A’ ~ ‘Z’字符:

/* eeprom_write.c */

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>

#define EEPROM_ADDR  0x50

int main(void)
{
    int fd, i;

    fd = open("/dev/i2c-0", O_RDWR);
    if (fd < 0)
    {
        perror("open i2c controller");
        return 1;
    }
///////////////////////////////////////在eeprom里循环存放'A'--'Z'
    char wdata[2];
    struct i2c_msg msg = {
        EEPROM_ADDR, 0, 2, wdata
    };
    struct i2c_rdwr_ioctl_data   wdat = {
        .msgs = &msg,
        .nmsgs = 1,
    };          

    for (i = 0; i < 256; i++)
    {
        wdata[0] = i;
        wdata[1] = i%26+'A';

        if (ioctl(fd, I2C_RDWR, &wdat) < 0)
        {
            perror("i2c rdwr failed\n");
            break;
        }
        usleep(1000); //发出停止信号后, 在再发出开始信号前需要延时一会
    }

//////////////////////////////////////

    close(fd);
    return 0;
}

读出eeprom里所有的内容:

/* eeprom_read.c */

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>

#define EEPROM_ADDR  0x50

int main(void)
{
    int fd, i;

    fd = open("/dev/i2c-0", O_RDWR);
    if (fd < 0)
    {
        perror("open i2c controller");
        return 1;
    }
    char reg, dat;
    struct i2c_msg msgs[2] = {
        {EEPROM_ADDR, 0, 1, &reg},
        {EEPROM_ADDR, I2C_M_RD, 1, &dat},
    };
    struct i2c_rdwr_ioctl_data   rwdat = {
        .msgs = msgs,
        .nmsgs = 2,
    };          

    for (i = 0; i < 256; i++)
    {
        reg = i;
        if (ioctl(fd, I2C_RDWR, &rwdat) < 0)
        {
            perror("i2c rdwr failed\n");
            break;
        }
        usleep(1000); //发出停止信号后, 在再发出开始信号前需要延时一会
        if (0 == i%26)
            printf("\n");
        printf("%c ", dat);

    }

//////////////////////////////////////

    close(fd);
    return 0;
}
RL78/D1A SAU串行阵列单元:三种通信模式配置与实战指南 串行通信是嵌入式系统连接外部设备的核心技术,其原理是通过特定的时序协议在设备间传输数据。在微控制器中,硬件串行通信单元负责处理位时序、时钟生成和错误检测等底层细节,从而将CPU从繁琐的时序控制中解放出来,提升系统实时性和可靠性。这种硬件支持对于工业控制、家电和低功耗应用至关重要,能够确保通信的稳定性和效率。串行阵列单元(SAU)作为RL78/D1A微控制器的可配置通信硬件,集成了三种最常用的串行通信协议:3线串行I/O(CSI)、通用异步收发器(UART)和简化I2C。通过灵活的寄存器配置,SAU可以高效适 阅读详情

相关推荐

Linux内存时序与SPD信息查看指南:从dmidecode到decode-dimms

内存时序是衡量内存性能的关键参数,它定义了内存执行读写操作所需的时钟周期延迟,直接影响系统的响应速度和带宽。其原理基于内存控制器与DRAM颗粒之间的信号同步,通过CL、tRCD、tRP、tRAS等时序参数精细控制数据访问流程。优化内存时序能显著降低延迟,提升游戏、数据库及科学计算等延迟敏感型应用的性能。在服务器运维、高性能计算和硬件调试等场景中,准确获取内存的SPD信息和实时时序至关重要。本文聚焦于Linux环境下,如何利用dmidecode、decode-dimms等工具链,深入探查内存的XMP配置、JE

weixin_30681121的博客 461

【嵌入式】串口:I2C-EEPROM应用

1. 查看i2c源代码 smbus_write_quick命令功能:发送一个读写位给设备 static inline __s32 i2c_smbus_write_quick(int file, __u8 value) { return i2c_smbus_access(file,value,0,I2C_SMBUS_QUICK,NULL); } smbus接收字节函数:i2c_smbus_read_byte() static inline __s32 i2c_smbus_read_byte(int fil

l5799的博客 964

基于ESP32-S3打造多功能嵌入式调试工具:USB转UART、SPI编程器与逻辑分析仪三合一

在嵌入式开发中,USB转串口、SPI编程器和逻辑分析仪是调试单片机与FPGA的核心工具。其原理分别基于USB CDC通信协议、SPI总线时序控制以及GPIO电平采样与时间戳记录。这些工具的技术价值在于极大简化了硬件调试流程,提升了开发效率。典型的应用场景包括固件烧录、串口通信调试以及数字信号时序分析。本文聚焦于利用ESP32-S3开发板的USB OTG、双核处理能力及丰富GPIO等硬件特性,通过软件整合,实现上述三大功能的单一设备集成。该方案涉及**USB CDC双通道**通信与**SPI主机驱动**等关键

weixin_34296641的博客 381

I2C外挂eeprom的读写

##I2C简介 I2C总线通信是一种通信协,用于连接微控制器及其外围设备,由两根线组成,时钟线SDA和数据线SCL。 如图所示,外挂设备接到相应的线上就可以被i2c识别到,另外关于scl,sda以怎么样的波形去发送消息,以及设备的应答波纹就不在详细介绍了,这个对于不是直接写驱动的开发人员来说没有必要了解,...

wangxiuwen12的博客 5437

Windows 11 24H2下GCC本地C开发精准配置指南

在现代Windows系统中,C语言开发已不再局限于传统IDE或WSL环境;Control Flow Guard(CFG)、Shadow Stack等安全机制升级,使得GCC工具链必须适配操作系统底层防护策略。理解编译器与Windows内核的安全协同原理,是构建稳定、可调试、低延迟本地C开发环境的技术前提。其核心价值在于支撑嵌入式仿真、硬件直连通信、实时控制逻辑等对执行确定性要求严苛的场景。本文聚焦Windows 11 24H2环境下GCC 15.1与VSCode深度集成实践,涵盖CFG兼容工具链选型、lau

weixin_34367257的博客 349

【7】ipmi sdr & sel log

sensor type是cpu/内存/psu/fan等哪一类,sdr(sensor的数据结构)被组件监控PLDM延续,类似配置文件即静态存储,bmc根据这配置文件去展示sensor数值:温度功耗都是连续值是阈值sensor(43.1),状态型的sdr(43.2)如风扇有没有故障和在位,43.3:记一个sel日志必然对应一个sdr,但是这个sdr不想显示当前状态,只是用来记一条sel日志用的,就可以是这个类型,比compact(压缩)记录东西更少。 如下分HEADER/KEY/BODY,sensor num

持续更新ing... 1023

IIC设备驱动程序(八)————dev-interface

用户空间访问IIC设备

yangguoyu8023的博客 772

【16】linux命令/工具,systemd,文件操作,动静态库,信号,socket

apt install python3-pip --fix-missing(断开vpn,cp /etc/apt/sources.list /etc/apt/sources.list.bak,python3 -m pip install --upgrade pip,apt-get update,pip install 包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com)设置时间,联网,apt-get install vim。

持续更新ing... 6786

【InterFace】I2C 总线详述

背景 昨天出去了一趟,人问:你熟悉什么?答:软硬件。结果,好尴尬。 硬件一般都做什么内容? 答:电源设计。 能说下升压、降压电路是怎么实现的吗? 答:不能。(Ps:后续增加 电源设计原理) 通讯都用到什么接口? 答:UART、I2C、SPI。 然后我想,I2C 我研究了好久,我得把话题转到 I2C 上。 我说:我最近在做 I2C 的接口。 I2C 和 SPI 有什么区别? 答...

吴秀华Cherry的有趣博客 3957

【信息科学与工程学】【制造工程】计算机科学与自动化——服务器制造中的学科知识01

由可数可加性:μ(A)=∑k=1∞​μ(Bk​)=limn→∞​∑k=1n​μ(Bk​)=limn→∞​μ(⋃k=1n​Bk​)=limn→∞​μ(An​)。:若limsupAn​=liminfAn​=A,则A中的元素恰是那些“最终总是属于An​”的元素,也是那些“属于无穷多个An​但不属于无穷多个Anc​”的元素。:通过构造一个不相交的序列{Bn​},其中B1​=A1​, Bn​=An​∖(⋃k=1n−1​Ak​)。则⋃n​Bn​=⋃n​An​,且Bn​⊂An​。我们称A为一个“集类”或“集合族”。

weixin_49199313的博客 556

I2C——读写时序

I2C 基本的读写时序

tyustli 1万+

I2C基本读写过程

一、通讯过程基本结构: 这些图中表示的是主机和从机通讯中,SDA线的数据包序列。 其中 S 表示由主机的 I2C 接口产生的传输起始信号(S),这时连接到 I2C 总线上的所有 从机都会接收到这个信号。 起始信号产生后,所有从机就开始等待主机紧接下来 广播 的从机地址信号 (SLAVE_ADDRESS)。 在 I2C 总线上,每个设备的地址都是唯一的, 当主机广播的地址与 某个设备地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号。 根据 I2C 协议,这个从机地址可以是 7

嘉禾天成‘s Blog 1万+

LT6911C驱动开发:芯片级寄存器配置与MIPI时序精准控制

视频桥接芯片驱动本质是硬件协议栈的底层实现,核心在于I²C精确时序控制、EDID动态解析与MIPI D-PHY相位校准。LT6911C作为典型非标准显示桥接器件,不兼容DRM/KMS框架,需绕过Linux通用显示子系统,直接操作寄存器完成HDCP 2.2密钥协商、HTOTAL/VTOTAL timing生成及clock lane相位微调。其技术价值体现在对±0.3ns MIPI clock jitter、±50ns I²C写入误差、10ms级HDCP状态机超时等工业级指标的硬实时保障,广泛应用于折叠屏副屏、

weixin_26886855的博客 289

android读写iic设备

http://blog.youkuaiyun.com/daniel117/article/details/17464783?locationNum=2&fps=1   在Android开发和移植过程中,有时需要对某设备进行读写,但系统可能并未提供相应的服务。我们就需要自己开发硬件访问服务来控制设备。下面的例子是读写最简单的i2c设备eeprom的流程, i2c的驱动编写有两种方式,一种是利用系统提供的

9527的专栏 2376

保姆级教程:在Windows 10上为QT5.15.2配置Android开发环境(含SDK/NDK/JDK避坑指南)

本文提供了一份详细的Windows 10环境下为QT5.15.2配置Android开发环境的保姆级教程,涵盖SDK、NDK、JDK的安装与配置,以及常见问题的避坑指南。通过优化安装流程、解决Gradle下载慢等痛点,帮助开发者快速搭建稳定的编译环境,并提供了模拟器配置和调试技巧,确保开发效率。

weixin_30919571的博客 526

Ghidra逆向分析实战:从安装JDK到解析STM32的bin文件(附SVD插件配置)

本文详细介绍了使用Ghidra进行STM32固件逆向分析的完整流程,从JDK安装配置到SVD插件的应用。通过实战案例展示如何解析bin文件、恢复符号信息以及利用SVD插件识别外设寄存器,帮助开发者高效完成嵌入式设备的逆向工程任务。

weixin_29309475的博客 643

LMK61E2时钟芯片I2C接口与寄存器编程实战指南

I2C总线作为一种广泛应用的串行通信协议,是嵌入式系统中连接微控制器与各类外设芯片的关键桥梁。其工作原理基于主从架构,通过SDA和SCL两根信号线实现数据的可靠传输,核心价值在于以极少的引脚资源实现多设备间的有序通信。在高速数据采集、通信设备等对时序精度要求严苛的应用场景中,精确配置时钟发生器芯片是保障系统性能稳定的基石。本文聚焦于德州仪器LMK61E2这款超低抖动时钟发生器,深入剖析其I2C接口的**设备寻址**、**块读写操作**以及独特的SRAM与EEPROM协同工作机制,为工程师提供从驱动开发到配置

weixin_34293141的博客 317

宏基因组功能注释实战:从CAZyme到VFDB的完整流程(含数据库下载与脚本优化)

本文详细介绍了宏基因组功能注释的完整流程,涵盖CAZyme、eggNOG、CARD和VFDB四大核心数据库的实战应用。从环境配置、数据库下载与预处理到注释流程执行与优化,提供了全面的操作指南和脚本优化建议,帮助研究人员高效完成宏基因组数据分析。特别针对CAZyme注释等关键步骤给出了参数优化方案和常见问题排查方法。

weixin_29289821的博客 295

树莓派SPI与I2C接口配置与驱动实战指南

串行通信接口是嵌入式系统与外部设备交互的基础,其中SPI和I2C是两种最常用的协议。SPI采用主从架构,通过时钟、数据线和片选信号实现高速全双工通信,适用于显示屏、存储芯片等对速率要求高的场景。I2C则凭借仅需两根线的总线结构和设备地址寻址机制,在连接多个低速传感器时能显著节省GPIO引脚资源。掌握这两种接口的配置与驱动,对于树莓派等嵌入式平台开发具有重要价值,能够高效驱动各类传感器、显示模块和执行器。本文以树莓派为例,详细讲解如何通过系统配置启用SPI和I2C接口,并分别使用C++的WiringPi库和P

weixin_34275734的博客 396

YOLOv11改进策略【小目标改进】| Shape-NWD:融合改进,结合Shape-IoU和NWD 更好地适应小目标特性

Bw−wgt2h−hgt2weight2Bweight2w−wgt​2h−hgt​2​其中weight2weight = 2weight2。

Limiiiing的博客 3049

Modelsim:LPDDR5仿真(含美光仿真模型官方sv&vcs代码)

虽然,三星在设计跟量产上,早于其他家存储产商,但是镁光后来居上了,是业界首家支持全速 LPDDR5 的供应商,并且开发者在做开发的时候,也是用美光颗粒比较多,所以这里就先以美光的仿真模型为主进行仿真。 本工程为美光官方工程,支持Modelsim、VCS、ncverilog三种仿真器仿真。模型破解过,为完整system-verilog代码。

千歌叹尽执夏的博客 1281

树莓派外接ADS1115实现高精度模拟信号采集

模拟信号采集是嵌入式系统中连接物理世界的基础环节,其核心在于将连续电压变化转化为可处理的数字量。实现这一过程需兼顾ADC分辨率、参考电压稳定性、接口扩展性与抗干扰能力。16位ADC如ADS1115凭借高分辨率(65536级量化)、内置PGA可编程增益放大及I²C多设备兼容性,在树莓派等无原生ADC的单板计算机中成为主流选择。相比8位ADC模块,它显著提升微伏级小信号分辨力;相比SPI类ADC,I²C总线天然支持多设备挂载,简化硬件布线并增强通信鲁棒性。典型应用场景涵盖温湿度传感、电池电压监控、应变片测量及工

weixin_30652491的博客 391

RT-DETR训练自己的数据集(从代码下载到实例测试)

在Windows10上配置CUDA环境教程是百度提出的一种实时目标检测模型。RT-DETR采用了与DETR相同的编码器和解码器结构,但对其进行了大量的优化,在保持较高检测精度的同时,实现了实时目标检测,为目标检测领域提供了一种新的有效解决方案,具有广泛的应用前景,如自动驾驶、智能监控、机器人等领域。以上是RT-DETR官方的论文和代码,详细介绍了RT-DETR的构成和实现。在YOLOv10中也实现了RT-DETR的代码,所以本文使用YOLOv10的项目文件进行RT-DETR的训练和测试。YOLOv10。

Limiiiing的博客 4万+

TI 66AK2L06多核处理器启动配置全解析:从PLL到SBL实战指南

在嵌入式系统开发中,启动配置是决定系统能否成功运行的首要环节,其本质是芯片上电后通过硬件引脚或启动参数表获取初始化指令的过程。这一机制的核心原理在于引导ROM Bootloader(RBL)加载并执行第一段代码,完成时钟、内存及外设的初始化。其技术价值在于为复杂SoC提供了灵活、可靠的启动路径,是系统稳定性的基石。启动配置广泛应用于网络通信、工业控制、高性能计算等场景,工程师需要深入理解PLL配置、DDR3初始化和多阶段引导等关键技术。本文以德州仪器(TI)的66AK2L06多核DSP+ARM处理器为例,详

weixin_33858336的博客 349

(五)深入理解蓝牙BLE之“Beacon包格式详解”

蓝牙Beacon格式详解 本文重点在结合Bluetooth官网spec和几个例子来使beacon帧格式更加容易被理解。 广播帧格式: 首先beacon是蓝牙BLE广播包的一种,蓝牙广播帧格式如下: PS:其实BLE数据帧除了报头字段和数据字段定义与广播帧不同之外,前导/接入地址/长度/校验格式均相同。 广播帧数据字段格式: 数据字段最长为37个字节:6个字节的广播设备地址 + 31个字节广播数据。 广播数据的格式如下:AD Structure1 +AD Structure2 + .....

1万+

GEE:本地影像上传到GEE的Assets中,并输入机器学习算法中作为特征变量

当我们在 Google Earth Engine(GEE)中应用机器学习算法时,会输入一些影像作为特征变量数据,进一步根据这些特征影像去推理未知区域的数据。但是 GEE 平台上计算特征变量的 API 函数并不是非常全面,我们希望获得更多的特征用于分类。这个时候,我们可以将本地计算的特征影像上传到 GEE 中进行后续处理。本文记录了从本地上传特征数据到 GEE 的 Assets 中的教程,用于后续在 GEE 中分类或者回归使用。本文也可作为《》一文的补充。

养乐多的博客 1730
上一篇: 笔试题 7
下一篇: 20 设备树里声明i2c设备
jklinux
博客等级 码龄10年 1060粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值