我有一个 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) 我最近购买了一块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) 我尝试过通过 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 协议进行通信。设备的寄存器地址是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 有什么问题。
我正在使用一台 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) 有谁知道有一家公司销售适用于普通非物联网 Windows 10 PC 的 USB 电缆,该电缆可以将 USB 转换为 40 针 Raspberry pi 接头上的所有以下总线?示例:USB->GPIO、I2C、SPI、UART 等。
我能找到的最接近的是:
这可以将 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) 我正在使用通过 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()函数中,那么我认为它会起作用。我不确定该怎么做。
这个 for 循环似乎是我需要放入函数中的内容grab_frame()。
for(int y …Run Code Online (Sandbox Code Playgroud) 我想了解I2C客户端驱动程序.根据我在注册I2C驱动程序之前的理解,我们必须定义i2c_device_id表和设备树兼容表.
我有疑虑.请帮我理解.
1)i2c_device_id结构的定义包含两个成员(name,driver_data).第一个成员(name)用于定义将在驱动程序绑定期间使用的设备名称,第二个成员(driver_data)的用途是什么.
2)驱动程序绑定将基于i2c_device_id表或设备树兼容的字符串发生.
提前致谢.
你们知道如何为I2C奴隶启用时钟延长吗?
将此函数I2C_StretchClockCmd(I2C2, ENABLE)放入I2C初始化是否足够?
时钟拉伸如何正常工作?
只是一个简单的问题.在我的i2c上bus 0,我有两个设备,0x32和0x20.
当我使用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)