This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

BQ34Z100: BQ34Z100读取Data Flash时, 读取位置出错

Part Number: BQ34Z100
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

  • 您好,建议您用EV2400只读取一个数,如电池电压,然后用示波器把i2c的波形抓取下来。再抓一下自己软件编写的的i2c波形,同样读取这个电压,看看两者有什么区别,很快就能定位到问题。比如ACK信号有没有?发送地址对不对?发送命令时序对不对等。