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.

[参考译文] BQ27220:放电电压配置

Guru**** 2502205 points


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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/730944/bq27220-configuration-of-discharge-voltage

器件型号:BQ27220

在中、是否可以轻松地将最小放电电压配置为3300mV、而无需对器件中的太多不同寄存器进行编程?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您需要将 SysDown Set Volt Threshold 参数配置为3300mV。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    我们是否同意我必须发送到器件的内容是:

    W aa 00 90 00 #CFG_UPDATE
    W aa 3e 40 92 E4 0C # SysDown 设置电压阈值= 3300 = 0x0CE4
    W aa 60 3D 06 # 0x40 + 0x92 + 0xE4 + 0x0C = 0x01C2。 0x01C2或0x00FF = 0xC2。 CS = 0xFF - 0xC2 = 0x3D;2字节地址、2字节数据、1字节校验和、1字节长度= 6
    w aa 00 92 00 #EXIT_CFG_UPDATE

    提前感谢!

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

    与此相关的另一个问题是、是否不能直接寻址"SysDown Set Volt Threshold" 0x9240并读取此处的值?

    如果我的地址0x9240 (见下面)、并读出这里的值、我会得到  

    W aa 40 92 r xx xx #写入地址和读取2字节(写入和读取过程)

    之后 XX xx = 0x0216 (534)、这不符合数据表(3150mV = 0x0C4E)  

    但是:没有提供标准命令(0x00 - 0x7F)、因为这里不提供参数。 是否有通用读取/写入?

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

    无法直接读取数据存储器。 监测计使用间接寻址。 您必须首先将数据存储器地址(小端字节序)写入 I2C 寄存器0x3E/0x3F、然后通过 I2C 寄存器0x40++访问数据

    因此、如果要读取 SysDown Set Volt Threshold 0x9240、必须首先将0x40 0x92写入0x3E/0x3F、然后才能从0x40++读取参数数据:

    示例:

    w aa 3e 40 92 //这将选择数据存储器地址0x9240

    R aa 40 2 //这将从0x40++读取两个字节

    -->结果= 0x0C 0x4E (请注意参数存储在大端字节序中)= 0x0C4E = 3150

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

    我现在尝试了两种不同的方法…
    I2C 速度@ 400kbit

    /*代码#1 */
    i2cTxBuf[0]= 0x3E;
    i2ctxBuf[1]= 0x40;
    i2ctxBuf[2]= 0x92;
    i2ctxBuf[3]= 0x40;
    i2cTxBuf[4]= 0x02;
    battery_I2cWriteAndRead (i2cTxBuf、5、i2cRxBuf、2);

    /*从 Saleae 转储*/
    时间[s]、数据包 ID、地址、数据、读取/写入、ACK/NAK
    0.000023870000.0、0xAA、0x3E、写入、ACK
    0.000155330000.0、0xAA、0x40、写入、ACK
    0.000334830000000、0、0xAA、0x92、写入、ACK
    0.000547980000.0、0xAA、0x40、写入、ACK
    0.001211420000000、0、0xAA、0x02、写入、ACK
    0.0019230000000.1、0xAB、0x02、读取、ACK
    0.002123590000000.1、0xAB、0x0C、读取、NAK

    /*代码#2 */
    i2cTxBuf[0]= 0x3E;
    i2ctxBuf[1]= 0x40;
    i2ctxBuf[2]= 0x92;
    battery_I2cWrite (i2cTxBuf、3);
    BATTERY_DELAY (5);
    i2ctxBuf[0]= 0x40;
    i2cTxBuf[1]= 0x02;
    battery_I2cWriteAndRead (i2cTxBuf、2、i2cRxBuf、2);

    /*从 Saleae 转储*/
    时间[s]、数据包 ID、地址、数据、读取/写入、ACK/NAK
    0.000023840000000、0、0xAA、0x3E、写入、ACK
    0.000155250000.0、0xAA、0x40、写入、ACK
    0.000334700000000、0、0xAA、0x92、写入、ACK
    0.005636960000000.1、0xAA、0x40、写入、ACK
    0.005768280000000.1、0xAA、0x02、写入、ACK
    0.006431570000.2、0xAB、0x4E、读取、ACK
    0.006635990000.2、0xAB、0x02、读取、NAK

    在这两种情况下、我都不读取0x0C4E。
    到目前为止、我已经尝试了:
    ——以上部分纯粹是
    -设备解封命令后的上述部件
    -在器件解封和完全访问命令之后的上述器件

    这三个都具有相同的两个结果(0x020C 或0x4E02)。

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

    我现在尝试了两种不同的方法…
    I2C 速度@ 400kbit

    /*代码#1 */
    i2cTxBuf[0]= 0x3E;
    i2ctxBuf[1]= 0x40;
    i2ctxBuf[2]= 0x92;
    i2ctxBuf[3]= 0x40;
    i2cTxBuf[4]= 0x02;
    battery_I2cWriteAndRead (i2cTxBuf、5、i2cRxBuf、2);

    /*从 Saleae 转储*/
    时间[s]、数据包 ID、地址、数据、读取/写入、ACK/NAK
    0.000023870000.0、0xAA、0x3E、写入、ACK
    0.000155330000.0、0xAA、0x40、写入、ACK
    0.000334830000000、0、0xAA、0x92、写入、ACK
    0.000547980000.0、0xAA、0x40、写入、ACK
    0.001211420000000、0、0xAA、0x02、写入、ACK
    0.0019230000000.1、0xAB、0x02、读取、ACK
    0.002123590000000.1、0xAB、0x0C、读取、NAK

    /*代码#2 */
    i2cTxBuf[0]= 0x3E;
    i2ctxBuf[1]= 0x40;
    i2ctxBuf[2]= 0x92;
    battery_I2cWrite (i2cTxBuf、3);
    BATTERY_DELAY (5);
    i2ctxBuf[0]= 0x40;
    i2cTxBuf[1]= 0x02;
    battery_I2cWriteAndRead (i2cTxBuf、2、i2cRxBuf、2);

    /*从 Saleae 转储*/
    时间[s]、数据包 ID、地址、数据、读取/写入、ACK/NAK
    0.000023840000000、0、0xAA、0x3E、写入、ACK
    0.000155250000.0、0xAA、0x40、写入、ACK
    0.000334700000000、0、0xAA、0x92、写入、ACK
    0.005636960000000.1、0xAA、0x40、写入、ACK
    0.005768280000000.1、0xAA、0x02、写入、ACK
    0.006431570000.2、0xAB、0x4E、读取、ACK
    0.006635990000.2、0xAB、0x02、读取、NAK

    在这两种情况下、我都不读取0x0C4E。
    到目前为止、我已经尝试了:
    ——以上部分纯粹是
    -设备解封命令后的上述部件
    -在器件解封和完全访问命令之后的上述器件

    这三个都具有相同的两个结果(0x020C 或0x4E02)。

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

    您的 I2C 读取实现方式似乎不正确。 Salae 日志显示您写入"命令"(0x3E)、然后是数据(0x40、0x92)。 到目前为止都很好。 但随后您继续写入"data"(0x40、0x02)。 这不是正确的顺序。

    正确的顺序为:

    起始位、0xAA、ACK、0x3E、ACK、 0x40、ACK、0x92、ACK、停止位//这选择数据存储器地址0x9240

    起始位、0xAA、ACK、0x40、ACK、 重复 START、0xAB、ACK、 、ACK、 、NACK、停止位//这将从0x9240读取两个字节

    这是一个标准 I2C 读取/写入序列。 它看起来您的 API (Battery I2cWriteAndRead ();)不能正常工作。  

    请参阅  

    数据表中的7.3.1.1 ( )

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢、这正是我让系统读取参数所需的。 实际上 Battery I2cWriteAndRead 工作正常、但调用需要拆分以添加额外的地址字节...

    i2cBuf[0]= 0x3E;
    i2cBuf[1]=(u16Address >> 8)& 0xFF;
    i2cBuf[2]=(u16Address >> 0)& 0xFF;
    battery_I2cWrite (i2cBuf、3);

    i2cBuf[0]= u16寄存器;
    battery_I2cWriteAndRead (i2cBuf、1、outData、2);

    在 outData 中是请求的2个字节。

    不过、写入过程似乎按预期工作、因为写入后、下一个读取过程将显示写入的数据。

    非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    现已解决并修复!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    … 但是、我产生了一个新问题:
    我现在可以在开始时读取任何参数,但使用完全相同的方法读取数字2会产生与先前请求相同的值。

    时间[s]、分析器名称、解码协议结果
    0.00000000000000000000、I2C、Setup 写入[0xAA]+ ACK      <--解开密封
    0.000023900000000、I2C、0x00 + ACK
    0.000155500000000、I2C、0x14 + ACK
    0.000333100000000、I2C、0x04 + ACK
    0.0056623400000000、I2C、Setup 写入[0xAA]+ ACK
    0.005647200000000、I2C、0x00 + ACK
    0.005778900000000、I2C、0x72 + ACK
    0.005956300000000、I2C、0x36 + ACK
    0.020014500000000、I2C、Setup 写入[0xAA]+ ACK      完全访问
    0.020038400000000、I2C、0x00 + ACK
    0.020169900000000、I2C、0xFF + ACK
    0.020347500000000、I2C、0xFF + ACK
    0.025631100000000、I2C、Setup 写入[0xAA]+ ACK
    0.025655000000000、I2C、0x00 + ACK
    0.025786700000000、I2C、0xFF + ACK
    0.025964300000000、I2C、0xFF + ACK
    0.049614600000000、I2C、Setup 写入[0xAA]+ ACK      读数据
    0.049638400000000、I2C、0x3E + ACK
    0.04977000000、I2C、0x9F + ACK <-设计容量
    0.049947600000000、I2C、0x92 + ACK
    0.059586600000000、I2C、Setup 写入[0xAA]+ ACK
    0.059610500000000、I2C、0x40 + ACK
    0.059745000000000、I2C、Setup 读取至[0xAB]+ ACK
    0.060503300000000、I2C、0x07 + ACK <- 0758 = 1880mA 正确
    0.060706800000000、I2C、0x58 + NAK
    0.069584900000000、I2C、Setup 写入[0xAA]+ ACK      <--密封
    0.069608700000000、I2C、0x00 + ACK
    0.069740300000000、I2C、0x30 + ACK
    0.069917900000000、I2C、0x00 + ACK

    2.289479400000000、I2C、设置写入[0xAA]+ ACK
    2.289503300000000、I2C、0x00 + ACK
    2.289634900000000、I2C、0x14 + ACK
    2.289812500000000、I2C、0x04 + ACK
    2.295076100000000、I2C、设置写入[0xAA]+ ACK
    2.295099900000000、I2C、0x00 + ACK
    2.295231500000000、I2C、0x72 + ACK
    2.295409200000000、I2C、0x36 + ACK
    2.309459300000000、I2C、设置写入[0xAA]+ ACK
    2.309483100000000、I2C、0x00 + ACK
    2.309614700000000、I2C、0xFF + ACK
    2.309791700000000、I2C、0xFF + ACK
    2.315051500000000、I2C、Setup 写入[0xAA]+ ACK
    2.315075400000000、I2C、0x00 + ACK
    2.315207000000000、I2C、0xFF + ACK
    2.315384600000000、I2C、0xFF + ACK
    2.339449400000000、I2C、设置写入[0xAA]+ ACK
    2.339473200000000、I2C、0x3E + ACK
    2.339604800000000、I2C、0x40 + ACK <-- SysDown 设置电压阈值
    2.339782400000000、I2C、0x92 + ACK
    2.349457900000000、I2C、设置写入[0xAA]+ ACK
    2.349481800000000、I2C、0x40 + ACK
    2.349616600000000、I2C、Setup 读取到[0xAB]+ ACK
    2.350229500000000、I2C、0x07 + ACK <-值与设计容量相同-应该是0x0D16
    2.350433000000000、I2C、0x58 + NAK
    2.359449400000000、I2C、设置写入[0xAA]+ ACK
    2.359473200000000、I2C、0x00 + ACK
    2.359604800000000、I2C、0x30 + ACK
    2.359782500000000、I2C、0x00 + ACK

    您可能从转储中注意到、则延迟为2秒 但我不确定是否需要。
    这两个块单独工作、但不按顺序工作。 我需要复位还是执行任何操作?

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

    无需复位。 序列看起来正确。 您是否继续为每个读取序列发送 unsequence / Full access 命令? 如果是这样、我将把这个值改为只一次(如果需要的话)、然后在继续之前检查 OperationStatus(操作状态)中的 SEC1/SEC0位。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尽管在过去2天里一直保持沉默,但我并没有坐在我的手上。 密封-解封过程似乎需要一些时间来执行、如果它彼此之间多次执行、甚至可能需要更长的时间、直到操作状态寄存器中的位被置位。
    现在、我已经使系统读取和写入请求的参数、跳过一些早期的解封和密封过程。 此处花费的时间是修改处理该进程的状态机。

    感谢你的帮助