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.

[参考译文] BQ34Z110:bq34z110PWR 写入数据闪存过程

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1168997/bq34z110-bq34z110pwr-write-data-flash-process

器件型号:BQ34Z110
主题中讨论的其他器件: BQ34Z100BQSTUDIO
您好!
更新/更改 BQ34Z110 IC 数据闪存中的值的正确步骤是什么?  
例如、我们将设计容量的值从4000更改为16000 (mAh)。 我们现在的工作方式是:
1.解封
2.读取数据块
3.更改寄存器并将其写回
4.校验和
5.读取数据块以确认更改
我们一直在提到 Github 的图书馆。  对于此特定任务、 我们使用这行 代码
问题是库适用于 BQ34Z100、我们使用的是 BQ34Z110。 到目前为止、我们仍然无法更改数据闪存上的值、但能够从数据闪存中读取。
对于 BQ34Z110、我们是否应该采取其他措施? 写入 BQ34Z100和 BQ34Z110闪存数据的过程是否有差异?  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Nur、

    两者的过程相同。 块大小和偏移可能不同。 TRM 有一个示例序列供参考。

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

    您好、Shirish、

    我的操作与文档 SLUA790 第8页中的操作完全相同(代码如下)。 但仍无法写入闪存。 我的代码是否有任何问题?

    除了代码之外、IC 是否需要处于正常模式才能执行写入过程?

    因为、我检查了 CONTRAL_STATUS、睡眠模式的位设置为1、这意味着 IC 处于睡眠模式。

    我是否需要先将 IC 设置为正常模式、然后才能向 IC 写入内容?

    /* To write 16000 to the Design Capacity on the data flash replacing the
    default value 4000*/
    uint8_t subclass = 48; //or 0x30
    uint8_t offset = 21; //or 0x15
    uint16_t value = 16000;
    
    const uint8_t BQ34Z110_ADDRESS = 0x55;
    uint8_t flash_block_data[32] = {0};
    
    
      /*
      Unsealed
      */
      Wire.beginTransmission(BQ34Z110_ADDRESS);
      Wire.write(0x00);
      Wire.write(0x14);
      Wire.write(0x04);
      Wire.endTransmission();
      
      Wire.beginTransmission(BQ34Z110_ADDRESS);
      Wire.write(0x00);
      Wire.write(0x72);
      Wire.write(0x36);
      Wire.endTransmission();
    
      delay(4000); // mandatory wait time after unseal
    
      /*
      Reading the data flash
      */
      Wire.beginTransmission(BQ34Z110_ADDRESS);
      Wire.write(0x61); // BlockDataControl()
      Wire.write(0x00);
      Wire.endTransmission();
    
      Wire.beginTransmission(BQ34Z110_ADDRESS);
      Wire.write(0x3e); // DataFlashClass()
      Wire.write(subclass); // Subclass 48 = 0x30
      Wire.endTransmission();
    
      Wire.beginTransmission(BQ34Z110_ADDRESS);
      Wire.write(0x3f); // DataFlashBlock()
      Wire.write(offset / 32); // 21/32 = 0x00
      Wire.endTransmission();
      
      Wire.beginTransmission(BQ34Z110_ADDRESS);
      Wire.write(0x40); // BlockData()
      Wire.endTransmission();
      Wire.requestFrom(BQ34Z110_ADDRESS, 32, true);
      Wire.readBytes(flash_block_data, 32); // read 32 bytes
    
      /*
      Checksum
      */
      Wire.beginTransmission(BQ34Z110_ADDRESS);
      Wire.write(0x60); // BlockDataCheckSum()
      Wire.write(0x00);
      Wire.endTransmission();
    
      /*
      Update block data
      */
      flash_block_data[offset] = value >> 8;
      flash_block_data[offset + 1] = value & 0xff;
    
      /*
      Writing the data flash 
      */
      Wire.beginTransmission(BQ34Z110_ADDRESS);
      Wire.write(0x3e); // DataFlashClass()
      Wire.write(subclass); // Subclass 48 = 0x30
      Wire.endTransmission();
    
      Wire.beginTransmission(BQ34Z110_ADDRESS);
      Wire.write(0x3f); // DataFlashBlock()
      Wire.write(offset / 32); // 21/32 = 0x00
      Wire.endTransmission();
    
      Wire.beginTransmission(BQ34Z110_ADDRESS);
      Wire.write(0x40); //BlockData()
      Wire.write(flash_block_data, 32); // write 32 bytes
      Wire.endTransmission();
    
      /*
      Checksum
      */
      uint8_t chksum = flash_block_checksum();
      uint8_t chksum2 = flash_block_checksum_2();
    
      Wire.beginTransmission(BQ34Z110_ADDRESS);
      Wire.write(0x60); // BlockDataCheckSum()
      Wire.write(chksum);
      Wire.endTransmission();
    
      delay(5000);
    
      /*
      Reading the data flash
      */
      Wire.beginTransmission(BQ34Z110_ADDRESS);
      Wire.write(0x61); // BlockDataControl()
      Wire.write(0x00);
      Wire.endTransmission();
    
      Wire.beginTransmission(BQ34Z110_ADDRESS);
      Wire.write(0x3e); // DataFlashClass()
      Wire.write(subclass); // Subclass 48 = 0x30
      Wire.endTransmission();
    
      Wire.beginTransmission(BQ34Z110_ADDRESS);
      Wire.write(0x3f); // DataFlashBlock()
      Wire.write(offset / 32); // 21/32 = 0x00
      Wire.endTransmission();
      
      Wire.beginTransmission(BQ34Z110_ADDRESS);
      Wire.write(0x40); // BlockData()
      Wire.endTransmission();
      Wire.requestFrom(BQ34Z110_ADDRESS, 32, true);
      Wire.readBytes(flash_block_data, 32); // read 32 bytes
    
    
      Serial.println("Read Data Flash New");
      for (int i = 0; i < 32; i++)
      {
        Serial.printf("%02i. 0x%02x\r\n", i, flash_block_data[i]);
      } 

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

    你好、Nur、

    由于实现方式的差异、每个微控制器的代码的运行方式会有所不同

    。 我建议您使用 bqStudio。 关闭仪表板刷新、然后使用高级通信选项卡执行这些步骤。 然后、您可以监控总线并与您的实现进行比较。