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:使用 ManufacturerBlockAccess() 从数据闪存读取 OCC1 和 OCD1 阈值

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1525780/bq40z50-r2-reading-occ1-and-ocd1-threshold-values-from-data-flash-using-manufacturerblockaccess

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

工具/软件:

嘿、所以我一直在尝试读取 OCC1 (充电期间发生过流 1)和 OCD1 (放电期间发生过流 1) 阈值 中导出 数据闪存 。 我先用 OCC1 开始。 现在、上的“数据闪存“表中给出的 OCC1 Threshold 地址 《主机接口技术参考手册》 0x495E

现在、根据技术参考手册访问数据闪存、只能使用来访问数据闪存 ManufacturerBlockAccess() '0x44'  物理地址寻址实现的。

阅读特定值的整个过程分为两部分、在手册中如下:  

采用 DF 读取示例中的相同假设、读取 DF、

a. 使用命令 0x44 发送 SMBus 写入块、块= 0x00 + 0x40

b. 使用命令 0x44 发送 SMBus 读取块返回的块=起始地址+ 32 字节 DF 数据= 0x00 + 0x40 + data1_LowByte + data1_HighByte + data2_LowByte + data2_HighByte + data2_HighByte…… data32_LowByte + data32_HighByte

如前所述、手册中给出的 OCC1 阈值地址为 0x495E、所以我使用了它并遵循了上面分享的手动示例中显示的相同过程。  
我尝试使用来自 ESP32 WROOM 32E 的 I2C 在 Arduino 草图中读取数据、但返回的数据完全不正确、甚至不符合 返回的块  驱动器结构、如上所示 前两个字节是最初使用写入块发送的地址的 LSB 和 MSB 。 为提供的默认值 OCC1 阈值为 6000mA 在十六进制表示应该为 0x1778 的手册中,如果是这种情况,并且考虑到使用 ManufacturerBlockAccess() 执行的块读取返回小端字节序的数据,那么我应该在发送为的整个 34 个字节中的某个位置获得 0x1778 0x70 (LSB)+ 0x17 (MSB) 但这是无处可寻的。  

我附上了我的 Arduino Sketch、它的输出(如串行终端所示)以及技术参考手册中的几个屏幕截图。 请帮助我解决这个问题、并告诉我需要在代码中执行哪些其他操作。

Arduino 草图:-

#include "Wire.h"

#define ESP32
#define BQ_ADDR 0x0B
#define MFG_BLOCK_ACC 0x44// MANUFACTURER BLOCK ACCESS COMMAND
#define LSB 0x5E// LSB OCC1 THRESHOLD ADDRESS
#define MSB 0x49// MSB OCC1 THRESHOLD ADDRESS
#if defined(ESP32)
#define SDA 21
#define SCL 22
#elif defined(ESP32S3)
#define SDA 8
#define SCL 9
#endif
void setup() {
  // put your setup code here, to run once:
  uint8_t HW_b[34];
  Serial.begin(115200);
  Wire.begin(SDA,SCL);
  Wire.beginTransmission(BQ_ADDR);
  Wire.write(MFG_BLOCK_ACC);// SENDING WRITE BLOCK WITH COMMAND 0x44
  Wire.write(LSB);// LSB OCC1 THRESHOLD ADDRESS
  Wire.write(MSB);// MSB OCC1 THRESHOLD ADDRESS
  Wire.endTransmission();
  delay(1000);
  
  Wire.beginTransmission(BQ_ADDR);
  Wire.write(MFG_BLOCK_ACC);// SENDING READ BLOCK WITH COMMAND 0x44
  Wire.requestFrom(BQ_ADDR,34);
  delay(100);
  Serial.println("Returning all bytes in little endian");
  for(int i = 0; i<34;i++){
    if(Wire.available()){
    HW_b[i]=Wire.read();
    Serial.print("Byte ");
    Serial.print(i);
    Serial.print(": 0x");
    Serial.println(HW_b[i],HEX);
    }
  }
  Wire.endTransmission();
}

void loop() {
  // put your main code here, to run repeatedly:

}

串行终端上的输出:-

技术参考手册中的屏幕截图:

       

谢谢

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

    您好:

    您能否在读取 DF 时确认器件是否处于 UNSEALED 状态?

    如果可能、您能否在发送这些命令时共享逻辑分析仪的通信捕获结果?

    此致、

    Anthony

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

    您好:
    是的、在刷写 Arduino Sketch 以解封 BQ40Z50 之前和之后、我都使用 Manufacturer Access 读取了 Operation Status (0x0054)、但两次读取都返回了完全相同的 4 个字节、根本没有任何变化。 读取结果产生了 0x00 0x54 0x1F 0x1F(全部采用小端字节序格式)、因此实际读取将是 0x1F1F5400 二进制表示为  0001 1111 0001 1111 0101 0100 0000 0000 、现在根据操作状态的技术参考 SEC 0 和 SEC 1 告诉我们设备是否是 密封 规格。 SEC 1 (位 9)while SEC 0 (位 8)。  
    但根据我的调查结果、两者都是 0 S、根据技术参考、它表示 Security Mode 保留

    我正在发送 Arduino 草图的两个:-

    1) 操作状态读取

    #include "Wire.h"
    
    #define BQ_ADDR 0x0B
    #define MFG_ACC 0x00
    #define MFG_DAT 0x23
    #define LSB 0x54
    #define MSB 0x00
    #define SDA 21
    #define SCL 22
    
    void setup() {
      uint8_t byte[4];
      memset(byte,0,sizeof(byte));
      Serial.begin(115200);
      Wire.begin(SDA,SCL);
      Wire.beginTransmission(BQ_ADDR);
      Wire.write(BQ_ADDR);
      Wire.write(MSB);
      Wire.write(LSB);
      Wire.endTransmission();
    
      Wire.beginTransmission(BQ_ADDR);
      Wire.write(MFG_DAT);
      Wire.requestFrom(BQ_ADDR,4);
      for(int i = 0;i<4;i++){
        if(Wire.available()){
          byte[i]=Wire.read();
          Serial.print("0x");
          Serial.println(byte[i],HEX);
        }
        else Serial.println("No data available over I2C");
      } 
      Wire.endTransmission();
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
    
    }
    

    2) 解封装置的程序

    #include "Wire.h"
    
    #define BQ_ADDR 0x0B
    #define MFG_ACC 0x00
    #define LSB_1 0x14
    #define MSB_1 0x04
    #define LSB_2 0x72
    #define MSB_2 0x36
    #define SDA 21
    #define SCL 22
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(115200);
      Wire.begin(SDA,SCL);
      Wire.beginTransmission(BQ_ADDR);
      Wire.write(MFG_ACC);
      Wire.write(MSB_1);
      Wire.write(LSB_1);
      delay(4000);
      Wire.write(MSB_2);
      Wire.write(LSB_2);
      Wire.endTransmission();
      Serial.println("DEVICE UNSEALED!");
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
    
    }
    

    P.S: — 在上述代码中,为了解封设备,增加了 4000ms 的延迟、因为技术参考手册指示在发送第一个和第二个安全密钥之间发送 4 秒的延迟。

    谢谢

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

    您好:

    以下是逻辑分析仪在发送使用制造商块访问从数据闪存读取 OCC1 阈值的命令时的屏幕截图。

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

    您好:

    我们已收到您的请求、正在调查此问题。 我们将尽快提供更新。

    此致、

    Anthony