工具与软件:
我正在使用 BQ76942、并尝试使用 OTP 编程、但无法进入完全存取模式。
数月来、我一直在这些电路板上使用这种芯片、没有出现任何问题。 硬件工作正常并且很好理解。
TRM 中的第125页描述了 数据存储器访问的过程、我认为我执行正确。 我已经将 LA 作为支票进行了验证。 我会添加此代码、以便您查看。
要进入 FULL ACCESS 模式、IC 必须处于什么状态(而不是先打开 UNSEALED)。 我是否在完成进入完全访问权限的过程之前或之后输入 CFG_UPDATE? 我应该在之前还是之后进行寄存器复位?
任何你能提供的帮助都是感激的! 我会包含相关代码。 也许在这方面会有一些容易的错误。
FULLACCESS 的函数调用:
CommandSubcommands(BQ769x2_RESET); // Resets the BQ769x2 registers
writeDataMemoryAccess(0x9257, 0x0414, 2);
delayUS(60000);
writeDataMemoryAccess(0x9259, 0x3672, 2);
delayUS(60000);
writeDataMemoryAccess(0x925B, 0xFFFF, 2);
delayUS(60000);
writeDataMemoryAccess(0x925D, 0xFFFF, 2);
delayUS(60000);
uint8_t battery_status_data = checkBQAccessMode();
if(battery_status_data != 4)
{
// while(1)
// {
// LEDControl("R", 100, 4);
// }
}
delayUS(60000);
// Enter CONFIGUPDATE mode (Subcommand 0x0090) - It is required to be in CONFIG_UPDATE mode to program the device RAM settings
// See TRM for full description of CONFIG_UPDATE mode
CommandSubcommands(SET_CFGUPDATE);
delayUS(60000);
//Use OTP_WR_CHECK() to determine if the chip is ready for OTP programming. OTP WR CHECK will return
uint8_t otp_write_status = OTPWriteCheck();
delayUS(60000);
if(otp_write_status == 0X80){ //Write to the desired OTP Register and send the OTP Write command
test = 1;
}
writeDataMemoryAccess()函数:
void writeDataMemoryAccess(uint16_t memory_address, uint16_t value, uint8_t size){
uint8_t address[2] = {0};
address[0] = memory_address & 0xFF; // Lower byte of address
address[1] = (memory_address >> 8) & 0xFF; // Upper byte of address
uint8_t data[32] = {0};
uint8_t i;
// Prepare data in little endian format
for(i = 0; i < size; i++){
data[i] = (value >> (i * 8)) & 0xFF;
}
// Prepare the buffer for checksum calculation
uint8_t checksum_buffer[2 + size]; // 0x3E, 0x3F, and data buffer
checksum_buffer[0] = address[0]; // 0x3E
checksum_buffer[1] = address[1]; // 0x3F
for(i = 0; i < size; i++){
checksum_buffer[2 + i] = data[i]; // Data bytes starting at 0x40
}
// Calculate checksum using existing Checksum function
uint8_t checksum = Checksum(checksum_buffer, 2 + size);
// Length calculation: data length + 4 (for 0x3E, 0x3F, 0x60, 0x61)
uint8_t length = size + 4;
// Write lower byte of address to 0x3E
I2C_WriteReg(0x3E, &address[0], 1);
// Write upper byte of address to 0x3F
I2C_WriteReg(0x3F, &address[1], 1);
// Write data to 0x40
I2C_WriteReg(0x40, data, size);
// Write checksum to 0x60
I2C_WriteReg(0x60, &checksum, 1);
// Write length to 0x61
I2C_WriteReg(0x61, &length, 1);
}
I2C_WriteReg ()函数只是直通 Mem_Write 32 HAL_I2C_STM32 ()函数。