用户态接口应用与编写APP-RZMPU工业控制教程连载(10)

原创 瑞萨MCU小百科 2024-09-10 12:00


5.5 使用用户态接口访问I2C设备


i2c-tools帮我们封装好了用户态访问I2C设备的接口,它是一套好用的工具,也是一套示例代码。


5.5.1体验I2C-Tools

使用一句话概括I2C传输:APP通过I2C Controller与I2CDevice传输数据。


所以使用I2C-Tools时也需要指定:

⚫ 哪个I2C控制器(或称为I2C BUS、I2C Adapter)

⚫ 哪个I2C设备(设备地址)

⚫ 数据:读还是写、数据本身


1. 交叉编译

⚫ 配置环境:

source /opt/remi-sdk/environment-setup-aarch64-poky-linux

在Makefile中,“?=”在第一次设置变量时才会起效果,如果之前设置过该变量,则不会起效果。


注意:

①执行make时,是动态链接,需要把libi2c.so也放到单板上。

②想静态链接的话,执行:make USE_STATIC_LIB=1


2. 用法

⚫ i2cdetect:I2C检测。

左右滑动查看完整内容

// 列出当前的 I2C Adapter(或称为 I2C Bus、I2C Controller)i2cdetect -l// 打印某个 I2C Adapter 的 Functionalities, I2CBUS 为 0、1、2 等整数i2cdetect -F I2CBUS// 看看有哪些 I2C 设备, I2CBUS 为 0、1、2 等整数i2cdetect -y -a I2CBUS// 效果如下# i2cdetect -li2c-3 i2c Renesas RIIC adapter I2C adapteri2c-1 i2c Renesas RIIC adapter I2C adapteri2c-0 i2c Renesas RIIC adapter I2C adapter# i2cdetect -F 0Functionalities implemented by /dev/i2c-0:I2C yesSMBus Quick Command yesSMBus Send Byte yesSMBus Receive Byte yesSMBus Write Byte yesSMBus Read Byte yesSMBus Write Word yesSMBus Read Word yesSMBus Process Call yesSMBus Block Write yesSMBus Block Read yesSMBus Block Process Call yesSMBus PEC yesI2C Block Write yesI2C Block Read yes// --表示没有该地址对应的设备, UU 表示有该设备并且它已经有驱动程序,// 数值表示有该设备但是没有对应的设备驱动# i2cdetect -y -a 0  0 1 2 3 4 5 6 7 8 9 a b c d e f00: 00 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --10: -- -- -- -- -- -- -- -- -- -- UU -- -- -- 1e --20: -- -- UU -- -- -- -- -- -- -- -- -- -- -- -- --30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --


⚫ i2cget:I2C读

使用说明如下:

左右滑动查看完整内容

# i2cgetUsage: i2cget [-f] [-y] [-a] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]] I2CBUS is an integer or an I2C bus name ADDRESS is an integer 0x03 - 0x77or 0x00 - 0x7f if -a is given) MODE is one of: b (read byte data, default w (read word data) c (write byte/read byte)Append p for SMBus PEC


使用示例:

左右滑动查看完整内容

// 读一个字节: I2CBUS 为 0、1、2 等整数, 表示 I2C Bus; CHIP-ADDRESS 表示设备地址i2cget -f -y I2CBUS CHIP-ADDRESS// 读某个地址上的一个字节: // I2CBUS 为 0、1、2 等整数, 表示 I2C Bus// CHIP-ADDRESS 表示设备地址// DATA-ADDRESS: 芯片上寄存器地址// MODE:有 2 个取值, b-使用`SMBus Read Byte`先发出 DATA-ADDRESS, 再读一个字节, 中间无P 信号// c-先 write byte, 在 read byte,中间有 P 信号i2cget -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS MODE // 读某个地址上的 2 个字节: // I2CBUS 为 0、1、2 等整数, 表示 I2C Bus// CHIP-ADDRESS 表示设备地址// DATA-ADDRESS: 芯片上寄存器地址// MODE:w-表示先发出 DATA-ADDRESS,再读 2 个字节i2cget -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS MODE 


⚫ i2cset:I2C写

使用说明如下:

左右滑动查看完整内容

# i2csetUsage: i2cset [-f] [-y] [-m MASK] [-r] [-a] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE]... [MODE] I2CBUS is an integer or an I2C bus name ADDRESS is an integer 0x03 - 0x77or 0x00 - 0x7f if -a is given) MODE is one of: c (byte, no value) b (byte data, default w (word data) i (I2C block data) s (SMBus block data)Append p for SMBus PEC


使用示例:

