标签: i2c

STM32 I2C1 SR1寄存器的起始位未置1

我正在尝试编程stm32与我的i2c EEprom交谈,但似乎每次我说:

I2C_GenerateSTART(I2C1, ENABLE);
while( !(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) );  the code hangs here
Run Code Online (Sandbox Code Playgroud)

我经历了调试器,我发现SR1位0标志(它是起始位生成标志)未设置,这就是代码挂起的原因.我可以在示波器中看到生成了起始位,这有时会起作用.当我试图连续写几次时,它通常会中断.我检查了硬件是否一切看起来很好我检查了我在i2c总线上运行的频率它在24lc1025 eeprom内是100Khz.

有任何想法吗,

谢谢

c embedded stm32 i2c

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

支持 16 位地址的 I2c

最初,我使用了支持 8 位 I2C 寄存器的 eBus SDK。此 SDK 不支持 I2C 的 16 位寄存器地址。这个支持I2C的16位寄存器地址的sdk有什么替代方案吗?

最好的祝福,并提前感谢您

i2c

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

Arduino 上不同的 I2C 地址?

我为 Arduino 编写了一个类,用于读取HiTechnic LEGO Mindstorms 罗盘传感器的罗盘数据。

使用 Wire-library,我可以很好地从相应的寄存器中获取数据。在我的 Arduino 库中,我介绍了有人已经在 Arduino 论坛上0x01完成的传感器。但网络上的其他地方(乐高 Mindstorms 的 RobotC 论坛本文档最底部的代码示例)都显示,该传感器的 I2C 地址是。0x02

那么,为什么我必须使用该地址0x01才能与我的传感器进行通信,而0x02其他编程语言似乎可以使用该地址呢?

c++ microcontroller arduino i2c sensors

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

如何使用STM32CUBEF4 HAL库通过i2c读取传感器数据?

我想使用最新的HAL库而不是标准外设库.

我想读出BMA250E G传感器的chip_id,但它不起作用.

aRxBuffer的值始终保持为0x00.但它应该是0xf9!

我的代码有什么问题?

?#?include? "stm32f4xx_hal.h" 

#define I2Cx_SDA_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define I2Cx_SDA_PIN GPIO_PIN_9
#define I2Cx_SDA_GPIO_PORT GPIOB
#define I2Cx_SDA_AF GPIO_AF4_I2C1

#define I2Cx_SCL_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define I2Cx_SCL_PIN GPIO_PIN_6
#define I2Cx_SCL_GPIO_PORT GPIOB
#define I2Cx_SCL_AF GPIO_AF4_I2C1

#define I2Cx_CLK_ENABLE() __HAL_RCC_I2C1_CLK_ENABLE()
#define I2Cx_FORCE_RESET() __HAL_RCC_I2C1_FORCE_RESET()
#define I2Cx_RELEASE_RESET() __HAL_RCC_I2C1_RELEASE_RESET() 
Run Code Online (Sandbox Code Playgroud)
?#?define? I2C_ADDRESS 0x18 

static void SystemClock_Config(void); 

uint8_t aTxBuffer[2],aRxBuffer; 

