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.

[参考译文] BQ40Z50-R2:命令0x44 ManufacturerBlockAccess ()的 SMBus 通信问题

Guru**** 2593370 points
Other Parts Discussed in Thread: BQ40Z50-R2, BQ40Z50

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1322946/bq40z50-r2-smbus-communication-problem-with-command-0x44-manufacturerblockaccess

器件型号:BQ40Z50-R2
主题中讨论的其他器件: BQ40Z50

您好!

I ² C`m ESP32-Wrover-E 与 BQ40Z50-R2之间发送/接收数据。

我`m 从`m 寄存器中读取存储在闪存中的所有数据(使用完全访问模式作为安全模式)。

`m、如下所示、我使用 CMD 0x00设置一个两字节的寄存器、并且刚刚使用命令0x44读取了它的值。 读数正确。

    

n`t 是,当我尝试在同一个寄存器(0x438C Cell 3 Min Voltage)写入一些值时,它不起作用。 如您所见、当我尝试发送0x44命令时、没有 ACK:

但奇怪的是、当我使用0x44命令读取任何寄存器时(使用 CMD 0x00对其进行设置-第一张图片显示了这一点)、该命令会接收 ACK 并正常运行!!!

提前感谢!!!!

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

    尊敬的 Samir:

    仅0x438C 地址会出现此问题吗、您是否可以对任何其他地址进行写入?

    如果可能、您能否分享您用于写入该地址的代码以供查看?

    为了便于将来参考、除非在问题后复位、否则不得更改寿命参数、例如 Cell 3 Min Voltage。 电池寿命参数用于电量监测计、确保在发生问题时随时参考测量值。

    此致、

    安东尼·巴尔迪诺

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

    尊敬的 Anthony:

    感谢您的回复。

    仅0x438C 地址会出现此问题吗、您是否可以对任何其他地址进行写入?

    我n`t 使用0x44命令写入任何其他地址。 `ve、我尝试在0x48B8 (LED 闪烁周期)上进行写入、但发生了相同的"错误"。

    我想知道是否可以使用命令0x00来写入地址。

    如果可能、您能否分享您用于写入该地址的代码以供查看?

    uint32_t BQ40Z50_SET_Cellmin (){
    uint32_t 结果= 0
      uint8_t datav[2]
      bq40z50_reg_ManufacturBlock DATA_;
      memset (&datav0sizeof (datav));  
      memset (&data_0sizeof (data_));
      data_.command_general[0]=0x8C;
      data_.command_general[1]=0x43;
      data[0]=0x8C
      data[1]=0x43
      data[2]=0x80
      data[3]=0x3E
      结果= i2c_write_two_bytes (BQ40R50_I2C_ADDR、0x00&(data_.command_general[0]));)
      Result |= i2c_write_block_DataFlash (BQ40R50_I2C_ADDR、&datavsizeof (datav));

      
      返回结果;

    esp_err_t i2c_write_two_bytes (uint8_t device_addruint8_t reg_addruint8_t * data)
    {
      
      I2C_cmd_handle_t cmd = i2c_cmd_link_create ();
      I2C_MASTER_START (cmd);
      I2C_MASTER_WRITE_BYTE (cmd、(device_addr << 1)| I2C_MASTER_WRITE、ACK_CHECK_EN);
      I2C_MASTER_WRITE_BYTE (cmd、reg_addr、ACK_CHECK_EN);
      I2C_MASTER_WRITE_BYTE (cmd、data[0]、ACK_CHECK_EN);
      I2C_MASTER_WRITE_BYTE (cmd、data[1]、ACK_CHECK_EN);
      I2C_MASTER_STOP (cmd);
      esp_err_t ret = i2c_master_cmd_BEGIN (I2C_master_NUM、cmd、1000 / portTICK_PERIOD_MS);
      I2C_cmd_link_delete (cmd);
      返回支架;

    esp_err_t i2c_write_block_DataFlash (uint8_t device_addruint8_t *数据、uint8_t data_size )
    {
      I2C_cmd_handle_t cmd = i2c_cmd_link_create ();
      I2C_MASTER_START (cmd);
      I2C_MASTER_WRITE_BYTE (cmd、(device_addr << 1)| I2C_MASTER_WRITE、ACK_CHECK_EN);
      I2C_MASTER_WRITE_BYTE (cmd、0x44、ACK_CHECK_EN);
      I2C_MASTER_WRITE_BYTE (cmd、DATA_SIZE、ACK_CHECK_EN);
      for (int i=0;i<data_size;i++){
        I2C_MASTER_WRITE_BYTE (cmd、data[i]、ACK_CHECK_EN);
      }
      // PEC 字节
      I2C_MASTER_WRITE_BYTE (cmd、0x00、ACK_CHECK_EN);
      I2C_MASTER_STOP (cmd);
      esp_err_t ret = i2c_master_cmd_BEGIN (I2C_master_NUM、cmd、1000 / portTICK_PERIOD_MS);
      I2C_cmd_link_delete (cmd);
      返回支架;

    为了便于将来参考、除非在问题后复位、否则不得更改寿命参数、例如 Cell 3 Min Voltage。 电池寿命参数用于电量监测计、确保在发生问题时随时参考测量值。

    电源小知识 我随机选择了 Cell 3 Min Voltage。

    感谢您的帮助!

    加油打气

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

    尊敬的 Samir:

    我认为、对于更改数据闪存参数、应使用0x44:

    您能否确认在此将地址发送为0x8C 0x43?

    此致、

    安东尼·巴尔迪诺

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

    尊敬的 Anthony:

    感谢您的更新。

    我终于意识到发生了什么。 就 SMBus 通信(PHY 级)而言、主器件需要发送与以下内容完全相同的数据帧:

    0x0B+ WRITE BIT   | 0x44 | 0x0B+ WRITE BIT |数据大小(字节数)|寄存器地址(从0x4000到0x5FFF)|要存储在寄存器中的值

    无需发送 PEC 字节。 以下捕获会将0x1111设置为寄存器0x4924。

    谢谢、

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

    尊敬的 Samir:

    明白了、这看起来是按照正确的书写流程进行的。 很高兴您的参与!

    此致、

    安东尼·巴尔迪诺