This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] OPT3001:OPT3001 I2C 通信问题

Guru**** 633105 points
Other Parts Discussed in Thread: OPT3001
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1191153/opt3001-opt3001-i2c-communication-issues

器件型号:OPT3001

您好!

I2C 无法与以下代码和附图通信,请帮助解决问题,谢谢。


从机地址 OPT3001_SLAVE_ADDR 0x44 //μ s
结果寄存器 OPT3001_Result_ADDR 0x00 //μ s
配置寄存器 OPT3001_CONF_ADDR 0x01 //μ s
下限寄存器 OPT3001_LOW_ADDR 0x02 //μ s
上限寄存器 OPT3001_UPPER ADDR 0x03 //μ s
厂商寄存器 OPT3001_MANU_ADDR 0x7E //μ s
设备寄存器 OPT3001_Devi_ADDR 0x7F //μ s

/**
*@简要通过 I2C 读取寄存器
*@param [in] ZMOD44xx 的 i2c_addr 7位 I2C 从器件地址
要读取的内部寄存器的*@param [in] reg_addr 地址
*@param [out] buf 目的缓冲区;必须至少具有 len 的大小
*@param [in] len 需要读取的字节数
*@返回错误代码
*
int8_t user_i2c_read (uint8_t i2c_addr、uint8_t reg_addr、uint8_t * buf、
uint8_t len)

i2C_cmd_handle_t cmd = i2c_cmd_link_create ();
I2C_MASTER_START (cmd);
I2C_MASTER_WRITE_BYTE (cmd、(i2c_addr << 1)| WRITE_BIT、ACK_VAL);

if (NULL!= reg_addr)

I2C_MASTER_WRITE_BYTE (cmd、reg_addr、ACK_VAL);

I2C_MASTER_WRITE_BYTE (cmd、(i2c_addr << 1)| READ_BIT、ACK_VAL);

I2C_MASTER_READ (cmd、buf、len、ACK_VAL);
I2C_MASTER_STOP (cmd);
esp_err_t ret = i2c_master_cmd_begin (I2C_master_NUM、cmd、1000 / portTIcK_rate_ms);
如果(ret!= ESP_OK)

esp_loge (tag、"read_i2c_master_cmd_begin 失败");
回程;

I2C_cmd_link_delete (cmd);
回程;

/**
*@简短通过 I2C 写入寄存器
*@param [in] ZMOD4xxx 的 i2c_addr 7位 I2C 从器件地址
要写入的内部寄存器的*@param [in] reg_addr 地址
*@param [in] buf 源缓冲区;必须至少具有 len 的大小
*@param [in] len 需要写入的字节数
*@返回错误代码
*
int8_t user_i2c_write (uint8_t i2c_addr、uint8_t reg_addr、uint8_t * buf、
uint8_t len)

i2C_cmd_handle_t cmd = i2c_cmd_link_create ();
I2C_MASTER_START (cmd);
I2C_MASTER_WRITE_BYTE (cmd、(i2c_addr << 1)| WRITE_BIT、ACK_VAL);

if (NULL!= reg_addr)

I2C_MASTER_WRITE_BYTE (cmd、reg_addr、ACK_VAL);

I2C_MASTER_WRITE(命令、命令、长度、ACK VAL);
I2C_MASTER_STOP (cmd);
esp_err_t ret = i2c_master_cmd_begin (I2C_master_NUM、cmd、1000 / portTIcK_rate_ms);
如果(ret!= ESP_OK)

esp_loge (TAG、"write_i2c_master_cmd_begin 失败");
回程;

I2C_cmd_link_delete (cmd);
回程;


/*
功能:读取设备ID μ A
输入:无 μ A
输出:无 μ A
*
空 USER_OPt3001_DEVICE_ID (空)

uint8_t data[20]={};
ID = USER_i2c_read (OPT3001_SLAVE_ADDR、OPT3001_Devi_ADDR、DATA、10);
esp Logi (tag、"device_addr data:0x%x、%x"、data[0]、data[1]);
esp Logi (tag、"device_addr data:0x%x、%x"、data[2]、data[3]);
esp Logi (tag、"device_addr data:0x%x、%x"、data[4]、data[5]);
esp Logi (tag、"device_addr data:0x%x、%x"、data[6]、data[7]);
esp Logi (tag、"device_addr data:0x%x、%x"、data[8]、data[9]);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Leo、

    我没有看到原理图有什么问题、它看起来是通过 i2c 总线发送的正确地址、但返回了 NACK。 您能否发送设备设置的图片?

    谢谢、

    Brent Elliott