左右滑动查看完整内容

// 写一个字节: I2CBUS 为 0、1、2 等整数, 表示 I2C Bus; CHIP-ADDRESS 表示设备地址 // DATA-ADDRESS 就是要写的数据 i2cset -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS  // 给 address 写 1 个字节(address, value): // I2CBUS 为 0、1、2 等整数, 表示 I2C Bus; CHIP-ADDRESS 表示设备地址 // DATA-ADDRESS: 8 位芯片寄存器地址;  // VALUE: 8 位数值 // MODE: 可以省略,也可以写为 b i2cset -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS VALUE [b]  // 给 address 写 2 个字节(address, value): // I2CBUS 为 0、1、2 等整数, 表示 I2C Bus; CHIP-ADDRESS 表示设备地址 // DATA-ADDRESS: 8 位芯片寄存器地址;  // VALUE: 16 位数值 // MODE: w i2cset -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS VALUE w  // SMBus Block Write:给 address 写 N 个字节的数据 // 发送的数据有:address, N, value1, value2, ..., valueN // 跟`I2C Block Write`相比, 需要发送长度 N // I2CBUS 为 0、1、2 等整数, 表示 I2C Bus; CHIP-ADDRESS 表示设备地址 // DATA-ADDRESS: 8 位芯片寄存器地址;  // VALUE1~N: N 个 8 位数值 // MODE: s i2cset -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS VALUE1 ... VALUEN s // I2C Block Write:给 address 写 N 个字节的数据 // 发送的数据有:address, value1, value2, ..., valueN // 跟`SMBus Block Write`相比, 不需要发送长度 N // I2CBUS 为 0、1、2 等整数, 表示 I2C Bus; CHIP-ADDRESS 表示设备地址 // DATA-ADDRESS: 8 位芯片寄存器地址;  // VALUE1~N: N 个 8 位数值 // MODE: i i2cset -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS VALUE1 ... VALUEN i


⚫ i2ctransfer:I2C传输(不是基于SMBus)

使用说明如下:

左右滑动查看完整内容

# i2ctransferUsage: i2ctransfer [-f] [-y] [-v] [-V] [-a] I2CBUS DESC [DATA] [DESC [DATA]]... I2CBUS is an integer or an I2C bus name DESC describes the transfer in the form: {r|w}LENGTH[@address] 1) read/write-flag 2) LENGTH (range 0-655353I2C address (use last one if omitted) DATA are LENGTH bytes for a write message. They can be shortened by a suffix:= (keep value constant until LENGTH) + (increase value by 1 until LENGTH) - (decrease value by 1 until LENGTH) p (use pseudo random generator until LENGTH with value as seed)Example (bus 0, read 8 byte at offset 0x64 from EEPROM at 0x50): # i2ctransfer 0 w1@0x50 0x64 r8Example (same EEPROM, at offset 0x42 write 0xff 0xfe ... 0xf0: # i2ctransfer 0 w17@0x50 0x42 0xff


使用举例:

左右滑动查看完整内容

// Example (bus 0, read 8 byte at offset 0x64 from EEPROM at 0x50):# i2ctransfer -f -y 0 w1@0x50 0x64 r8// Example (bus 0, write 3 byte at offset 0x64 from EEPROM at 0x50):# i2ctransfer -f -y 0 w9@0x50 0x64 val1 val2 val3// Example // first: (bus 0, write 3 byte at offset 0x64 from EEPROM at 0x50)// and then: (bus 0, read 3 byte at offset 0x64 from EEPROM at 0x50)# i2ctransfer -f -y 0 w9@0x50 0x64 val1 val2 val3 r3@0x50 # i2ctransfer -f -y 0 w9@0x50 0x64 val1 val2 val3 r3 //如果设备地址不变,后面的设备地址可省略


5.5.2 I2C-Tools访问I2C设备的2种方式

I2C-Tools可以通过SMBus来访问I2C设备,也可以使用一般的I2C协议来访问I2C设备。


使用一句话概括I2C传输:APP通过I2C Controller与I2C Device传输数据。


在APP里,有这几个问题:

①怎么指定I2C控制器?

⚫ i2c-dev.c为每个I2C控制器(I2C Bus、I2C Adapter)都生成一个设备节点:/dev/i2c-0、/dev/i2c-1等等;

⚫ open某个/dev/i2c-X节点,就是去访问该I2C控制器下的设备;


②怎么指定I2C设备?

通过ioctl指定I2C设备的地址

⚫ ioctl(file,I2C_SLAVE,address)

◼ 如果该设备已经有了对应的设备驱动程序,则返回失败。

