标签: i2c

无硬件 I2C 驱动程序的单元测试 - 如何解释从机的正确值?

我有一个 i2c 驱动程序写入 i2c 总线:

  • 从机(温度传感器)的寄存器地址

  • 必须写入该地址的值

我还对该值进行检查(读回)以确保它是正确的。硬件上一切正常。我在循环环境和单元测试中使用软件,这样我就可以在没有硬件的情况下执行我的代码。为了能够从寄存器读回值,我必须“模拟”数据接收寄存器的内容(从 I2C 从机读回的值)。

因为,我对低级编程不是很有经验,知道在我的情况下如何做到这一点吗?

这是代码片段:

typedef struct
   uint8      address;    // The register address of the slave
   uint8      value;      //The value which have to be writte into the   register 
} MessageStruct;

MessageStruct *pMessage
uint8 Readback = 0;

Write_Toc_I2C( pMessage->address, pMessage->value );   // Function which writes to ic2 bus. For definition see below.

Readback = Read_From_I2c( pMessage->address);         // I store the read back value in a variable Readback. Declaration of Read_From_I2c() below

 if( Readback == …
Run Code Online (Sandbox Code Playgroud)

hardware unit-testing mocking i2c

5
推荐指数
0
解决办法
1113
查看次数

访问设备的寄存器i2c

我最近购买了一块gy-521 板,我尝试通过以下连接将其与 Raspberry Pi 3 一起使用

RPi3     |     GY-521
---------------------
3.3V <-------> Vcc
GND  <-------> GND
SCL  <-------> SCL
SDA  <-------> SDA
Run Code Online (Sandbox Code Playgroud)

使用i2cdetect -y 1我获得以下信息

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- …
Run Code Online (Sandbox Code Playgroud)

c linux i2c raspberry-pi3 sensors

5
推荐指数
1
解决办法
2万
查看次数

RPI 上的 SMBUS 给出 IOError: [Errno 121] 远程 I/O 错误

我尝试过通过 I2C 在 RPi3 和 stm32 之间进行通信。首先我安装了 i2c-tools 和 python-smbus。总而言之,我在 RPI 上使用了 python 脚本,如下所示:

import smbus
bus = smbus.SMBus(1)
address = 0x0A
data = [1,2,3,4,5,6,7,8]
bus.write_i2c_block_data(address, 0, data)
Run Code Online (Sandbox Code Playgroud)

当我运行脚本时,我可以看到以下错误:

IOError: [Errno 121] Remote I/O error
Run Code Online (Sandbox Code Playgroud)

STM32 配置为 I2C 从机,两个设备连接正确(SDA、SCL 和 GND)。我怎么知道呢?我使用 BCM2835 库编写了程序。C 程序运行正常。C 程序发送缓冲区没有任何错误。STM32也接收到缓冲区,没有任何错误。你能告诉我,我做错了什么吗?

先感谢您。

i2c raspberry-pi3 smbus

5
推荐指数
1
解决办法
3万
查看次数

i2cset 16位寄存器地址

我有一个设备通过 i2c 协议进行通信。设备的寄存器地址是16位,但Linux i2c-tools仅支持8位地址。但我找到了一些东西来处理它。

例如,要读取地址为0x0006的寄存器,我使用以下方法:(假设为busId0并且设备i2c地址为0x48)

i2cset -y 0 0x48 0x00 0x06 # this command sets the register address to 0x0006
i2cget -y 0 0x48 # this command the value 0xBA which is true
Run Code Online (Sandbox Code Playgroud)

当我再次调用该i2cget -y 0 0x48命令时,它返回下一个地址处的值。

写入操作按我的预期进行。但是当我尝试写入同一个寄存器时,我失败了。我尝试以下命令:

i2cset -y 0 0x48 0x00 0x06 0xBA 0x0B i
Run Code Online (Sandbox Code Playgroud)

此命令不会返回错误。但是当我再次读取寄存器时,我看到寄存器没有变化。

我使用的设备是AP0100CS。寄存器地址可写。我不知道 i2cset 有什么问题。

linux i2c

5
推荐指数
0
解决办法
4259
查看次数

STM32F4 I2C 与 DMA 不工作

我正在使用一台 STM32F4,我想与我的 LSM303 加速度计进行通信。为此,我使用 I2C,仅使用 I2C 工作正常,但当我尝试使用 DMA 时,它停止工作。当我使用 HAL_I2C_Master_Transmit_DMA 时,它可以工作,并且我得到了 IRQHandler 和 . 但是之后当我想使用 HAL_I2C_Master_Receive_DMA 时,它说 I2C 的状态尚未准备好...我读到 I2C 与 STM32FX 有点混乱,但我不明白为什么它在没有 DMA 的情况下工作正常。

此外,当它命中 Master_Transmit_DMA 的回调 I2C_DMAXferCplt 时,它表示 I2C_HandleTypeDef 的 CurrentState 仍然等于 HAL_I2C_STATE_BUSY_TX,因此它不会将状态恢复为 READY。这就是为什么当我调用 Master_Receive_DMA 时它没有收到任何东西。

这是我的 I2C 初始化:

    void MX_I2C2_Init(void)
      {
          I2C_ST_INS.Instance = I2C2;
          I2C_ST_INS.Init.ClockSpeed = 400000;
           I2C_ST_INS.Init.DutyCycle = I2C_DUTYCYCLE_2;
           I2C_ST_INS.Init.OwnAddress1 = 0;
          I2C_ST_INS.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
          I2C_ST_INS.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;
          I2C_ST_INS.Init.OwnAddress2 = 0;
          I2C_ST_INS.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;
          I2C_ST_INS.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED;

          HAL_I2C_Init(&I2C_ST_INS);

        }

   void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
   {
          GPIO_InitTypeDef GPIO_InitStruct;
          if(i2cHandle->Instance==I2C1) …
Run Code Online (Sandbox Code Playgroud)

stm32 i2c dma

5
推荐指数
2
解决办法
5708
查看次数

USB 转 GPIO/SPI/I2C/UART 适用于常规 Windows 10 PC?类似于 Raspberry Pi 40 针接头

有谁知道有一家公司销售适用于普通非物联网 Windows 10 PC 的 USB 电缆,该电缆可以将 USB 转换为 40 针 Raspberry pi 接头上的所有以下总线?示例:USB->GPIO、I2C、SPI、UART 等。

我能找到的最接近的是:

Digilentinc.com 的数字发现逻辑分析仪

这可以将 PC USB 转换为 GPIO/I2C/SPI 等...除了我正在寻找更小、电线更少的东西...只有 40 针接头或更少...类似于树莓派 40 针接头,除了被驱动从连接到 PC 的 USB 改为...有人见过这种类型的待售产品,它可以通过所有列出的总线从 PC-USB 转换为 40 针接头吗?

另外,我希望能够使用“Windows.Devices”Api 而不是专有驱动程序 DLL API 通过Windows UWP对该 USB 转换设备进行编程...还没有真正找到...示例:

// C# Program GPIO connected to USB dongle of regular PC...
using Windows.Devices.GPIO;
...
private void InitGPIO()
{
    var gpio_ctrl = GpioController.GetDefault();
    // Check GPIO state
    if (gpio_ctrl == null)
    {
        this.pin = null; …
Run Code Online (Sandbox Code Playgroud)

c# windows spi i2c gpio

5
推荐指数
1
解决办法
9578
查看次数

如何用C++在Raspberry Pi上通过i2c将MLX90640热像仪图像数据导入OpenCV?

我正在使用通过 i2c 连接到 Raspberry Pi 3 的Melexix MLX90640 32x24 热像仪传感器。

使用Pimoroni的代码,我可以通过帧缓冲区及其fbuf示例在屏幕上显示带有假颜色的相机数据。

由于它直接显示在帧缓冲区上,而不是视频流或相机设备上,因此我无法在OpenCV中读取它。我想使用Open CV中的视频流来统计房间里的人数,但不知道如何修改fbuf代码以输出视频。

它不需要是视频,只是 OpenCV 可以连续读取的图像流

我尝试过的

我安装了v4l2loopback以在 Pi 上创建虚拟摄像头设备,地址为/dev/video0。然后我使用Gstreamer创建 fbuf 代码将红外相机伪色数据写入的屏幕特定区域的流。这创建了一个可由 OpenCV 读取的流,但它没有更新流中的热图像数据。有时图像数据会部分显示,但可以正常显示 Pi 桌面。它也看起来不优雅且有缺陷,所以我想要一个更可靠的解决方案。

迄今为止的结果

Lepton有一个使用 v4l2loopback 中的ondemandcam示例的传感器工作示例,但这是一个不同的传感器,它使用 SPI 而不是 i2c 进行通信。

我的目标是将此代码与 Pimoroni 的帧捕获代码 fbuf 结合起来,从传感器获取稳定的视频流,以便我可以将其导入 OpenCV。

Lepton 的代码基于 v4l2loopback 中的 ondemandcam 示例。它将自己的传感器代码添加到该grab_frame()函数中。该open_vpipe()功能与 ondemandcam 示例相同。

如果我可以将 fbuf 中的帧缓冲区代码放入该grab_frame()函数中,那么我认为它会起作用。我不确定该怎么做。

fbuf 代码片段

这个 for 循环似乎是我需要放入函数中的内容grab_frame()

for(int y …
Run Code Online (Sandbox Code Playgroud)

c++ opencv i2c raspberry-pi3

5
推荐指数
0
解决办法
5365
查看次数

使用I2C设备id表的driver_data成员

我想了解I2C客户端驱动程序.根据我在注册I2C驱动程序之前的理解,我们必须定义i2c_device_id表和设备树兼容表.

我有疑虑.请帮我理解.

1)i2c_device_id结构的定义包含两个成员(name,driver_data).第一个成员(name)用于定义将在驱动程序绑定期间使用的设备名称,第二个成员(driver_data)的用途是什么.

2)驱动程序绑定将基于i2c_device_id表或设备树兼容的字符串发生.

提前致谢.

i2c linux-device-driver

4
推荐指数
1
解决办法
4613
查看次数

I2C从机 - 时钟延长

你们知道如何为I2C奴隶启用时钟延长吗?

将此函数I2C_StretchClockCmd(I2C2, ENABLE)放入I2C初始化是否足够?

时钟拉伸如何正常工作?

stm32 i2c

4
推荐指数
1
解决办法
2万
查看次数

i2cdetect不会显示设备,但它就在那里

只是一个简单的问题.在我的i2c上bus 0,我有两个设备,0x320x20.

当我使用i2cdetect时,只显示其中一个.

# ./i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:       -- -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- …
Run Code Online (Sandbox Code Playgroud)

linux i2c

4
推荐指数
1
解决办法
1万
查看次数

标签 统计

i2c ×10

linux ×3

raspberry-pi3 ×3

stm32 ×2

c ×1

c# ×1

c++ ×1

dma ×1

gpio ×1

hardware ×1

linux-device-driver ×1

mocking ×1

opencv ×1

sensors ×1

smbus ×1

spi ×1

unit-testing ×1

windows ×1