int main()
{ 
    HAL_Init(); 
    SystemClock_Config(); 
    I2C_HandleTypeDef I2cHandle;

    I2cHandle.Instance = I2C1;
    I2cHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    I2cHandle.Init.ClockSpeed = 400000;
    I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; 
    I2cHandle.Init.DutyCycle = I2C_DUTYCYCLE_16_9;
    I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; 
    I2cHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
    I2cHandle.Init.OwnAddress1 = 0; 
    I2cHandle.Init.OwnAddress2 …
Run Code Online (Sandbox Code Playgroud)

stm32 i2c stm32f4

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

如何使用HAL锁定和解锁功能?为什么?

我正在尝试理解由另一个程序员编写的代码.它使用I²C通信在STM32微控制器的EEPROM上写入数据.

一般来说,我理解他的代码是如何工作的,但我无法理解他为什么使用HAL_LOCKHAL_UNCLOCK函数.

这些是这些方法的代码:

typedef enum
{
    HAL_UNLOCKED = 0x00U,
    HAL_LOCKED   = 0x01U
} HAL_LockTypeDef;


#if (USE_RTOS == 1)

    /* Reserved for future use */
    #error "USE_RTOS should be 0 in the current HAL release"

#else

  #define __HAL_LOCK(__HANDLE__)                 \
      do{                                        \
          if((__HANDLE__)->Lock == HAL_LOCKED)   \
          {                                      \
             return HAL_BUSY;                    \
          }                                      \
          else                                   \
          {                                      \
             (__HANDLE__)->Lock = HAL_LOCKED;    \
          }                                      \
      } while (0)


  #define __HAL_UNLOCK(__HANDLE__)              \
      do{                                       \
          (__HANDLE__)->Lock = HAL_UNLOCKED;    \
      } …
Run Code Online (Sandbox Code Playgroud)

c hal stm32 i2c

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

什么是通用调用地址以及它在 I2C 中的用途是什么?

我想知道 I2C 中的通用调用地址 (0x00) 是什么。如果我们有一个master和一些slave,我们可以通过我们的master用这个地址与这些slave进行通信吗?

i2c

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

在树莓派中使用c/c++和i2c从特定寄存器(fifo)读取数据块

我需要在树莓派上使用c/c++和I2C从MAX30100芯片读取4字节数据。我尝试用 python 来做。它奏效了。但问题是数据速率太慢,我需要至少250次/秒更新数据,这意味着读取频率>=250Hz。所以,我把阅读从python转向了c/c++。

用wiringPi只读写一个字节是没有问题的。但是,我需要从fifo中读取4个字节(fifo的地址是0x04),wiringPi没有提供读取块数据的功能。仅具有读取字节/字功能。

然后,我尝试使用 SMBus 进行块读取,可以在这里找到: https: //github.com/leon-anavi/rpi-examples/blob/master/BMP180/c/smbus.c

但是,一旦我调用 i2c_smbus_read_block_data(),我的树莓派就完全冻结了。

这是我添加到 WiringPiI2C.c 中的读取块数据:

void i2c_smbus_read_block_data(int fd, int command, uint8_t *values, int length)
{
    union i2c_smbus_data data;
    int i, err;

    err = i2c_smbus_access(fd, I2C_SMBUS_READ, command,
                   I2C_SMBUS_BLOCK_DATA, &data);
    if (err < 0)
        return;
    printf("test1");
    for (i = 1; i <= length; i++)
        values[i-1] = data.block[i];
}
Run Code Online (Sandbox Code Playgroud)

WiringPiI2C.c可以在这里找到:https: //github.com/WiringPi/WiringPi/blob/master/wiringPi/wiringPiI2C.c

有人知道那里发生了什么事吗?或者有更好的解决方案?

c i2c raspberry-pi

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

MPU-6050:正确从 FIFO 寄存器读取数据

介绍

MPU-6050 是一种流行的模块,包含温度传感器、加速度计和陀螺仪。用户可以通过 I2C 或 SPI 读取传感器信息。有两个文件可公开用于从 IC 寄存器中读取数据。这些是:

  1. MPU-6000 和 MPU-6050 寄存器映射和描述文档

  2. MPU-6000 和 MPU-6050 产品规格


语境

由于总线通信延迟,通过 I2C 读取 IMU 的各个寄存器会使样本随时间偏移。因此,传感器的 X、Y 和 Z 轴寄存器的顺序读取不同步。为了解决这个问题,该器件提供了一个 1024 字节的内部 FIFO 队列。配置为推送到队列的数据以采样率推送到一起。因此读取 FIFO 会产生同步数据。

见(2),第 7.17 节

MPU-60X0 包含一个 1024 字节的 FIFO 寄存器,可通过串行接口访问。FIFO 配置寄存器决定将哪些数据写入 FIFO。可能的选择包括陀螺仪数据、加速度计数据、温度读数、辅助传感器读数和 FSYNC 输入。FIFO 计数器会跟踪 FIFO 中包含多少字节的有效数据。FIFO 寄存器支持突发读取。中断函数可用于确定新数据何时可用


问题

数据表指定为了从 FIFO 读取,您必须执行以下操作:

  1. 启用 FIFO(位 6,寄存器0x6A,文档 (1),第 4.29 节)
  2. 使用要推送的传感器信息配置 FIFO(注册0x23,文档 (1),第 4.7 节)。我通过分别设置第 6、5、4 和 3 位来启用XG_FIFO_ENYG_FIFO_ENZG_FIFO_EN和 …

i2c mpu6050 esp32

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

Raspberry Pi 4 I2C 总线无法正常工作

尽管 i2cDetect 确实检测到目标,但我的 Raspberry Pi 4 Model B 上的 I2C 总线无法正常工作。

我尝试使用 Raspberry Pi Sense HAT 和 SSD1306 OLED 显示屏以及带有 I2C 总线的 PCA9685 伺服驱动器。一切正常。我不知道为什么现在 I2C 总线不工作。然后我不确定其中一台设备是否有缺陷。OLED 显示屏有时会显示“雪花”。因此可能存在信号损坏。

然后我在没有 Sense HAT 的情况下测试了 Raspberry Pi。也许 Sense HAT 可能存在缺陷。没有任何帮助。然后我拔掉了OLED显示屏,但没有成功。之后将 PCA9685 插入 OLED 显示屏。现在 OLED 显示屏显示了正确的结果。我用伺服检查器测试了连接到 PCA9685 的三个伺服系统,幸运的是我发现它们没有缺陷。所以我再次连接了 PCA9685,但我无法向我的伺服系统发送 PWM 信号。之后,我移除了插入 PCA9685 和 OLED 显示屏的 I2C 集线器,以再次测试 Raspberry Pi Sense HAT。这不起作用。之后,我在较旧的 Raspberry Pi 3 Model B+ 上尝试了 Sense HAT,并且可以正确使用它。

所以我的想法是 Raspberry Pi 的 I2C 总线配置有问题。然后我进入 raspi-config 并停用 I2C 接口选项,重新启动 Pi 并再次启用此选项。没有任何帮助。

我无法使用 PCA9685 和伺服系统,也无法使用 …

i2c raspberry-pi4

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

通过在 c 中进行转换,将较大尺寸的变量 unit16 复制到等效的较小数组尺寸 unint8

我有变量uint16_t value,我想将其复制到uint8_t buffer[3]. 是否可以这样做(小端):

*buffer=*(uint8_t *)&value;
Run Code Online (Sandbox Code Playgroud)

代替:

buffer[0] = highByte(value);
buffer[1] = lowByte(value);
Run Code Online (Sandbox Code Playgroud)

由于此替换导致 stm32f7 I2C 无法正常工作。有没有正确的铸造方法?

c stm32 i2c mcu

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

标签 统计

i2c ×10

c ×4

stm32 ×4

arduino ×1

c++ ×1

embedded ×1

esp32 ×1

hal ×1

mcu ×1

microcontroller ×1

mpu6050 ×1

raspberry-pi ×1

raspberry-pi4 ×1

sensors ×1

stm32f4 ×1