如何在Linux上模拟I2C设备?

如何解决如何在Linux上模拟I2C设备?

我有一个正在开发的自定义SOM(基于iMX6)板,它将运行Ubuntu,并且将多个I2C设备连接到iMX6 I2C“适配器”之一。鉴于硬件尚不可用,我想编写软件来访问和控制所说的I2C设备,最好是在我的Ubuntu笔记本电脑上模拟它们。我在想诸如安装程序之类的软件测试也可能有用。

我一直在与i2cdetect一起玩,以查看笔记本电脑上的内容,然后发现了一些特别有趣的东西。考虑以下命令和响应:

$ sudo i2cdetect -l 
i2c-3   i2c         i915 gmbus dpd                      I2C adapter
i2c-1   i2c         i915 gmbus dpc                      I2C adapter
i2c-6   i2c         DPDDC-C                             I2C adapter
i2c-4   i2c         DPDDC-A                             I2C adapter
i2c-2   i2c         i915 gmbus dpb                      I2C adapter
i2c-0   i2c         Synopsys DesignWare I2C adapter     I2C adapter
i2c-5   i2c         DPDDC-B                             I2C adapter

$ sudo i2cdetect -y -r 4
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 
10: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 
20: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 
30: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 
40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 
50: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 
60: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 
70: 70 71 72 73 74 75 76 77

我的理解是,对于该表中具有编号的每个单元,总线上都存在一个具有该编号作为其地址的设备;例如,第一个数字0x03表示有一个设备的I2C地址为0x03。 i2c-4适配器似乎不可能真正连接117个设备! (FWIW大多数其他适配器没有设备,只有两个适配器在每条总线上显示少量设备;这些似乎是“真实的” I2C总线。)但是回到i2c-4-是某种模拟(或仿真)适配器上有模拟设备吗?我决定看看我可以从其中一台可疑设备中i2cdump数据,并发现了以下内容:

$ sudo i2cdump -y 4 0x3 b
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 00 00 02 02 04 04 06 06 08 08 0a 0a 0c 0c 0e 0e    ..??????????????
10: 10 10 12 12 14 14 16 16 18 18 1a 1a 1c 1c 1e 1e    ????????????????
20: 20 20 22 22 24 24 26 26 28 28 2a 2a 2c 2c 2e 2e      ""$$&&((**,..
30: 30 30 32 32 34 34 36 36 38 38 3a 3a 3c 3c 3e 3e    0022446688::<<>>
40: 40 40 42 42 44 44 46 46 48 48 4a 4a 4c 4c 4e 4e    @@BBDDFFHHJJLLNN
50: 50 50 52 52 54 54 56 56 58 58 5a 5a 5c 5c 5e 5e    PPRRTTVVXXZZ\\^^
60: 60 60 62 62 64 64 66 66 68 68 6a 6a 6c 6c 6e 6e    ``bbddffhhjjllnn
70: 70 70 72 72 74 74 76 76 78 78 7a 7a 7c 7c 7e 7e    pprrttvvxxzz||~~
80: 80 80 82 82 84 84 86 86 88 88 8a 8a 8c 8c 8e 8e    ????????????????
90: 90 90 92 92 94 94 96 96 98 98 9a 9a 9c 9c 9e 9e    ????????????????
a0: a0 a0 a2 a2 a4 a4 a6 a6 a8 a8 aa aa ac ac ae ae    ????????????????
b0: b0 b0 b2 b2 b4 b4 b6 b6 b8 b8 ba ba bc bc be be    ????????????????
c0: c0 c0 c2 c2 c4 c4 c6 c6 c8 c8 ca ca cc cc ce ce    ????????????????
d0: d0 d0 d2 d2 d4 d4 d6 d6 d8 d8 da da dc dc de de    ????????????????
e0: e0 e0 e2 e2 e4 e4 e6 e6 e8 e8 ea ea ec ec ee ee    ????????????????
f0: f0 f0 f2 f2 f4 f4 f6 f6 f8 f8 fa fa fc fc fe fe    ????????????????

这适用于设备地址0x03至0x07;在此之上,十六进制数据被替换为XX!无论如何,我猜该表在“设备”上显示了256个字节的数据。

我试图读取/写入/读取一个字节,但这不起作用:

$ sudo i2cget -y 4 0x3 0xff
0xfe

$ sudo i2cset -y 4 0x3 0xff 0x27

$ sudo i2cget -y 4 0x3 0xff
0xfe

以所有这些为背景,这是我的问题:

  1. i2c-4确实是一个模拟的I2C适配器,它的目的是什么?
  2. 我正确使用了i2cget和i2cset吗?如果不正确,我在哪里出错? (当然,这假设i2c-4地址0x3可以正常工作)
  3. 如果没有,是否可以模拟I2C设备(可能还有适配器),以便我可以编写能够对其进行读写的软件?

当然,问题3是这里的主要重点...

谢谢!

解决方法

在有人有相同/相似问题的情况下进行回答。

秘密是使用i2c-stub,我曾经听说过# Set up fake device $ sudo modprobe i2c-dev $ sudo modprobe i2c-stub chip_addr=0x03 $ i2cdetect -l ... i2c-7 unknown SMBus stub driver N/A <<--- Here it is! # Read data $ sudo i2cdump -y -r 0-7 7 0x03 b 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef 00: 00 00 00 00 00 00 00 00 .?...... # Write data $ sudo i2cset -y 7 0x03 0x01 0x27 # Read data again $ sudo i2cdump -y -r 0-7 7 0x03 b 0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef 00: 00 27 00 00 00 00 00 00 .?...... ,但对它的含义并不清楚。这就是我一直在寻找的东西:

#views.py

class SingleModelA(generic.DetailView,ModelFormMixin):
    model = ModelA,ModelB

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-