工具与软件:
我正在使用 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 ()函数。