Other Parts Discussed in Thread: EV2400
你好,
读取Data Flash时, 从命令0x40获取数据时, 获取到的第0个值是0x41存储的, 最后一个值是0x60存储的, 这是什么原因导致的?可以看到图片, 我获取到的最后一个值是和命令0x60的值一模一样, 这就导致进行校验时, 无法校验通过。
根据官方手册写的程序
int8_t cBQ34Z100ReadDataFlash(uint16_t usDataAddr, uint8_t ucOffset, void *pvDatas, int8_t cLength)
{
int8_t cError = 1,i = 0;
int16_t usSubAddrOffset;
uint8_t *pucBuff = pvDatas;
int8_t cCommData0x61 = 0x00;
int8_t cCommData0x3e = usDataAddr;
int8_t cCommData0x3f = 0x00;
int8_t cCommLength0x3f = cLength;
int8_t cCommData0x60 = 0x00;
uint8_t usReadCheck = 0;
uint16_t usCheckData = 0;
if((cCommLength0x3f < 1) || (pvDatas == NULL))
return -1;
// 高低位互换
usSubAddrOffset = (usDataAddr>>8); // 获取高8位
usSubAddrOffset |= (usDataAddr&0xff)<<8; // 获取低8位
if(ucOffset > 31)
{
cCommData0x3f = 1; // 从第二页开始读
ucOffset -= 31; // 偏移量减去31
}
// 读取的长度不能小于偏移地址+1
if(cCommLength0x3f <= ucOffset)
{
cCommLength0x3f = ucOffset+1;
}
/* */
cError =cBQ34Z100WriteRegister(0x61, &cCommData0x61, 1);
/* */
cError =cBQ34Z100WriteRegister(0x3E, &cCommData0x3e, 1);
/* */
cError =cBQ34Z100WriteRegister(0x3F, &cCommData0x3f, 1);
// 最大读取长度为32
if(cCommLength0x3f > 32)
{
cCommLength0x3f = 32;
}
if(cError == 0)
{
/* */
cError = cBQ34Z100ReadRegister(0x40, pucBuff, cCommLength0x3f);
}
// 读取检验值
if(cError == 0)
{
cError = cBQ34Z100ReadRegister(0x60, &usReadCheck, 1);
for(i = 0; i < 32; ++i)
{
usCheckData += *pucBuff;
*pucBuff++;
}
printf("usReadCheck = %#x\n",usReadCheck);
printf("usCheckData = %#x\n",usCheckData);
usCheckData &= 0xff; // 取出低8位
}
return cError;
}
cBQ34Z100ReadDataFlash(48,4,data_array,32);
获取Data Flash偏移地址48的前32位数据, 但读取到的数据是从偏移1开始的, 而不是0, 也就是0x41-0x60。

cBQ34Z100ReadDataFlash(48,58,&data_array[32],32);
获取Data Flash偏移地址48的后32位数据, 但读取到的数据也是从偏移1开始的, 而不是0, 也就是0x41-0x60
