c - 寄存器的 I2C 读取和 I2C 写入行为,设备无应答

标签 c embedded i2c

我已经阅读了很多关于 i2c 的详细教程和指南,但我不清楚以下内容:

假设您必须读取 i2c 从属设备上的寄存器,

我是否需要在 i2c 上“写入”前 7 位作为 slave_address,1 位使用 R/W,然后是 reg_address(作为数据),然后发出“读取”以监听字节

h_i2c *i2c_dev = i2c_drv_open(I2C1_PORT, SLAVE_ADDRESS);
write_data[0] = 0x21;
write_len = i2c_drv_write(i2c_h, write_data, 1);
if (write_len != 1)
    printf("error write_len is %d", write_len);

uint8_t read_data[5];
read_len = i2c_drv_read(i2c_h, read_data, 5);
if (read_len != 5)
    wmprintf("error read_len is %d", read_len);

我是否只需要对一个地址发出读取,该地址是从设备和我要读取的寄存器的“组合”?

此外,“自动增量”属性意味着只要我将 SDA 控制权交给从设备,他就会继续发送数据?

编辑1:

引用pdf:

ENS210 是一个 I²C 从设备,具有固定的从地址 0x43。这意味着开始条件后的第一个字节是 1000 011x,其中x表示数据方向,所以0x86(1000 0110) 用于写入,0x87 (1000 0111) 用于读取。

这是输出

https://imgur.com/a/8G8UR

在上升沿,我看到 1 0 0 0 0 1 1 0 1

最后一个表示nACK。

我的想法是:

  1. 传感器坏了
  2. 电阻不好,sensor拉不下SDA线
  3. 频率为 125khz 是否正常?

附言: SCL 探头有问题,因此您在此处看到的信号质量更好

问候,

最佳答案

这取决于 I2C 设备。我见过的大多数都是先通过写入设置地址指针,然后再执行读取:

[START]->[ADDR(W)]->[REG]->[RESTART]->[ADDR(R)]->[DATABYTES]->[STOP]

我见过的大多数设备都会开始从指定的寄存器读取数据,并自动递增主机确认的每个数据字节的地址指针。读取的每个数据字节在内存中都是顺序的。然而,情况并非总是如此。如果需要,许多设备实际上会让您关闭寄存器自动递增。

我见过的一些设备的工作方式与他们期望读取寄存器命令的方式略有不同。有些设备根本不允许您将寄存器设置为读取,您必须进行顺序读取才能到达你想要的数据。 I2C 设备应该在数据表中包含它如何期望读/写命令的信息以及波形图。

关于c - 寄存器的 I2C 读取和 I2C 写入行为,设备无应答,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46683783/

相关文章:

python - Rpi3 BMP180气压计传感器接口(interface)问题

c - I2C 接口(interface)的 TIva C 系列问题

c - 试图理解 C 指针、 block 和 go to 语句的问题

gcc - 在嵌入式目标上动态加载代码

ssl - STM32Cube_FW_F7 客户端 mbedTLS SSL 握手失败并显示 FATAL_ALERT

c++ - Windows Embedded 中的 ShellExecute

raspbian - I2C 在 Raspbian 中不工作

谁能解释一下这个C密码哈希算法吗?

c - 我如何确定一个线程在哪里接触另一个线程的堆栈?

c++ - 依赖溢出有危险吗?