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.

[参考译文] BQ40Z50-R3-DEVICE-FW:从 SMBus 库中读取块命令不能如技术参考中所述工作

Guru**** 2382630 points
Other Parts Discussed in Thread: BQ40Z50-R2, MSP430FR5949
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/850447/bq40z50-r3-device-fw-read-block-command-from-smbus-library-does-not-work-as-described-in-technical-reference

器件型号:BQ40Z50-R3-DEVICE-FW

使用 BQ40z50-R3并通过 MSP430至 SMBus 对其进行控制、系统会要求开发人员使用块读取/块写入命令来访问制造商。 我将 MSP430FR5949用作单主器件、同时关闭了 bq40z50-R2从器件(运行 R3固件)的广播。

如果不修改 smbus_NWk.c、这对于少数命令是不可能的。 SMBus_NWk.c/SMBus_NWK_masterProcessRx (SMBus * smbus、uint8_t data)对返回的第一个字节进行检查、在 BQ40z50-R3中、第一个字节是字节计数。

目前、根据 SMBus 标准、限制为32个字节、但对于 ManufacturerBlockAccess 0x44 0x0071 (DAStatus_1)、PEC 的字节计数将始终为34或更高、这会导致检查失败并返回错误。

任何地方都没有这方面的文档(至少我可以找到)。 这种差异至少应该在 bq40z50-R3技术手册中得到解决、因为这会使您相信从 Man.blockAccess 读取数据的正确方法是执行此过程来读取 DAStatus1 0x0071 (例如)

块写入0x44 (0x71、0x00)

块读取0x44。

但是、实际上、尽管寄存器本身仅包含32字节的数据、但第一个字节返回34、其中包括数据和2字节地址。

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

    你(们)好、John

       监测计可返回32个以上的字节进行块读取。

       对于 MAC 0x0071的读取块操作、I2C 事务序列如下:

       主机发送:0x44 (用于 MAC 写入) 0x02 (以下字节的数量) 0x71、0x00 (2字节 MAC 命令)

       主机发送: 0x44 (用于 MAC 读取)

       监测计返回:0x22 (包括0x71、0x00在内的字节数返回)、0x71、0x00 (MAC 命令)、……(作为 MAC 块数据返回的32字节数据)、PEC (可选)

       您可以使用 I2C 协议命令来执行上述命令序列。

       例如、读取监测计发回的数据。

       首先、您可以启动预期数据长度为1的块读取、然后您将能够获得第一个字节、即数据长度为0x22、 然后、在不发送 MAC WRITE 命令的情况 下、您可以在预期的回读数据长度为0x22 + 2的情况下再次执行块读取、以包括第一个数据长度字节和最后一个 PEC 字节、这是可选的。

      我在 PC 上使用 Aardvark I2C 主机适配器时尝试了这种方法、它可以正常工作。 我认为它也应该在 MCU 上工作、因为大多数 MCU 通常支持 I2C 引擎

     

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

    我理解您所说的内容、但这是一个我花了几个小时尝试解决的问题、最终解决了。 这是常规调用(正如我提到过的、使用 TI 提供的 SMBus 库)  

    SMBus.SMBus_masterReadBlock ()-> smbus_NWk.SMBus_NWK_startTxTransfer ()-> smbus_phy.SMBus_PHY_masterStartTx ()-> smbus_phy.SMBus_PHY_ProcessInt ()(UCTXIFG0设置为发送0x44 SMB_PHY_USTERStartTx)-> SMBus_ProcessInbist_MasterProcessInt (SMBus_Bus_ProcessInbist_ProcessInbist_ProcessInt)(设置为 SMBus_ProcessInbstit_ProcessInbist_ProcessIn  

    从器件接收命令并将数据的第一个字节返回到主器件(UCRXIFG0现已置位)--> smbus_phy.SMBus_PHY_MASTERProcessInt ()-->

    SMBus_NWk.SMBus_NWK_masterProcessRx (SMBus * smbus、uint8_t 数据)(这是生成错误的位置)

    此时,Nwk.rxIndex = 0,Nwk.rxLen = 3 (在 smbus.SMBus_masterReadBlock ()中默认设置为3),第一个字节(0x20)= data

    来自 smbus_NWk.SMBus_NWK_masterProcessRx (SMBus * smbus、uint8_t 数据)

    if ((smbus->NWk.rxIndex =0)&&
    (SMBus->NWK.Estate == SMBus_NWKState_RX_Block)
    {
    //根据接收到的字节计数更新长度
    if ((data ==0)||(data >32)) 
    { SMBus_PHY_masterSendStop (smbus); SMBus->status.bits.packErr= 1; SMBus->NWK.ACADK = SMBus_NWKState_Error; SMBus->state = SMBus_State_DataSizeError; return (smbus->state); } 其他 { SMBus->NWk.rxLen = DATA + 1;//由于字节计数 #ifdef SMB_PEC_SUPPORTED、因此额外增加了一个字节 if (smbus->ctrl.bits.pecEn = 1) { SMBus->NWk.rxLen++; } #endif }

    您可以看到、由于返回的数据的第一个字节为0x20 = 34、因此除非将接收到的字节计数数据减去2等于32或将 if ((data = 0)||(data > 32))修改为、否则该检查将始终抛出错误  

    if ((data = 0)||(data > 34) )或对接收到的块的实际 byte_count 进行更通用的检查

    我相信、熟悉 SMBus 的人肯定知道这样的东西、或者库不会被使用、只是作为参考、 从简单地阅读技术参考及其对流程的描述、像我这样的不是流程专家的人都会留下这样的印象、即只需使用提供的库和 masterWriteBlock/ masterReadBlock 函数即可获得预期的结果。 至少在我的例子中、它没有。

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

    你(们)好、John

       我的理解是、您已经通过修改 TI 提供的库中的代码来解决了这个问题。

        我认为该库可能不适合与 TI 电量监测计进行通信、因为目前 TI 电量监测计可以在返回的块长度超过32时对块读取作出响应。

       但我 同意、有关用于块读取的命令和数据格式的说明可能有助于用户开发 SMBus 操作的代码。