问题标签 [smbus]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - Linux SMBus 块事务类型
2014 年 12 月 20 日的最新 SMBus 规范V3.0仅显示一种类型的块写入/读取(不包括块进程调用):
但是,查看 Linux 用户空间接口,有 3 种块事务类型可与 uapi/linux/i2c.h 中的 ioctlI2C_SMBUS
一起使用:
在drivers/i2c/*下的代码之后,它委托给smbus_xfer
/ master_xfer
(如果模拟) in i2c_algorithm
,这是特定于适配器/设备的。
1. 所有这些事务类型最终都遵循 SMBus 3.0 的块连线规范吗?
2. 我将如何决定我需要使用哪一个?
我正在 Raspbian GNU/Linux 10 (buster) 上创建 Java JNA 接口
c - 无法在 Raspberry Pi 4 上编译 i2c_smbus_write_byte
有没有人尝试在 Raspberry Pi 4 上使用i2c_smbus_write_byte或任何类似功能?
我无法让它编译它在链接时失败并且找不到它。我按照这里的描述使用它:http: //synfare.com/599N105E/hwdocs/rpi/rpii2c.html
所有推荐的头文件都在那里,而且Makefile 中还有-li2c。
谁能告诉问题可能是什么?我现在不知道。
python-2.7 - Python27二进制MSB LSB操作
我有一个我无法破解的简单问题。我在 Python2.7 中使用 SMBus 从提供 med MSB 和 LSB 的芯片中读取数据。
我需要删除 MSB 中的第 2 位,然后将其与 LSB 的最后 8 位结合。
喜欢:
最高有效位 = 11110000 ,最低有效位 = 11111111
MSB_cut = 110000 , LSB = 11111111
合并 = 11000011111111
然后将其转换为整数。
我已经尝试过按位运算,但我没有做对。我知道这很简单,所以有人可以向我展示正确的代码吗?
谢谢。
i2c - 为什么 `i2c_smbus_write_byte_data` 在 uClinux 2.4 上会返回“不允许操作”?
我正在编写一个 C 程序,目的是通过 Dante Brooklyn II 的 I2C 接口配置外围设备(CS5368 ADC),这是一个基于运行 uClinux 2.4 的 Microblaze 软核处理器的板。
我已经按照 Dante OEM 文档的指导实施了配置,但是在运行我的程序时,我EPERM
在尝试使用i2c_smbus_write_byte_data
.
这是包含罪魁祸首调用的代码部分i2c_smbus_write_byte_data
:
这是小程序完整源代码的上下文中的代码。该程序首先通过 GPIO 引脚重置 CS5368,然后通过 I2C 进行配置。
EPERM
无论我是否连接了 CS5368,都会返回。我已经能够使用 Arduino Uno 的 I2C 接口成功配置 CS5368,因此问题似乎与 CS5368 无关。
telnet
要运行程序,我通过as登录到开发板root
,所以我怀疑该错误与用户权限有关。
OEM 文档状态:
Brooklyn II 模块可以作为以 100Khz 运行并使用 7 位寻址模式的 I2C 控制器运行。它支持多主机操作。可以从 Brooklyn II 模块上运行的用户应用程序访问 I2C 设备。该接口支持 SMBus(系统管理总线)协议,它是 I2C 协议的子集。
它继续列出支持的i2c_smbus_*
功能,包括i2c_smbus_write_byte_data
,因此该问题似乎与缺乏对 SMBus 或 I2C 的支持无关。
我遇到了一个相关问题EPERM
,即用户在尝试使用 I2C API 时收到错误代码write
,但解决方案似乎是使用i2c_smbus_*
我已经在做的 API。
任何有关可能导致返回此错误代码或如何进一步调试问题的建议将不胜感激!
编辑:如果有帮助,这里是完整的输出,从将 exe 移动到/tmp
通过 ftp 后通过 telnet 登录到板开始:
c++ - 未定义对 `i2c_smbus_read_block_data(int, unsigned char, unsigned char*)' 的引用
我正在尝试从 imu (mpu9250) 读取数据块,但是在构建时
g++ mpu.cpp -o mpu
出现以下错误:
要包含我尝试过的库:
并且:
我已经安装了 libi2c-dev、libi2c0 和 i2c-tools 软件包。
使用时write(mpu_file, buf, 2)
或read(mpu_file, buf, 1)
它确实有效。
提前致谢!
linux - Linux:写入 i2c/SMBus
我在使用Intel Apollo Lake处理器的 Linux 系统上遇到 i2c/SMBus 问题。我正在尝试读取/写入 EEPROM,但我遇到了一些问题。我的 EEPROM 位于地址 0x56,我可以用我的逻辑分析仪观察总线。
当我尝试通过i2ctools ( i2cget
) 从设备读取数据时,系统会按预期运行。例如,当我尝试通过执行写入命令时,就会出现我的问题i2cset
。i2cset
以错误结束(写入失败)。因为我能够以电子方式观看总线,所以我也可以说所有线路都保持高电平并且总线没有被触及。我能够激活dev_dbg()
i2c 驱动程序i2c_i801中的功能,并且当我执行时,i2cset
我能够找到(dmesg)调试消息:
使用smbus2库运行我的最小 I²C Python 代码时,我收到以下错误消息和上述调试消息:
错误:write_byte_data ioctl(self.fd,I2C_SMBUS,味精)
对我来说,一个重要提示是我无法在地址空间形式 0x50 到 0x57 中执行写命令。我的猜测是某些驱动程序锁定了地址空间以防止将命令写入该“危险”区域。
我的问题是:“有人知道这种行为吗?是否有解决方案,以便我可以在地址 0x56 处写入我的 EEPROM?或者从 0x50 到 0x57 的 i2c 地址空间周围是否有锁,我的对手是谁?”
我是整个驱动程序和内核世界的新手,所以请善待,我很可能犯了初学者的错误。我会很感激我可以解决我的问题的提示和技巧。
c - Unreliable PEC on stm32 smbus
I've got a problem with PEC on STM32 SMBUS, which i use to read data from a MLX90614 IR thermometer. When i start the device, either the PECERR flag is set and continues to be set, for all transmissions, even though the data from the IR thermometer seems to be correct. Or the PECERR is never set and all the data from the IR thermometer is still correct.
When i study the data on my oscilloscope i can see no difference between the signals when the PECERR is set or not. As stated earlier data seems to be good either way.
I could of course just ignore the PECERR flag, but i'd lige to be able to filter out any eventual garbled transmissions. Anyone have an idea what i am doing wrong here?
}
uint16_t I2C_SMBUS_ReadWord(I2C_TypeDef* h, uint8_t deviceAddress, uint8_t command) {
}
python-3.x - 如何解决 Raspberry Pi 3B 和 Bme280 远程 I/O 错误
让我从使用的组件开始:
- 用于将树莓派连接到组件的 GPIO 扩展板
- BM280
- 圆周率 3B
问题描述:
这个问题一开始是间歇性的。我们正在接收读数,并且错误突然发生,对传感器进行了调整(取出并放回)解决了它,但是当我们触摸传感器时,错误再次出现。
我们决定更换传感器,问题从间歇性变为持久性。现在我们将此作为永久性问题。
我们删除了 BME280 和 SmBus2 的软件包,并决定重新安装。
RPI Bme280:https ://pypi.org/project/RPi.bme280/
我遵循了这个 BME280 安装指南,但是当提示输入“i2cdetect -y 1”时,有几行但没有显示数字。
目前已确认的内容:
修补电路很好,用我的讲师 pi 测试过,
效果很好。代码很好,我们甚至使用 RPi.bme280 提供的示例代码
每次都启用 I2c
请帮助我,因为我真的迷路了。我需要在下周之前提交此文件,因此不胜感激。
问题图片 --> 问题图片
i2c - Raspberry Pi 4:Python3 smbus2 在所有 I2C 数据写入前添加 0x00
我有工作 C 和 Python3 代码,基于互联网上的简单示例,我可以正确地将数据从我的 Raspberry Pi4 发送到 Atmel SAM-E70 开发套件板。我连接了一个逻辑分析仪来查看正在发送的数据,对于i2c_write_data_block()
我的 Python3 代码中的每一个,smbus2 代码都会发送 7 位地址,然后是 0x00,然后是我要发送的字节流。我的 C 代码发送相同的字节流,地址和数据之间没有 0x00。最后,使用i2ctransfer()
从 shell 发送字节流也可以按预期工作:没有额外的字节。
假设,可能是 smbus2 包正在尝试使用 10 位地址,但我找不到任何支持该假设的文档。事实上,我的发现表明 I2C 总线配置是通过配置文件执行的,这使我相信用于在 I2C 总线上进行通信的语言应该无关紧要——它具有相同的配置.
有人遇到过这种情况么?
powerapps - 何时停止嵌入式电源应用中的充电
我是一名嵌入式软件工程师,我有一个定制的电源板。它上面有一个英飞凌的xmc1400 mcu。在许多其他职责中,它会在必要时为电池充电。这些电池很智能。所以可以通过smbus进行通信。我通过使用 MCU 的 pwm 输出设置充电电流。其余的由板子处理,我没有足够的关于硬件结构的信息。还有连接到电池和充电器线路的 ADC 通道。所以我可以监控电池电压、施加的充电电流和实际消耗的电流。我的问题是关于停止充电条件。我用 2A 给它们充电,当汲取的电流降至 0.3A 以下时,我停止充电。我还从 smbus 读取充电率,它在充电电流下降前至少 10 15 分钟显示 %100。也许这是一个更准确的比率,因为它来自电池本身。因此,如您所见,有两种可能的方法可以了解何时停止充电。我得选一个。两者各有利弊,但我想知道其他人是如何做到的。顺便说一句,要知道,我阅读 smbus 仅用于诊断目的,我不信任它 %100,因为我看到有时我在没有理由的情况下无法阅读任何内容(仅发生了收费时间,但仍然......) . 这就是我使用第一种方式编写代码的原因。第一种方法的问题是这样的;如果电池出现问题,则汲取的电流永远不会低于限制。而且我从不停止充电。如果没有人知道电池有故障,这种方法可能会长期造成伤害。(这曾经发生过,所以我现在正在尝试采取预防措施)我想出了这个解决方案,也许我可以同时控制它们。我将保持一切不变,但增加一个控制。如果 smbus 读数已充电 %100,我将开始某个倒计时并停止充电,即使消耗的电流没有下降。因此,如果电池出现故障,也不会造成伤害。但是,如果 smbus 不起作用,这当然不包括这种情况..
无论如何,这些都是我的担忧。我想让这个系统变得更好,但我不想过度设计它。这就是为什么我想知道其他做法。
在此先感谢,伊佩克