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.

[参考译文] BQ4050:ManufacturerAccess()和 ManufacturerBlockAccess()

Guru**** 2582215 points
Other Parts Discussed in Thread: BQ4050, BQSTUDIO

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/820816/bq4050-manufactureraccess-and-manufacturerblockaccess

器件型号:BQ4050
主题中讨论的其他器件: BQSTUDIO

您好!

关于 BQ4050的 TRM、我有两个问题、见第69页。

1.这些错别字吗? 我想我们在这段中描述的是 ManufacturerAccess()(0x00)。

在上面的示例中、通过写入、发送的数据=00 03不是小端字节序。 但数据读取=00 01、它是正确的吗?

总之、我的理解是:

通过使用 ManufacturerBlockAccess(),命令为0x44,发送和读取的数据全部位于小端字节序中,

通过使用 ManufacturerAccess(),命令为0x00,发送的数据不是小端字节序,而数据读取是小端字节序。

正确吗?

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

    我的客户读取 DeviceName,LifetimeDataBlock with ManufacturerBlockAccess()。

    但结果不稳定、有时结果是正确的、但有时结果是部分正确的、FFFF 在数据的后面部分进行回读。

    读取此数据的正确代码是什么?

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

    您好 Howard、

    是的、这看起来是一个拼写错误。

    请在读取数据时禁用扫描。 扫描将影响使用 manufacturerblockaccess 读取的数据。

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

    BATT、

    我和客户都不知道扫描是什么。 您能更具体吗?

    读取器件名称和制造商名称的客户代码如下所示:

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    memset (buf、0、sizeof (buf));
    b_len = 8;
    RET = bq4050_i2c_access_By_block (1、gp_bq4050_info->regs[bq4050_reg_mname]、
    &b_len、buf);
    
    if (ret!=监测计_IC_RET_OK)
    回程;
    
    if (debug_notify)
    _printk ("mname:%d、%s\r\n、b_len、buf);
    
    memset (buf、0、sizeof (buf));
    b_len = 20;
    RET = bq4050_i2c_access_By_block (1、gp_bq4050_info->regs[bq4050_reg_dname]、
    &b_len、buf);
    
    if (ret!=监测计_IC_RET_OK)
    回程;
    
    if (debug_notify)
    _printk ("dname:%d、%s\r\n "、b_len、buf);
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    /*下方 是上述代码调用的函数定义。*/
    
    static int bq4050_i2c_access_By_block (unsigned char w_r、unsigned char cmd、unsigned char *len、unsigned char *dat)
    {
    内转台;
    unsigned char buf[128*2+2];
    
    if (gp_bq4050_info =空)
    RETURG_IC_RET_NO_INITED;
    /*
    if (dat =NULL ||*len <=0 )
    返回 Gauge _IC_RET_PARAM_ERR;*/
    
    memset (buf、0、sizeof (buf));
    
    if (w_r)//read
    {
    
    simple_lock();
    RET = SIM2CReadDataFromAddr (/gp/bq4050_info->sim_i2c_HDL、gp_bq4050_info->slave_addr、cmd、
    buf、*len+1);//包含一个字节,指示数据的数量
    simple_unlock ();
    
    gp_bq4050_info->inner_err = ret;
    
    if (debug_notify)
    _printk ("$$$$R:%d、%d、(%x:%x:%x:%x:%x:%x)\r\n、ret、*len+1、
    buf[0]、buf[1]、buf[2]、buf[3]、buf[4]、 buf[5]、buf[*len]);
    
    if (ret!=* len+1)
    返回 Gauge _IC_RET_READ_ERR;
    
    memcpy (dat、&buf[1]、buf[0]);
    *len = buf[0];
    
    }
    其他
    {
    buf[0]=*len;
    memcpy (&buf[1]、dat、*len);
    
    simple_lock();
    RET = SimI2CWriteDataToAddr (/gp/bq4050_info->sim_i2c_HDL、gp_bq4050_info->slave_addr、cmd、
    女性,* len+1);
    simple_unlock ();
    
    gp_bq4050_info->inner_err = ret;
    
    if (debug_notify)
    _printk ("$$$$W:%d、%d、(%x:%x:%x:%x:%x:%x)\r\n"、ret、*len+1、
    buf[0]、buf[1]、buf[2]、buf[3]、buf[4]、 buf[5]、buf[*len]);
    
    if (ret!=* len+1)
    返回 Gauge _IC_RET_WRITE_ERR
    
    ;}
    返回 Gauge _IC_RET_OK;
    }
    

    结果如下:我们可以看到、两次读取的结果是不同的。

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

    您好 Howard、

    我是使用 bqstudio 讨论客户的。 在中、您可以选择在与高级通信选项卡上的监测计通信时从寄存器选项卡扫描寄存器。 对寄存器的任何扫描都将更改制造商访问寄存器中的数据、因此会覆盖高级通信选项卡中的命令。 这就是我的意思。

    请勿使用通信使 i2c 总线过载。 您可以以1Hz 的频率读取它。 这是避免通信错误的一种方法。

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

    IIC 频率为33kHz、读取间隔已超过1秒。

    当他们读取电压/温度等数据时、结果始终正确。

    但当他们读取 DeviceName/ManufacturerName 时、结果不稳定。

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

    我在 bqstudio 中尝试过这种方法、但无法重现故障。 这里的结果始终一致。 如果他们正在读取 i2c 总线上的其他寄存器、然后读取制造商访问权限、则最后一条命令将覆盖该寄存器。