主题中讨论的其他器件: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: }
串行终端上的输出:-
技术参考手册中的屏幕截图:
谢谢