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.

[参考译文] BQ79616-Q1:无法设置菊花链通信

Guru**** 2604225 points
Other Parts Discussed in Thread: BQ79616

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1229166/bq79616-q1-not-being-able-to-set-up-daisy-chain-communication

器件型号:BQ79616-Q1
主题中讨论的其他器件:BQ79616

我们已通过 bq79616和 bq79656设置定制 PCB、并尝试与 MCU 的 UART 进行通信。 已成功使用单个平衡器 IC 进行通信。 我们已在 PCB 和 EVM 上检查 CVDD 相同。

两个 IC 单独使用以与 MCU 通信、这是通过 UART 成功实现的。 但菊花链通信无法建立。 我们为此放弃了3-4天。 但是、相同的代码无法与单芯片 EVM 或定制 PCB 进行通信。 菊花链同步,即读取 OTP_ECC_DATAIN1数据字节,我们在 UART 上什么也不接收。 只是同一段代码适用于单个 IC 设置

对于菊花链配对、我们使用了第节下的电容耦合 10.2.1.2.7.1器件连接在同一 PCB 上

我想知道是否有任何故障排除指南来了解错误、是硬件还是固件端 bq796xx 对我们来说是新 IC、我们在 IC 方面没有太多经验。

请告诉我,如果你需要什么从我的末端

@ramchandra.bhosale@igrenenergi.com

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

    您好!

    您是否执行了自动寻址? 请在数据表中获取详细信息、并下载616的 TI 样片代码。 如果您认为自己的代码正确、可以绘制一个简单的方框图吗? 我不太确定您的配置。  

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

    我们有2个 IC、BQ79656和 BQ79616、我们已将 BQ79656连接到 ISO、然后连接到 MCU UART。

    这是方框图、

    以下是代码片段、

    // daisy chain sync start
    BroadcastWrite(OTP_ECC_DATAIN1, 0);
    WaitTx();
    BroadcastWrite(OTP_ECC_DATAIN2, 0);
    WaitTx();
    BroadcastWrite(OTP_ECC_DATAIN3, 0);
    WaitTx();
    BroadcastWrite(OTP_ECC_DATAIN4, 0);
    WaitTx();
    BroadcastWrite(OTP_ECC_DATAIN5, 0);
    WaitTx();
    BroadcastWrite(OTP_ECC_DATAIN6, 0);
    WaitTx();
    BroadcastWrite(OTP_ECC_DATAIN7, 0);
    WaitTx();
    BroadcastWrite(OTP_ECC_DATAIN8, 0);
    WaitTx();
    // auto addressing
    
    BroadcastWrite(CONTROL1, 0x1);
    WaitTx();
    for(i=0;i<BQ_COUNT;i++)
    BroadcastWrite(DIR0_ADDR, i);
    WaitTx();
    BroadcastWrite(COMM_CTRL, 0x2);
    WaitTx();
    SingleWrite(0, COMM_CTRL, 0x0);
    WaitTx();
    SingleWrite(1, COMM_CTRL, 0x3);
    WaitTx();
    // daisy chain sync stop
    BroadcastRead(OTP_ECC_DATAIN1, 1);
    WaitRx();   
    // This is where code hangs as i dont receive anything on UART

    同样的代码适用于 BQ_COUNT 为1以及单个一对一的通信。

    下载1616的 TI 样例代码

    我有 TI 提供的示例代码、而且我们仅构建我们的 API、它可与单个 bq79616/656配合使用、但不能在菊花链上使用、这是我们现在的关注点。

    这是我们用于实现2个 IC 之间菊花链的电路、

    另外关于 TI 的支持、是否有办法根据 IST 时区获取支持? 问题是我必须发布一个查询和回答将在夜间为我们。 这会增加延迟。

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

    您是否已将 RX 连接至 CVDD。对于堆栈器件?

    您可以获取 TI 本地销售团队的支持。 请与他们联系

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否已将 RX 连接到 CVDD.for stack device?

    可以

    我们还向未使用的 COMHx 和 COMLx 对添加了1K 端接电阻器

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

    我在您的代码上没有看到完整的自动寻址过程、您能检查数据表的 表9-19吗? 自动寻址?

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

    // auto addressing
    
    BroadcastWrite(CONTROL1, 0x1);
    WaitTx();
    for(i=0;i<BQ_COUNT;i++)
    BroadcastWrite(DIR0_ADDR, i);
    WaitTx();
    BroadcastWrite(COMM_CTRL, 0x2);
    WaitTx();
    SingleWrite(0, COMM_CTRL, 0x0);
    WaitTx();
    SingleWrite(1, COMM_CTRL, 0x3);
    WaitTx();

    您告诉我这不是自动寻址吗? 这是我从示例代码中挑选的

    读取的 OTP_ECC_DATAIN1不会给出任何响应、因此代码不会向前移动、我已依次读取 OTP_ECC_DATAIN1 - OTP_ECC_DATAIN8

    同一代码适用于单个器件、 BQ_COUNT = 1

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

    不确定复制示例代码的位置、我仅将其复制如下所示

    //*****
    //自动寻址序列
    //*****
    空 AutoAddress()

    //虚拟写入 SNCHRONIZE 所有菊花链器件 DLL (如果在此之前发生器件复位)
    WriteReg (0、OTP_ECC_DATAIN1、0x00、1、FRMWRT_ALL_W);
    WriteReg (0、OTP_ECC_DATAIN2、0x00、1、FRMWRT_ALL_W);
    WriteReg (0、OTP_ECC_DATAIN3、0x00、1、FRMWRT_ALL_W);
    WriteReg (0、OTP_ECC_DATAIN4、0x00、1、FRMWRT_ALL_W);
    WriteReg (0、OTP_ECC_DATAIN5、0x00、1、FRMWRT_ALL_W);
    WriteReg (0、OTP_ECC_DATAIN6、0x00、1、FRMWRT_ALL_W);
    WriteReg (0、OTP_ECC_DATAIN7、0x00、1、FRMWRT_ALL_W);
    WriteReg (0、OTP_ECC_DATAIN8、0x00、1、FRMWRT_ALL_W);

    //启用自动寻址模式
    WriteReg (0、CONTROL1、0x01、1、FRMWRT_ALL_W);

    //为每个板设置地址
    for (currentBoard=0;currentBoard<TOTALBOARDS;currentBoard++)

    WriteReg (0、DIR0_ADDR、电流板、1、FRMWRT_ALL_W);
    }

    WriteReg (0、COMM_CTRL、0x02、1、FRMWRT_ALL_W); //首先将所有内容设置为堆栈设备

    if (TOTALBOARDS=1)//如果只有1个板、则它是栈的底部和顶部、因此应将其更改为这些

    WriteReg (0、COMM_CTRL、0x01、1、FRMWRT_SGL_W);
    }
    else //否则分别设置栈的底部和顶部

    WriteReg (0、COMM_CTRL、0x00、1、FRMWRT_SGL_W);
    WriteReg (TOTALBOARDS-1、COMM_CTRL、0x03、1、FRMWRT_SGL_W);
    }

    //SYNCRHONIZE 具有抛出式读取功能的 DLL
    ReadReg (0、OTP_ECC_DATAIN1、Response_frame2、1、0、 FRMWRT_ALL_R);
    ReadReg (0、OTP_ECC_DATAIN2、Response_frame2、1、0、 FRMWRT_ALL_R);
    ReadReg (0、OTP_ECC_DATAIN3、Response_frame2、1、0、 FRMWRT_ALL_R);
    ReadReg (0、OTP_ECC_DATAIN4、Response_frame2、1、0、 FRMWRT_ALL_R);
    ReadReg (0、OTP_ECC_DATAIN5、Response_frame2、1、0、 FRMWRT_ALL_R);
    ReadReg (0、OTP_ECC_DATAIN6、Response_frame2、1、0、 FRMWRT_ALL_R);
    ReadReg (0、OTP_ECC_DATAIN7、Response_frame2、1、0、 FRMWRT_ALL_R);
    ReadReg (0、OTP_ECC_DATAIN8、Response_frame2、1、0、 FRMWRT_ALL_R);

    /*//可选:回读所有设备地址
    for (currentBoard=0;currentBoard<TOTALBOARDS;currentBoard++)

    ReadReg (currentBoard、DIR0_ADDR、Response_frame2、1、0、 FRMWRT_SGL_R);
    printf ("board %d\n"、response_frame2[4]);
    }*/

    //从启动状态重置所有 COMM 故障条件
    WriteReg (0、FAULT_RST2、0x03、1、FRMWRT_ALL_W);

    返回;
    }
    //********
    //结束自动寻址序列
    //********

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

    代码在此步骤中卡住、因为 BQ IC 没有响应、我们在 DSO 上检查了相同的情况、BQ 的 TX 线上没有活动

    ReadReg (0、OTP_ECC_DATAIN1、Response_frame2、1、0、 FRMWRT_ALL_R);

    同样、同样适用于单个 BQ79xxx

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

    我将邀请我们的软件专家来查看。  

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

    你好、Naik、

    您是否正在发送唤醒提示音命令"ingleWrite (0、control1、0x20)" 以唤醒堆栈器件(即616)、您是否会看到 BQ79616 (器件 ID 1)上的 LED "on"。  

    您是否可以尝试从器件 ID "0"和器件 ID "1"执行单个器件读取、请检查是否获得响应。

    您是否能够使用 逻辑分析仪以及656和616之间的 COMH 和 COML 线路的示波器快照 来捕获 UART 日志、并与我们共享?

    您能否分享您的设置图片。

    谢谢。

    Ravi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否正在发送唤醒提示音命令"ingleWrite (0、control1、0x20)" 来唤醒堆栈器件,即616,您是否在 BQ79616 (器件 ID 1)上看到"ON" LED

    根据唤醒器件时应使用示例代码 Wake79616、我们可以在 AVDD 上看到5.0V。 在关断模式下、AVDD 为0V

    我们未设置 LED、即其定制硬件。 我们有1个616的 EVM 板。

    SingleWrite (0、control1、0x20)

    在菊花链同步和自动寻址之前将接受此命令。 导致我们卡在菊花链读取操作中。

    您可以尝试从设备 ID "0"和设备 ID "1"执行单个设备读取,检查您是否收到响应。

    这同样取决于菊花链同步

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

    应在发送"唤醒 ping 至 BQ79656 "后发送"ingleWrite (0、CONTROL1、0x20)"、此外、在发送此命令后并在执行自动寻址之前、您还应添加1ms 的延迟。 为了真正了解向 BQ 器件发送了哪些命令及其时序、您能否共享通过逻辑分析仪捕获的 UART 日志。

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

    问题没有解决,它有点持续存在。 我们没有逻辑分析仪。

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

    我想我们已经注意到第一个唤醒信号在电源上正确唤醒了 BQ 从器件1和2。 但在此之后,如果我们发送关机提示音,则对 slave2没有影响,但 slave1是 shutdown。 如果我们发送唤醒信号 slave1再次唤醒、但从器件2保持唤醒状态

    在 DSO 上验证关断音宽度为9ms

    使用 DSO 验证唤醒信号2ms

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

    关断音不传播、因此行为是预期行为。  主机必须与相邻器件通信并设置 CONTROL1[SEND_SHUTDOWN]= 1
    或 CONTROL2 [SEND_HW_RESET]= 1来指示相邻器件发出相应的音调、即关闭堆栈2、您必须向堆栈1发送命令。 然后、堆栈1将 HWRESET 音调发送到堆栈2。  

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

    我已经完成了,但我不理解的行为,我必须重新发送两次唤醒,以看到任何数据 从两个从

    Wake796xx();
    
        vTaskDelay(pdMS_TO_TICKS(11 * MAX_BQ796XX_COUNT));
    
    Wake796xx();
    
        vTaskDelay(pdMS_TO_TICKS(11 * MAX_BQ796XX_COUNT));

    唤醒音例程

    void Wake796xx(void) {
    
    	// set GPIO as OUTPUT and pull low
    	// delay should be 2.5ms
    	SET_TX_IO_OUTPUT()
    	;
    
    	DEASSERT_TX_IO(); // Set TX as High
    #if USE_RTOS_DELAY
    	vTaskDelay( pdMS_TO_TICKS(10) )
    #else
    	OSIF_TimeDelay(10);
    #endif
    
    	ASSERT_TX_IO(); // Set TX as LOW
    #if USE_RTOS_DELAY
    	vTaskDelay( pdMS_TO_TICKS(3) )
    #else
    	delayMircoseconds(2700); // WAKE ping = 2.5ms
    #endif
    
    	DEASSERT_TX_IO();   // Set TX as High
    	SET_TX_IO_UART()
    	;
    }

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

    你好、Naik、

    对延迟回复深表歉意。  

    如果您发送的是"Wake796xx();once",BQ79656和 BQ79616都不能被唤醒?

    正常序列如下所示、您是否遵循此序列。

    1) Wake796xx ();//唤醒 BQ79656

    2) delayus(100);

    如果 BQ79656的 COMH 连接到 BQ79616的 COML

    3) 3)"ingleWrite (0、CONTROL1、0x20)" //对 BQ79656进行单次写入以向 BQ79616发送唤醒提示音

    如果 BQ79656的 COML 连接到 BQ79616的 COMH

    3)'ingleWrite (0、control1、0x80)' //对 BQ79656进行单次写入以 将方向更改为反向

    4) delayus(100);

    5)"ingleWrite (0、CONTROL1、0xA0)" //对 BQ79656进行单次写入以反向向向向向向 BQ79616发送唤醒音

    通过上述顺序、您应该会看到 BQ79656和 BQ79616都应该加电、 然后您应该进行自动寻址。

    您能否使用示波器探测 UART 线并测量唤醒 ping、还能探测 COMH 线并查看在发送 "ingleWrite (0、CONTROL1、0x20)"时看到的内容

    谢谢。

    Ravi