问题标签 [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.

0 投票
0 回答
365 浏览

python - 使用 smbus 发送值数组

我有一段代码使用该i2ctransfer命令将命令发送到板。

这个命令在 python 中调用subprocess.Popen,我正在重写代码以使用一些内置的 python 包,比如 smbus,但是我在实现它时遇到了困难,所以它发送相同的数据。

目前,命令生成如下:

该命令的一个示例是:

基本上是向地址为 0x03 的设备发送 12 个字节。此命令使用一条指令更新两个寄存器:

  • 前两个字节是地址:0x2304 后面是 4 个字节的数据 0x49742400

  • 之后又是 2 个字节的地址:0x2305,然后是 4 个字节的数据:0x49742400

我尝试使用 write_i2c_block_data,但我对参数感到困惑,我不想直接写入寄存器,我只想发送一个字节数组,板子本身会将这些数据解析为寄存器地址和寄存器值。

但我只是得到一个

如何使用 smbus 将值数组发送到设备 0x03?

0 投票
0 回答
2578 浏览

arm - STM32如何从锁定中恢复

我正在尝试与 SMBus 电池通信。那有 2 个部分,所以我使用 2 个 I2C 模块。在第一个 I2C 模块成功通信后,第二个模块卡住了。它卡在忙碌中。在那种情况下,我认为我需要重置该 I2C 模块。但是,我做不到。

我尝试了以下方法:

1)通过使用HAL库deiniting然后再次初始化模块:

2)在第一种方法中添加 Swrst 行:

3)

4)使用勘误文件和这行代码:

STM32中的I2C模块有没有合适的方法复位?如何从锁定中恢复?

编辑:我正在使用 STM32F103C8。现在我添加了 MX_GPIO_Init 函数,我可以重置模块:

但是传输中的第二个模块总是失败。如果我先使用 hi2c1 然后 hi2c2 然后 hi2c2 失败。如果我先使用 hi2c2 则反之亦然。我试图禁用第一个模块,然后尝试与第二个模块通信,但这也不起作用。

0 投票
0 回答
160 浏览

python - SMbus 的第二个版本是否正确?

我要导入 SMbus 包: 链接

(我使用 Python 3.7)

我尝试在 win10 和 Visual Code 中使用我的 cmd 窗口运行它。( pip install smbus)

  • 可以运行 install "smbus2" !但是这个包也需要“smbus” :(

我总是收到此错误消息:

0 投票
0 回答
50 浏览

raspberry-pi - 从 mbus 协议转换为 modbusIP

我正在尝试使用覆盆子将 mbus 协议转换为 modbus IP 协议。

我对此很陌生,只是在做我老板问的 bcs。我一直在谷歌上搜索,但我一无所获。任何帮助都会有所帮助。

我试图读取 mbus 字节进行转换,但这是不可能的。

0 投票
0 回答
468 浏览

python - Python smbus 读取数据

是否可以通过 Smbus 读取 3 个参数?

首先,我说要读取或写入哪个 8 位:

我写了跟随命令(3个参数):

但我只能读出所有 8 位:

这读取所有 8 位,但我需要类似:

这样就很难编程,因为如果我写其他东西然后再读一遍,我会得到其他数字。

0 投票
1 回答
450 浏览

linux - 有没有办法在基于 Linux 的 SMBus 接口上读取/写入超过 32 个字节?

我正在尝试通过 Linux 上的 SMBus ioctls 访问基于 I2C 的设备。我需要写超过 32 个字节。I2C_SMBUS ioctl 将大小限制为 32 字节。底层驱动程序不支持 I2C_RDWR ioctl 和直接 read()/write() 调用。我也尝试过逐字节读/写,但它对我不起作用。

0 投票
0 回答
136 浏览

linux-kernel - 如何在 I2C_SMBUS ioctl 的帮助下模拟 I2C_RDWR ioctl?

我系统上的底层驱动程序不支持 I2C_RDWR ioctl。它只支持 I2C_SMBUS。我的要求是在用户或内核空间中支持带有 I2C_SMBUS 的单个消息 I2C_RDWR ioctl。

我怎样才能做到这一点?

0 投票
0 回答
355 浏览

c++ - 如何使用 C++ 通过 I2C 从 MPU6050 读取数据块

我使用 MPU6050 设备并获取加速度计和陀螺仪数据。
现在我需要使用 cpp 语言从 MPU6050 读取数据块。

在 Python 中很容易做到这一点:

该函数从地址 ACCEL_XOUT_H 开始读取一个数据块(14 个字节)。
以及如何在 cpp 中做同样的事情?我应该使用这个功能:

如果是,请解释我应该如何使用它。
如果否,请给我写一个例子。

0 投票
3 回答
976 浏览

python - I2C 传感器读取树莓派和 Arduino 的区别

我正在使用 Sensirion SFM3300 流量传感器,并且可以使用以下代码 (I2C) 使用 Arduino 读取正确的值:

但是使用 Raspberry Pi,我编写了几乎相同的代码,希望它也能正常工作。这是代码:

代码看起来确实一样,但我只得到 -273,06666666666 作为返回值。有人知道 Raspberry Pi 和 Arduino I2C 之间的区别在哪里,并且可以帮助我在 Pi 上获得正确的值吗?

0 投票
0 回答
310 浏览

c - 写入初始命令后使用地址偏移读取 SMBus 块

我正在尝试实现一个主 Linux 驱动程序来与Omron D6t-PH 差压流量计从设备进行通信。

阅读该仪器的手册和提供的示例代码(用于 STM32 uC),看来我需要在初始“写入访问地址”之后增加从地址。这将允许我从设备中读取测量数据。

Linux i2c smbus 库中提供了一个函数执行此操作,尽管它似乎不支持初始“访问寄存器写入”之后的地址增量。

有谁知道有关如何处理此设备地址递增要求的解决方法或一些建议?

以下是我一直在关注的一些文档和指南。首先是设备手册;

地址增量要求显示在D6T... 手册的 P.7 表 3 中

写入期间:将从机地址的 LSB 设置为“0”以形成 D8h (1101_1000b)。

读期间:设置从机地址的 LSB 为“1”,形成 D9h (1101_1001b)。

所需命令的流程图在 P.12,P20-22

一些概述相同的示例代码在 P.28 上

I2C1_MastrSel(添加,1);/* 从机 7bit => 8bit 用于 RD */

关于我正在尝试编写的主 Linux 用户空间驱动程序,如何更改“SMBus Block Read”命令,以便在第二个“Start”命令之后增加地址?这是命令结构:

S Addr Wr [A] Comm [A] S Addr Rd [A] [Count] A [Data] A [Data] A ... A [Data] NA P

这是我迄今为止编写的一些原型代码,它在块读取的点上是成功的: