问题标签 [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 投票
1 回答
19839 浏览

python - 获取 IOError:[Errno 121] 尝试通过 I2C 从 Arduino 获取数据时,python(覆盆子)上的 smbus 出现远程 I/O 错误

我遇到了问题,在启动通过 I2C 从 Arduino 请求数据的脚本期间,pyhton 有时会在我的树莓派 3 上抛出这个 IOError。

电气连接是完美的,所以这不是问题。此外,我在使用 i2cget -y 1 0x04 时也没有收到任何错误

只有python脚本有时很糟糕,我不知道为什么。

这是我的 Arduino 代码:

我注册了一个 onReceive 和一个 onRequestEvent。onReceive 回调将定义应将哪种数据发送回树莓派。onRequest Callback 进行响应。

这是我的python代码。很简单,但它会引起一些头痛。

执行我的 python 脚本后,我有时会收到此错误:

谁能帮我解决这个问题?

干杯迪特

0 投票
1 回答
236 浏览

smbus - 无法通过 SMBus 检索到 Atmel 芯片的信息

这是我的设置,Atmel 芯片(SAMD20E18A-MUT)SM 总线两个引脚通过 SMBus/USB 适配器芯片CP2112连接到主机 PC )。

在主机端,设法通过 i2c-tools 扫描 SMBus (6) 并查看从地址 0x6a 处的 Atmel 设备。

向设备发送 1 字节数据 $sudo i2cset -y 6 0x6a 0x00 0x00

检索 9 个字节的数据 sudo i2cdump -y -r 0x00-0x08 6 0x6a

它返回全零,期望得到一些数据。我的问题是我在 i2cset 中的“数据地址”应该是什么,目前我使用的是 0x00。我查看了 Atmel 数据表,但不知道正确的地址是什么。有什么我应该检查的吗?

注意:其他人设法在同一设备上获得非零响应,但他们使用的是商业 Ginkgo SMBU/USB 适配器。 在此处输入图像描述

0 投票
1 回答
682 浏览

x86 - PCIe 插槽上的 SMBus

我有一些 PCIe 卡,它们在 SMBus 上有一些 PMIC。

如果我在不同的插槽(在 x86 上)上连接多个(相同的)PCIe 卡,我是否也可以访问所有 PMIC(具有相同的地址)?

是否所有的 PCIe 插槽都共享相同的 SMBus 线,这样 PCIe 插槽上只能连接一个具有相同从地址的设备?

0 投票
1 回答
547 浏览

pic - SMBus 地址和波特率

我需要与一些电池通信(BrenTronics 的 BT-70791CK)。他们使用 SMBus 1.1 版进行通信,但在电池的数据表中没有关于他们拥有的 SMBus 地址或波特率的信息。我问他们,他们告诉我这是他们唯一的文件。所以我开始想,也许我不需要知道 SMBus 地址或 SMBus 通信的波特率。我的问题是

  1. 我还能与使用 SMBus 1.1 版的设备通信吗?不知道他们的地址或波特率?

  2. 电池或 SMBus ver1.1 是否有任何特定的波特率或 SMBus 地址?

0 投票
1 回答
213 浏览

embedded - SMBus v1.1 电压阈值

我打算使用 PIC18F26K83 并与使用 SMBus 1.1 版的智能电池进行通信。所以从 PIC 的数据表中它说我需要从 RxyI2C 寄存器中为 SMBus 选择适当的输入阈值。位 0 和 1 用于选择该阈值,但没有 SMBus 版本 1.1 的信息(见下文)。

TH<1:0>:I2C 输入阈值选择位

11 = SMBus 3.0 (1.35 V) 输入阈值

10 = SMBus 2.0 (2.1 V) 输入阈值

01 = I2C 特定输入阈值

00 = 标准 GPIO 输入上拉,通过 INLVLxy 寄存器使能

在互联网上,我找不到 SMBus v1.1 的输入阈值。所以我的问题是:

SMBus v1.1 的输入阈值电压是多少?或者我应该如何设置相关位才能使用 RxyI2C 寄存器中的 SMBus v1.1?

0 投票
0 回答
145 浏览

python - 为什么多个打印语句在 IO 读取循环之后加速?

我有一个 I2C 设备连接到我的 Raspberry Pi 3。I2C 设备在其 FIFO 缓冲区中以 104Hz 存储 9 个样本。我轮询设备以了解存储的样本量。每个样本为 2 个字节。当 FIFO 缓冲区达到 2016 个样本时,我通过发出 126 个 32 字节 i2c 块数据读取,一口气读取了所有 4032 个字节。

在读取期间,设备仍在填充 FIFO。因此,当我阅读完所有 2016 年样本后,我可以立即进行调查,发现有 630 个新样本。

如果我打印 FIFO 中的样本数,则块读取的运行时间比不打印时快。在这种情况下,我只得到 387 个新样本。

我不明白打印语句如何使我的 IO 读取速度更快。

