在中、是否可以轻松地将最小放电电压配置为3300mV、而无需对器件中的太多不同寄存器进行编程?
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.
在中、是否可以轻松地将最小放电电压配置为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 ();)不能正常工作。
请参阅
… 但是、我产生了一个新问题:
我现在可以在开始时读取任何参数,但使用完全相同的方法读取数字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秒 但我不确定是否需要。
这两个块单独工作、但不按顺序工作。 我需要复位还是执行任何操作?