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.

[参考译文] BQ40Z80:无法使用 C 代码通过 SMBus 写入 ManufacturerBlockAccess()数据

Guru**** 2590660 points
Other Parts Discussed in Thread: BQ40Z80, BQSTUDIO, EV2400

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1015653/bq40z80-unable-to-write-manufacturerblockaccess-data-over-smbus-using-c-code

器件型号:BQ40Z80
主题中讨论的其他器件: BQSTUDIOEV2400

您好的支持团队、

根据 BQ40Z80的技术参考手册,我 正在尝试通过 ManufacturerBlockAccess()方法读取 Chemical ID()(0x0006)。 遗憾的是、写入命令失败、会生成超时错误。  请查看以下问题详细信息列表:

硬件信息:  

BMS IC:BQ40Z80

MCU : ESP32.

方法:A

步骤1:初始化 ESP32 I2C 驱动程序

步骤2:SMBus 的对齐帧格式

步骤3:通过 smbus 写入数据:{0x44、0x02、0x06、0x00}、即使我尝试了各种超时、也会产生超时错误。

步骤4:通过 smbus 读取数据:{0x44}由于写入失败、它返回了{0x54、 0x00、0xa1、0x01、0x00、 0x00}。

方法: b.

步骤1:将 EV2400模块 与 BQ40Z80配合使用并使用 bqStudio 进行访问

步骤2: 我能够编写块请求并获得正确的响应。

 我很好奇地知道、我在 C 代码中的错误发生在哪里。 我还能够读取一些具有适当值的寄存器。 在这里、我发布 c 代码供您参考:

esp_err_t smbus_write_block (const smbus_info_t * smbus_info、uint8_t 命令、uint8_t *数据、uint8_t len)

//协议:[s | ADDR | WR | AS |命令| AS | LEN | AS | DATA-1 | AS | DATA-2 | AS ... | DATA-LEN | AS | P]
esp_err_t err = esp_fail;
if (_Is_init (smbus_info)&& data)

i2C_cmd_handle_t cmd = i2c_cmd_link_create ();
I2C_MASTER_START (cmd);
i2C_MASTER_WRITE_BYTE (cmd、smbus_info->address << 1 | WRITE_BIT、ACK_CHECK);
I2C_MASTER_WRITE_BYTE (cmd、command、ACK_CHECK);
i2C_MASTER_WRITE_BYTE (cmd、len、ACK_CHECK);
对于(size_t i = 0;i < len;+i)

I2C_MASTER_WRITE_BYTE (cmd、DATA[i]、ACK_CHECK);

I2C_MASTER_STOP (cmd);
ERR =_check_i2c_error (i2c_main_cmd_begin (smbus_info->i2c_port、cmd、smbus_info->timeout));
I2C_cmd_link_delete (cmd);

退货错误;


esp_err_t smbus_read_block (const smbus_info_t * smbus_info、uint8_t 命令、uint8_t * data、uint8_t * len)

//协议:[s | ADDR | WR | AS |命令| AS | SR | ADDR | RD | AS |镜头| A | DATA-1 | A | DATA-2 | A ... | DATA-LEN | N | P]
esp_err_t err = esp_fail;

如果(_Is_init (smbus_info)&& data && len)

i2C_cmd_handle_t cmd = i2c_cmd_link_create ();
I2C_MASTER_START (cmd);
i2C_MASTER_WRITE_BYTE (cmd、smbus_info->address << 1 | WRITE_BIT、ACK_CHECK);
I2C_MASTER_WRITE_BYTE (cmd、command、ACK_CHECK);
I2C_MASTER_START (cmd);
i2C_MASTER_WRITE_BYTE (cmd、smbus_info->address << 1 | Read_bit、ACK_CHECK);
uint8_t slave_len = 0;
I2C_MASTER_READ_BYTE (cmd、&SLAVE_Len、ACK_VALUE);
ERR =_check_i2c_error (i2c_main_cmd_begin (smbus_info->i2c_port、cmd、smbus_info->timeout));
I2C_cmd_link_delete (cmd);