我试过改变阈值。此外,在下面的 if 语句中移动打印会使事情再次变慢。使用 flush=True 打印什么都不做,无论是在达到阈值之前还是之后。
我试图在数据读取之前打印一些虚拟字符串(在 tic() 上方)。这导致前几次缓冲区读取速度很快(0.410 秒),然后一直很慢(0.661 秒)。快速读取的数量似乎随着打印语句的数量而增加。

使用打印语句,我得到:
经过时间:0.410 秒
读取后的样本数:387

没有打印语句,我得到:
经过时间:0.661 s
读取后的样本数:621

我预计删除打印会加快速度,而不是减慢速度。我在第一次运行时重置了 FIFO,所以程序总是首先打印“FIFO EMPTY”。

编辑:包含足够的代码来独立运行。问题出在 read_fifo(BUS, LSM) 函数中。我在 Python 3.4.2 上运行并使用 smbus2 模块:https ://pypi.org/project/smbus2/

0 投票
1 回答
417 浏览

pic - PIC I2C PPS 配置

我将通过 SMBus 与某些设备进行通信。我使用 PIC18F26K83,我将使用 RB1 和 RB2 引脚作为 SCL 和 SDA 引脚。我的问题是关于 PPS 映射。在数据表中它说我需要将这两个引脚都设置为输入和输出。PPS 输出选择很简单,因为“RxyPPS:PIN Rxy 输出源选择寄存器”让我选择引脚、端口和 SDA/SCL。但是,“xxxPPS: PERIPHERAL xxx INPUT SELECTION”寄存器只允许我选择端口和引脚。为了更清楚,让我举个例子:

这条线只让我选择端口和引脚。它说RB1就是输入。另一方面:

这条线让我可以选择端口、引脚以及 SCL 输出。它说RB1是输出,但它也是SCL。

在数据表页面:266 PPS 输入寄存器详细信息中,我需要使用一些寄存器值来选择输入作为 SDA 或 SCL。(我添加了数据表)

所以我的问题是:我是否需要像选择输出一样选择 SDA 或 SCL 作为输入?哪个代码块看起来更准确?

1)

或者

2)

数据表:PIC18F26K83数据表

0 投票
1 回答
291 浏览

linux - ArchLinux 上的 I2C 用户空间通信

我正在尝试实现一个应用程序,该应用程序将允许我从类似于此https://www.kernel.org/doc/Documentation/i2c/dev-interface的用户空间访问 i2c 总线。这里声明使用 smbus 命令优于使用简单的 i2c 读/写。有人可以帮我解释为什么会这样。

另外要使用 smbus 命令,我只需将这些文件包含在我的标题 https://fossies.org/linux/i2c-tools/lib/smbus.c
https://fossies.org/linux/i2c-tools /include/i2c/smbus.h

因为 SMBus 功能不再在“linux/i2c-dev.h”中定义。

参考:https ://github.com/hallard/ArduiPi_OLED/issues/15 。
有没有更好的方法来实现这个功能?
还有为什么要从“linux/i2c-dev.h”中删除 SMBus 方法

0 投票
2 回答
3784 浏览

linux - 主机 SMBus 控制器未启用

我已经从我的VMWare Virtual Machine进行了备份。我已经将它导入到源文件夹中。

第一次我可以启动虚拟机,它向我显示错误,但我可以启动它。但是当我重新启动虚拟机时,错误显示我,但虚拟机没有启动。

显示给我,VM 没有启动,错误:

“piix4_smbus 0000:00:007.3”主机 SmBus 控制器未启用!”

我试图blacklist.conf将这一行添加到文件中:blacklist i2c-piix4

但它仍然不起作用。

0 投票
1 回答
175 浏览

c - Turning One Raspberry Pi I2C Connected Relay On Turns the Other Relay Off

Currently, I have two, 2-Channel 1 Amp SPDT Signal Relay Controllers connected to my Raspberry Pi 3 via I2C, and when I currently run the function to turn one relay on, the other one will shut off at the same time (one or the other is on). In addition, my button to shut off relay 1 and my button to shut off relay 2 will shut both relays off.

My program is written in a windows form (visual studio), and I am accessing a C Shared Library via Dll Import, but I know for a fact my problem is within my C library. I am very new to C and how shifting works, so the root of my problem lies within the logic and structure of my code. Frankly, I'm confused on how to properly code this.

This is currently the method to turn Relay 1 On. It turns the relay on properly, but this also turns Relay 2 Off at the same time.

Here is the code for Relay 1 Off, I will not post Relay 2 On/Off because it is basically the same, Relay2On just has an added data += 1; after char data = 0x01;. Both 'Off' methods result in both relays shutting off.

All I want is the methods to do as described, turn Relay 1 On when the method is called. When Relay1Off is called, shut only Relay 1 off. I'm sure it is simple, but as I've stated above C is quite new to me.

Thank you in advance for any contribution.