⚫ ioctl(file,I2C_SLAVE_FORCE,address)

◼ 如果该设备已经有了对应的设备驱动程序但是还是想通过i2cdev驱动来访问它,则使用这个ioctl来指定I2C设备地址。


怎么传输数据?

③两种方式

⚫ 一般的I2C方式:ioctl(file,I2C_RDWR,&rdwr)

⚫ SMBus方式:ioctl(file,I2C_SMBUS,&args)


5.5.3 源码流程分析

1. 使用I2C方式

示例代码:i2ctransfer.c

图I2C 读写源码流程


2. 使用SMBus方式

示例代码:i2cget.c、i2cset.c

图SMBus读写源码流程



5.6 编写APP


在开始前,请先按照下图所示连接AT24C02模块



本节源码位于如下目录:


源码如下所示:

左右滑动查看完整内容

int mainint argc, char **argv)unsigned char dev_addr = 0x50;unsigned char mem_addr = 0; unsigned char buf[32];
int file;char filename[20];unsigned char *str;
int ret;
struct timespec req;
if (argc != 3 && argc != 4 {printf"Usage:\n");printf"write eeprom: %s w string\n", argv[0]);printf"read eeprom: %s r\n", argv[0]);return -1; } //打开指定的 I2C 设备文件 file = open_i2c_dev(argv[1][0]-'0', filename, sizeof(filename), 0); if (file < 0{ printf"can't open %s\n", filename); return -1; } //设置 I2C 设备的从设备地址 if (set_slave_addr(file, dev_addr, 1)) { printf"can't set_slave_addr\n"); return -1; } //如果命令行参数是 “w”,则将字符串写入 EEPROM。 if (argv[2][0] == 'w' { // write str: argv[3] str = argv[3];
req.tv_sec = 0; req.tv_nsec = 20000000; /* 20ms */ while (*str)// 逐个字符写入 EEPROM { // mem_addr, *str // mem_addr++, str++ 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);// 每次写入后等待 20 毫秒 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 //如果命令行参数是 “r”,则从 EEPROM 读取数据。 { // read 读取 EEPROM 数据 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;
}


编译:由于应用程序需要借助两个库i2cbusses.c和smbus.c,那么在编译应用程序时需要包含这两个程序:

左右滑动查看完整内容

source /opt/remi-sdk/environment-setup-aarch64-poky-linux$CC -I ./include -o at24c02_test at24c02_test.c i2cbusses.c smbus.c


假设设置开发板的IP为:192.168.5.9,上传程序到开发板上。

左右滑动查看完整内容

scp ./input_read_fasync root@192.168.5.9:/mnt/


测试:进入/mnt目录运行程序:

root@myir-remi-1g:~# cd /mnt/root@myir-remi-1g:/mnt# lsat24c02_test


接上at24c02模块,向模块中写入数据,再读出来:

左右滑动查看完整内容

root@myir-remi-1g:/mnt# ./at24c02_test 3 w 123456789root@myir-remi-1g:/mnt# ./at24c02_test 3 rget data: 123456789


需要技术支持?

如您在使用瑞萨MCU/MPU产品中有任何问题,可识别下方二维码或复制网址到浏览器中打开,进入瑞萨技术论坛寻找答案或获取在线技术支持。

https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/



未完待续


推荐阅读

Linux串口应用编程 - RZ MPU工业控制教程连载(6)

赢瑞米派 | 瑞萨RZ/G通用MPU研讨会火热报名中

函数应用及数据读取 - RZ MPU工业控制教程连载(5)

更多精彩,敬请关注