如果(错误!= ESP_OK)

*len = 0;
退货错误;

如果(slave_len >*len)

ese_lGW (TAG,"从数据长度%d 超过数据长度%d 字节",slave_len,*len);
Slave_len =* len;

cmd = i2c_cmd_link_create();
对于(size_t i = 0;i < slave_len - 1;+i)

I2C_MASTER_READ_BYTE (cmd、&DATA[i]、ACK_VALUE);

I2C_MASTER_READ_BYTE (cmd、&DATA[SLAVE_Len - 1]、NACK_VALUE);
I2C_MASTER_STOP (cmd);
ERR =_check_i2c_error (i2c_main_cmd_begin (smbus_info->i2c_port、cmd、smbus_info->timeout));
I2C_cmd_link_delete (cmd);

如果(错误==ESP_OK)

*len = slave_len;

其他

*len = 0;


退货错误;

调用上述 API:
INT8_t buff [2]={0x06、0x00};

uint8_t data[32U]={0U};

uint8_t 长度;

if (ESP_OK!= smbus_write_block (&smbusInfo、0x44、buff、2))

esg_loge (TAG、"smbus_write_word SMBus"失败);

长度= 6;

if (ESP_OK!= smbus_read_block (&smbusInfo、0x44、数据、长度))

esg_loge (TAG、"smbus_read_block SMBus"失败);

其他

print_data (数据、长度);

上述代码片段的输出:
E (20351) smbus:I2C 超时
E (20351) smbus:smbus_write_word SMBus 失败
I (20371) smbus:RX 数据:
I (20371) smbus:0x54
I (20371) smbus:0x00
I (20371) smbus:0xa1
I (20371) smbus:0x01
I (20371) smbus:0x00
I (20371) smbus:0x00

SMBus 代码参考: github.com/.../esp32-smbus

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

    您好 kanji、

    您是否能够使用逻辑分析仪探测 SMBus 线路? 这可以提供有关您是否发送正确位以及可能导致超时错误的时序信息的提示。

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

    、不幸的是、我没有逻辑分析仪、首先调试这个问题。 当通过0x44命令发送块请求时、我还观察到 bqstudio 在读取响应中也会返回一个意外值。 但是、如果您尝试多次、则5个请求中的1个响应是正确的。 我不知道为什么 EV2400会发生这些情况。

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

    Kanji、

    我们强烈建议您使用逻辑分析仪来调试这些问题。 由于您没有将 TI 推荐的工具用于您的主应用、我们无法为您提供很多帮助、因为我们无法轻松复制您的条件。

    至于 bqstudio 的问题、我们将对此进行研究、并稍后再与您联系。

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

    Kanji、

    我们使用 EV2400和 BQStudio 测试了 BQ40z80的化学 ID 读取情况、看起来工作正常。 您通过 BQStudio 发送读取命令的过程是什么?

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

    您是否启用了在 GUI 后端持续扫描数据? 之后执行0x44块请求以获取任何数据并检查响应。

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

    您好、Kanji、

    请使用 GUI 禁用持续扫描、因为它可能会干扰监测计通信。 您能否发送一张屏幕截图、说明您是如何尝试读取 BQStudio 中的 ChemID 并展示其如何发生故障的。 您使用的是"Commands"选项卡下的 chemID 命令还是使用"Advanced"选项卡? 您是否使用最新的 EV2400固件? 我已经多次测试过这种方法、使用这两种方法读取化学 ID 时没有遇到任何问题。

    如果您使用高级通信、是否发送以下命令?

    写入块 cmd 0x44数据:06 00

    读取块 cmd 0x44

    对于 ESP32代码、如果没有逻辑分析仪捕获、我们无法调试此代码、因为我们不熟悉 API。

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

    您好、支持团队、  

    我们已解决了末尾的 SMBus 超时问题 esp32 i2c 驱动程序出现问题。 更多信息请参考: https://github.com/espressif/esp-idf/issues/680

    非常感谢您花时间和精力。

    此致、

    Kanji Viroja。