Thread 中讨论的其他器件: BQSTUDIO
工具与软件:
下午好!
我是一个经验不足的程序员,所以我很抱歉,如果问题有点不合适。
我正在尝试更改 bq35100的数据闪存中的某个值。 为此、我首先要确认器件是否处于 FULL ACCESS 模式。 然后我读取 ccgain 的值、得到的结果是17276。
尝试将值更改为以下值后:0x1234和0x5678。 之后我再次读取 CCGain 值、但它们仍然给出17276。 我在做什么错? 我是否在两者之间遗漏了一些东西? 我附上我使用的代码:
功能:
此函数用于读取16位寄存器
uint16_t read16bitRegister (uint8_t reg_addr、unsigned char numBytesReceived){
uint16_t 数据;
twi_BQRead (reg_addr、numBytesReceived);//从指定的寄存器读取2个字节
DATA =(twi_data_buffer[1]<< 8)| twi_data_buffer[0];//将以小端字节序格式读取的两个字节组合在一起
返回数据;
}
//此函数用于以小端字节序格式写入16位寄存器
void write16bitRegister (uint8_t reg_addr、uint16_t data){
uint8_t low_byte =数据和0xFF;
uint8_t high_byte =(DATA >> 8)和0xFF;
twi_BQWrite (reg_addr、low_byte、high_byte);//以小端字节序格式写入两个字节
_delay_ms (10);//添加一个较小的延迟以确保写入完成
}
uint16_t readCCGain (){
uint16_t cc_gain;
//步骤1:将寄存器地址写入 ManufacturerAccessControl
write16bitRegister (MANUFACTURER_ACCESS_REG、0x4000);// DataFlash 中 CC Gain 的地址
_delay_ms (10);//暂停以进行处理
//步骤2:开始从 MACData 读取(0x40)
TWI_BQRead (0x40、2);//从 MACData 地址(0x40)读取2个字节
//步骤3:组合以小端字节序格式读取的两个字节
CC_GAIN =(twi_data_buffer[1]<< 8)| twi_data_buffer[0];
Return cc_gain;//返回 CC Gain 值
}
void writeCCGain (uint16_t new_value){
uint8_t 校验和;
//步骤1:将寄存器地址写入 ManufacturerAccessControl
write16bitRegister (MANUFACTURER_ACCESS_REG、0x4000);// DataFlash 中 CC Gain 的地址
_delay_ms (10);//暂停以进行处理
//步骤2:将新值写入 MACData (0x40)
TWI_BQWrite (0x40、NEW_VALUE & 0xFF、(NEW_VALUE >> 8)和0xFF);//以小端字节序格式写入值
//步骤3:计算校验和
CHECKSUM = 0x00 + 0x40 +(NEW_VALUE & 0xFF)+((NEW_VALUE >> 8)& 0xFF);//添加地址和数据值
checksum =~checksum + 1;//二进制补码
//步骤4:写入校验和和和长度
TWI_BQWrite (0x60、CHECKSUM、0x02);//写入校验和及长度(2个字节)
_delay_ms (10);//暂停以确保写入完成
}
void displayCCGainOnConsole (){
uint16_t cc_gain;
char buffer[10];//用于存储转换到字符串的值的缓冲区
//读取 CC Gain 值
cc_gain = readCCGain ();//调用读取 CC Gain 的函数
//将 CC 增益值转换为字符串(十进制)
itoa (cc_gain、buffer、10);//将值转换为十进制字符串(以10为底)
//将值发送到控制台
send_at_command ("CC 增益值:");
send_at_command (buffer);//以字符串的形式发送转换后的值
}
void verifyDeviceStatus(){
uint16_t CONTROL_STATUS;
字符缓冲器[10];
//从控制状态寄存器中读取值
CONTROL_STATUS = read16bitRegister (CONTROL_STATUS_REG、2);//从控制状态寄存器读取2个字节
//提取 SEC1和 SEC0位(位14和13)
uint8_t sec_bits =(CONTROL_STATUS >> 13)& 0x03;//获取 SEC1和 SEC0位
//在控制台上显示当前模式
if (sec_bits == 0x01){
send_at_command ("模式:完全访问");
}否则为(sec_bits == 0x02){
send_at_command ("Mode:unsealed");
}否则 if (sec_bits == 0x03){
send_at_command ("Mode:Sealed");
其他{
send_at_command ("模式:保留或未知");
}
//在控制台上显示 Control Status 值(可选)
itoa (control_status、buffer、16);
SEND_AT_COMMAND ("控制状态值:");
send_at_command (buffer);
}
void unlockDevice(){
verifyDeviceStatus();//尝试解锁之前验证当前状态
uint16_t CONTROL_STATUS = read16bitRegister (CONTROL_STATUS_REG、2);//读取当前状态
uint8_t sec_bits =(CONTROL_STATUS >> 13)& 0x03;//获取 SEC1和 SEC0位
//如果器件处于 SEALED 模式(11)、则发送 UNSEAL 命令
if (sec_bits == 0x03){
send_at_command ("尝试解锁器件...");
//步骤1:发送解封命令(通常为0x8000)
write16bitRegister (MANUFACTURER_ACCESS_REG、0x8000);//发送解封命令
_delay_ms (1000);//暂停以进行处理
//步骤2:如有必要、发送完全访问命令(0xFFFF)
write16bitRegister (MANUFACTURER_ACCESS_REG、0xFFFF);//发送完全访问命令
_delay_ms (1000);//暂停以进行处理
SEND_AT_COMMAND ("已发送解锁命令。 正在验证状态...");
//尝试解锁后验证状态
verifyDeviceStatus();//在控制台上显示新状态
其他{
send_at_command ("设备已解锁。");
}
}
void writeToDataFlash (uint16_t address、uint16_t value1、uint16_t value2){
uint8_t 校验和;
uint8_t macData[4];
uint8_t sum = 0;
//以小端字节序将地址写入 ManufacturerAccessControl (0x3E、0x3F)
write16bitRegister (Manufacturer_access_REG、address);//将地址0x4000写入 ManufacturerAccessControl
_delay_ms (500);//暂停以进行处理
//以大端字节序将数据写入 MACData (0x40–0x43)
macData[0]=(value1 >> 8)& 0xFF;// value1的高字节
macData[1]= Value1 & 0xFF;// value1的低字节
macData[2]=(value2 >> 8)& 0xFF;// value2的高字节
macData[3]= value2 & 0xFF;// value2的低字节
//将4字节的数据写入 MACData
TWI_BQWrite (0x40、macData[0]、macData[1]);//写入前两个字节(0x40-0x41)
TWI_BQWrite (0x42、macData[2]、macData[3]);//写入后两个字节(0x42-0x43)
_delay_ms (500);//暂停以进行处理
//计算校验和:ManufacturerAccessControl 和 MACData 之和的补码
sum +=(address & 0xFF);//地址的低字节
sum +=(地址>> 8)& 0xFF;//地址的高字节
sum += macData[0];//数据之和
sum += macData[1];
sum += macData[2];
sum += macData[3];
校验和=~sum + 1;//二进制补码
//将校验和写入 MACDataSum (0x60)
TWI_BQWrite (0x60、CHECKSUM、0x00);//写入校验和
_delay_ms (500);//暂停以进行处理
//将数据长度写入 MACDataLen (0x61)
TWI_BQWrite (0x61、0x08、0x00);//总长度:4 + MACData 的长度
_delay_ms (500);//暂停以进行处理
}
void changeCCGainValue (){
uint16_t new_value1 = 0x1234;//要写入的第一个值(十六进制0x1234)
uint16_t new_value2 = 0x5678;//要写入的第二个值(十六进制0x5678)
unlockDevice();//确保设备已解锁
_delay_ms (1000);
//调用该函数以写入位于地址0x4000的 DataFlash
writeToDataFlash (0x4000、NEW_VALUE1、NEW_VALUE2);
//向控制台发送消息以进行确认
SEND_AT_COMMAND ("写入 CC 增益的新值:0x1234和0x5678");
}
主页:
_delay_ms(3000);
SEND_AT_COMMAND ("读取 CC 增益值...");
displayCCGainOnConsole ();
_delay_ms (1000);
send_at_command ("更改 CC 增益值...");
changeCCGainValue();
_delay_ms(3000);
谢谢你。 祝你一切顺利