工具/软件:
我尝试使用基于软件的 I2C 仿真来与 bq27427 电量监测计通信、包括初始参数配置和读取剩余电池电量百分比 (SOC)、但我无法成功读取数据。 当连续读取寄存器 0x1C 并显示其时 低 8 位 、值在之间交替 0 和 255 。 您能提供一些相关的参考代码吗? 我真的很感激。
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.
您好:
我可以提供以下关于电量监测计通信的文档: https://www.ti.com/lit/an/slua801/slua801.pdf
此致、
Adrian
非常感谢您的帮助。 我使用逻辑分析仪观察到了 I2C 波形、发现从器件地址 (0x55) 响应正确、但寄存器地址(例如 0x00、0x1C)未得到确认、从而产生 NACK。 这会阻止成功读取或写入。 我想问一下、假设没有硬件问题、可能的原因是什么? (随附了读/写程序和逻辑分析仪的屏幕截图。 SDA 配置为开漏模式、 SCL 配置为推挽模式。)
#define BQ27427_ADDR_W 0xAA
#define BQ27427_ADDR_R 0xAB
#define CMD_CONTROL 0x00
#define CMD_STATE_OF_CHARGE 0x1C
void BQ27427_SendControl (uint16_t cmd){
I2C_Start ();
I2C_Write (BQ27427_ADDR_W);
I2C_I2C Wait_Ack ();
I2C_Write (CMD_CONTROL);
I2C_I2C Wait_Ack ();
I2C_Write (cmd 和 0xFF);
I2C_I2C Wait_Ack ();
I2C_Write ((cmd >> 8) 和 0xFF);
I2C_I2C Wait_Ack ();
I2C_Stop ();
}
uint8_t BQ27427_read (uint8_t reg){
uint8_t receive=0;
I2C_Start ();
I2C_Write (BQ27427_ADDR_W);
RECEIVE=I2C_RECE() Wait_Ack;
I2C_Write (reg);
RECEIVE=I2C_RECE() Wait_Ack;
I2C_Start ();
I2C_Write (BQ27427_ADDR_R);
RECEIVE=I2C_RECE() Wait_Ack;
RECEIVE = I2C_READ (0);
I2C_Stop ();
返回接收;
}
void BQ27427_Send (uint8_t reg、uint8_t cmd){
I2C_Start ();
I2C_Write (BQ27427_ADDR_W);
I2C_I2C Wait_Ack ();
I2C_Write (reg);
I2C_I2C Wait_Ack ();
I2C_Write (cmd);
I2C_I2C Wait_Ack ();
I2C_Stop ();
}
uint16_t BQ27427_Read16 (uint8_t reg){
uint16_t s=0;
I2C_Start ();
I2C_Write (BQ27427_ADDR_W);
S=I2C_I2C Wait_Ack ();
I2C_Write (reg);
S=I2C_I2C Wait_Ack ();
I2C_Start ();
I2C_Write (BQ27427_ADDR_R);
S=I2C_I2C Wait_Ack ();
uint16_t 为低电平、高电平;
低电平= I2C_READ (1);
高电平= I2C_READ (0);
S=(高电平<<8)|低电平;
I2C_Stop ();
返回 s;
}
uint16_t BQ27427_ReadSOC (void){
返回 BQ27427_Read16 (CMD_STATE_OF_CHARGE);
}

我想与您确认的另一个问题是:我在数据表中看到 BQ27427 的 VDD 引脚被描述为 PO 端口。 那么、VDD 引脚是否仍需要连接到电路板的 VDD 或 VCC? 如果 BAT 引脚连接到电池、但 VDD 未 连接到电路板的 VCC 或 VDD、则该芯片是否仍可以正常工作?
存在该电容器。 目前、VDD 和 VSS 之间有一个 2.2μF 电容器。 VDD 引脚正确输出 1.8V 电压。 SDA 和 SCL 都具有连接到电路板 VDD 的 10kΩ 上拉电阻器。 除了 BAT 和 VSS 之间所需的缺失 1μF 电容器外、所有其他元件都根据数据表中的参考设计进行连接–这不应该是一个大问题。
我需要理解的是: 假设没有硬件问题、什么可能导致寄存器无响应?
我目前的观察:
在读取/写入操作期间:
正确识别和确认写入地址 (0x55);
但当写入 任何 寄存器地址(甚至是 0x00)时、 I2C_WAIT_ack () 返回 NACK .(Please take a look at the I2C waveform diagram I provided above.)
这会导致随机数据读取(例如,读取寄存器 0x1C 有时返回 255、99、0 等)。 由于 所有寄存器均 未响应、因此读取的值 始终相同且无效。