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.

[参考译文] BQ35100:写入 DataFlash、容量

Guru**** 2553260 points
Other Parts Discussed in Thread: BQ35100

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/849504/bq35100-writing-to-dataflash-capacity

器件型号:BQ35100

尊敬的论坛用户:

我在写入 BQ35100的数据闪存时遇到一些问题。
由于写入配置 A 寄存器有效、我尝试使用配置 A 的相同顺序和代码来写入电池容量。

这是我用于设置电池容量的代码:

uint8_t writeToDataFlash (uint16_t writeRegister、uint16_t data、uint8_t dataSize)
{
如果(!dataSize)返回失败;

uint8_t check[2]={0};
uint16_t 校验缓冲= 0;
uint8_t pData[4]={0};

pData[0]= writeRegister;
pData[1]= writeRegister >> 8;
pData[2]=数据>> 8;
pData[3]=数据;

if (I2cWriteBuffer (&I2C、c_BQ35100I2CAddr、c_ManufacturerAccessControlAddr、pData、2 + dataSize)==故障)
{
printf( llerror,"writetodataflash: write register + data failed");
返回失败;
}
DelayMs(100);

//计算校验和并写入 MacDataSum + MacDataLen
对于(uint8_t i = 0;i <= 2+dataSize;i++)
{
CheckBuffer += pData[i];
}
CHECK[0]=~CHECKBuffer;
check[2]= 4 + dataSize;

//下一个写入函数自动递增!
I2cWriteBuffer (&I2C、c_BQ35100I2CAddr、c_ManufacturerAccessControlDataSummer、check、2);


DelayMs(100);
返回成功;
} 

我要发送的数据是寄存器0x41FE 的17Ah (0x4268)容量:

writeToDataFlash (0x41fe、0x4268、2); 

读取容量始终会提供默认值、即2200mAh。

我出了什么问题?

感谢您的帮助!

问候 Jorg

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Jorg、

    请遵循电量监测计通信应用手册。 有一个示例说明了如何执行该操作。 您正在使用直接写入、我们对 bq35100使用子类/偏移。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您似乎使用了错误的检查索引[]:

        check[0] = ~checkBuffer;
        check[2] = 4 + dataSize;

    为什么第二个索引是2而不是1?

        uint8_t check[2] = { 0 };

    "check"是大小为2的 uint8_t 数组、因此允许的最大索引为1、而不是2

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Kang Kang,

    实际上、我正在尝试使用 TRM、因为 slua801不是为 BQ35100编写的。
    这非常令人困惑、因为两个器件的子类不同。

    在 TRM (sluubh1c)中、它显示如下:

    12.1.1写入 DF 示例

    假设 data1位于地址0x4000、data2位于地址0x4002、且 data1和 data2均为 U2类型。 要分别将 data1和 data2更新为0x1234和0x5678、请执行以下操作:
    •将0x00 0x40 (小端字节序格式的 DF 地址)写入 ManufacturerAccessControl (0x3E、0x3F)。
    •将0x12 0x34 0x56 0x78 (大端字节序格式的数据)写入 MACData (0x40–0x43)。 写入 ManufacturerAccessControl()和 MACData()的操作可在单个事务中执行。
    •将0xAB (ManufacturerAccessControl()和 MACData()字节之和的补码)写入 MACDataSum (0x60)。
    •将0x08 (4+ MACData()字节长度)写入 MACDataLen (0x61)。
    •当 MACDataSum()和 MACDataLen()按顺序(字写入)被写入并且被验证为正确时、数据闪存写入将被执行。

    在 slua801中、它显示以下内容、这似乎是相同的?:

    4.2寻址数据存储器

    读取和写入数据存储器遵循以下顺序:
    1.将子类编号写入子类命令(0x3E)。
    2.将数据块编号写入数据块命令(0x3F)。
    3.从块数据命令(0x40)开始读取或写入数据块(最多32个字节)。
    4、(只写):计算校验和并将其写入校验和命令(0x60)。

    这意味着电池容量的子类错误?

    感谢您的帮助!

    ========================================================================

    uint8_t writeToDataFlash (uint16_t writeRegister、uint16_t data、uint8_t dataSize)
    {
    如果(!dataSize)返回失败;
    
    uint8_t check[2]={0};
    uint16_t 校验缓冲= 0;
    uint8_t pData[2]={0};
    
    pData[0]= writeRegister >> 8;
    pData[1]= writeRegister;
    
    
    
    //子类编号41到0x3E 和数据锁命令0xFE 到0x3F。
    if (I2cWriteBuffer (&I2C、c_BQ35100I2CAddr、c_ManufacturerAccessControlAddr、pData、2)==故障)
    {
    printf( llerror,"writetodataflash: manufactureraccesscontrolladr write failed");
    返回失败;
    }
    DelayMs(100);
    
    
    pData[0]=数据; //以大端序排列的数据
    pData[1]=数据>> 8;
    
    //从数据块命令开始写入数据,从数据块命令开始(0x40)
    if (I2cWriteBuffer (&I2C、c_BQ35100I2CAddr、c_ManufacturerAccessControlDataAddr、pData、2)== FAIL)
    {
    printf( llerror,"writetodataflash: data write failed");
    返回失败;
    }
    DelayMs(100);
    
    
    //计算校验和并写入 MacDataSum + MacDataLen
    对于(uint8_t i = 0;i <= 2+dataSize;i++)
    {
    CheckBuffer += pData[i];
    }
    CHECK[0]=~CHECKBuffer;
    check[1]= 4 + dataSize;
    
    //下一个写入函数自动递增!
    if (I2cWriteBuffer (&I2C、c_BQ35100I2CAddr、c_ManufacturerAccessControlDataSummer、check、2)= FAIL)
    {
    abelDebugMessage( llerror,"writetodataflash: write sum + len failed");
    返回失败;
    }
    DelayMs(100);
    返回成功;
    } 

    仍然没有成功...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Dominik、您好!

    哎呀... 我将其更改为选中[1]。
    ´,它仍然无法正常工作。

    感谢您的帮助!  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Dominik、

    由于某种原因、我第一次修复错误的索引时仍然无法正常工作、但现在在尝试了大量代码并再次尝试了第一个代码后、仍然可以正常工作!
    对于具有相同问题的人员、使用我的第一次尝试会起作用"如果您使用正确的检查索引"。

    再次感谢您!