评论
  • Matter 协议,原名 CHIP(Connected Home over IP),是由苹果、谷歌、亚马逊和三星等科技巨头联合ZigBee联盟(现连接标准联盟CSA)共同推出的一套基于IP协议的智能家居连接标准,旨在打破智能家居设备之间的 “语言障碍”,实现真正的互联互通。然而,目标与现实之间总有落差,前期阶段的Matter 协议由于设备支持类型有限、设备生态协同滞后以及设备通信协议割裂等原因,并未能彻底消除智能家居中的“设备孤岛”现象,但随着2025年的到来,这些现象都将得到完美的解决。近期,
    华普微HOPERF 2025-02-27 10:32 119浏览
  • 国内首款电力级全域操作系统,由南方电网联合开放原子开源基金会重磅发布。基于开源鸿蒙OpenHarmony深度定制,构建起覆盖发、输、变、配、用,全环节的智能神经中枢。通过统一架构打破设备孤岛,实现百万级电力终端毫秒级响应,让每个电力设备都拥有自主思考能力,共同构建数字孪生体。作为鸿蒙生态核心硬件方案商,深圳触觉智能基于瑞芯微RK3568/全志T527,推出了专为电鸿OS及配套生态的核心板、工控主板等硬件解决方案,已完成电鸿系统适配!RK3568核心板:RK3568工控主板:T527核心板:T52
    Industio_触觉智能 2025-02-26 18:14 118浏览
  • 近年来,在能源转型的战略驱动下,我国新能源汽车的保有量持续攀升,并直接推动了充电桩市场的快速增长。据中国充电联盟(EVCIPA)统计数据显示,2024全年,我国充电基础设施增量为422.2万台,新能源汽车国内销量1158.2万辆,充电基础设施与新能源汽车继续保持快速增长,桩车增量比约为1:2.7[1]。此外,截至2024年底,我国充电基础设施累计数量为1281.8万台,同比上升49.1%[1],市场前景一片繁荣。然而,随着国际贸易壁垒高企与国内内卷态势加剧,在此繁荣的市场中,充电桩厂商们亦面临着
    华普微HOPERF 2025-02-26 16:26 139浏览
  • RGB灯光无法同步?细致的动态光效设定反而成为产品客诉来源!随着科技的进步和消费者需求变化,电脑接口设备单一功能性已无法满足市场需求,因此在产品上增加「动态光效」的形式便应运而生,藉此吸引消费者目光。这种RGB灯光效果,不仅能增强电脑周边产品的视觉吸引力,还能为用户提供个性化的体验,展现独特自我风格。如今,笔记本电脑、键盘、鼠标、鼠标垫、耳机、显示器等多种电脑接口设备多数已配备动态光效。这些设备的灯光效果会随着音乐节奏、游戏情节或使用者的设置而变化。想象一个画面,当一名游戏玩家,按下电源开关,整
    百佳泰测试实验室 2025-02-27 14:15 113浏览
  • 本文介绍Linux系统主板/开发板(适用Debian10/11、lubuntu系统),安装中文环境和中文输入法。触觉智能EVB3588开发板演示,搭载了瑞芯微RK3588芯片,八核处理器,6T高算力NPU;音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。配置中文环境命令如下:sudo apt-get install locales #安装locales软件包 sudo dpkg-reconfigure locales #配置 locales
    Industio_触觉智能 2025-02-26 18:43 110浏览
  • 本文介绍瑞芯微RK3588主板/开发板Linux系统(Ubuntu20.04/22.04),安装中文环境和中文输入法。触觉智能EVB3588开发板演示,搭载了瑞芯微RK3588芯片,八核处理器,6T高算力NPU;音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。配置中文环境配置前需更新安装列表,否则安装中文时容易遇到报错,命令如下:sudo apt-get update报错示例:1、先点击settings2、点击Manage Installed
    Industio_触觉智能 2025-02-26 18:30 76浏览
  • 触觉智能分享,瑞芯微RK安卓Android主板GPIO按键配置方法,方便大家更好利用空闲IO!由触觉智能Purple Pi OH鸿蒙开发板演示,搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持安卓Android、开源鸿蒙OpenHarmony、Linux多系统,适合嵌入式开发入门学习。设备树修改空闲IO选择由下图可得当前IO是主板上一个没有用到的IO,对应的GPIO为:GPIO4_A4。设备树配置在Purple Pi OH官方代码中,设备树:ido-pi-oh3566-core.dt
    Industio_触觉智能 2025-02-26 18:24 56浏览
  • 应用趋势与客户需求,AI PC的未来展望随着人工智能(AI)技术的日益成熟,AI PC(人工智能个人电脑)逐渐成为消费者和企业工作中的重要工具。这类产品集成了最新的AI处理器,如NPU、CPU和GPU,并具备许多智能化功能,为用户带来更高效且直观的操作体验。AI PC的目标是提升工作和日常生活的效率,通过深度学习与自然语言处理等技术,实现更流畅的多任务处理、实时翻译、语音助手、图像生成等功能,满足现代用户对生产力和娱乐的双重需求。随着各行各业对数字转型需求的增长,AI PC也开始在各个领域中显示
    百佳泰测试实验室 2025-02-27 14:08 170浏览
  • 请移步 gitee 仓库 https://gitee.com/Newcapec_cn/LiteOS-M_V5.0.2-Release_STM32F103_CubeMX/blob/main/Docs/%E5%9F%BA%E4%BA%8ESTM32F103RCT6%E7%A7%BB%E6%A4%8DLiteOS-M-V5.0.2-Release.md基于STM32F103RCT6移植LiteOS-M-V5.0.2-Release下载源码kernel_liteos_m: OpenHarmon
    逮到一只程序猿 2025-02-27 08:56 171浏览
  • 构建巨量的驾驶场景时,测试ADAS和AD系统面临着巨大挑战,如传统的实验设计(Design of Experiments, DoE)方法难以有效覆盖识别驾驶边缘场景案例,但这些边缘案例恰恰是进一步提升自动驾驶系统性能的关键。一、传统解决方案:静态DoE标准的DoE方案旨在系统性地探索场景的参数空间,从而确保能够实现完全的测试覆盖范围。但在边缘案例,比如暴露在潜在安全风险的场景或是ADAS系统性能极限场景时,DoE方案通常会失效,让我们看一些常见的DoE方案:1、网格搜索法(Grid)实现原理:将
    康谋 2025-02-27 10:00 141浏览
  • 文/郭楚妤编辑/cc孙聪颖‍开年的跨境电商行业像是贸易战疾风暴雨下的漩涡中心。不管是关税政策的频繁调整,还是国际贸易规则的大幅变动,都让企业体会到不可承受之重,后者的命运被特朗普政府攥在手心。2 月 1 日,美国政府宣布以芬太尼等问题为由,对所有中国输美商品加征 10% 关税。紧接着,美国 “最低限度” 关税豁免政策也出现反复。从取消该豁免到恢复豁免,中间仅间隔一周的时间。两项政策的调整,直接冲击了依赖直邮模式的跨境电商行业,行业面临成本飙升与模式转型的双重压力。特朗普低估关税豁免政策的冲击力在
    华尔街科技眼 2025-02-26 17:45 135浏览
  • 文/郭楚妤编辑/cc孙聪颖‍开年的跨境电商行业像是贸易战疾风暴雨下的漩涡中心。不管是关税政策的频繁调整,还是国际贸易规则的大幅变动,都让企业体会到不可承受之重,后者的命运被特朗普政府攥在手心。2 月 1 日,美国政府宣布以芬太尼等问题为由,对所有中国输美商品加征 10% 关税。紧接着,美国 “最低限度” 关税豁免政策也出现反复。从取消该豁免到恢复豁免,中间仅间隔一周的时间。两项政策的调整,直接冲击了依赖直邮模式的跨境电商行业,行业面临成本飙升与模式转型的双重压力。特朗普低估关税豁免政策的冲击力在
    华尔街科技眼 2025-02-26 17:37 123浏览
  • 更多生命体征指标风靡的背后都只有一个原因:更多人将健康排在人生第一顺位!“AGEs,也就是晚期糖基化终末产物,英文名Advanced Glycation End-products,是存在于我们体内的一种代谢产物” 艾迈斯欧司朗亚太区健康监测高级市场经理王亚琴说道,“相信业内的朋友都会有关注,最近该指标的热度很高,它可以用来评估人的生活方式是否健康。”据悉,AGEs是可穿戴健康监测领域的一个“萌新”指标,近来备受关注。如果站在学术角度来理解它,那么AGEs是在非酶促条件下,蛋白质、氨基酸
    艾迈斯欧司朗 2025-02-27 14:50 257浏览
  • 美国加州CEC能效跟DOE能效有什么区别?CEC/DOE是什么关系?美国加州CEC能效跟DOE能效有什么区别?CEC/DOE是什么关系?‌美国加州CEC能效认证与美国DOE能效认证在多个方面存在显著差异‌。认证范围和适用地区‌CEC能效认证‌:仅适用于在加利福尼亚州销售的电器产品。CEC认证的范围包括制冷设备、房间空调、中央空调、便携式空调、加热器、热水器、游泳池加热器、卫浴配件、光源、应急灯具、交通信号模块、灯具、洗碗机、洗衣机、干衣机、烹饪器具、电机和压缩机、变压器、外置电源、消费类电子设备
    张工nx808593 2025-02-27 18:04 26浏览
  • 2025年2月26日,广州】全球领先的AIoT服务商机智云正式发布“Gokit5 AI智能体开发板”,该产品作为行业首个全栈式AIoT开发中枢,深度融合火山引擎云原生架构、豆包多模态大模型、扣子智能体平台和机智云Aiot开发平台,首次实现智能体开发全流程工业化生产模式。通过「扣子+机智云」双引擎协同架构与API开放生态,开发者仅需半天即可完成智能体开发、测试、发布到硬件应用的全流程,标志着智能体开发进入分钟级响应时代。一、开发框架零代码部署,构建高效开发生态Gokit5 AI智能体开发板采用 “
    机智云物联网 2025-02-26 19:01 112浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