主题中讨论的其他器件: MSP430F5659、 BQ2416
工具/软件:Code Composer Studio
我正在使用 BQ24160电池充电器为3.7锂聚合物电池充电、但看不到它达到控制/电池电压寄存器(03)中设置的全电压。 我使用 I2C 总线将该值设置为3.8V、然后每秒将看门狗计时器复位设置为状态/控制寄存器。 电池充电至默认的3.6V、但随后停止充电。
我可以使用 CV/CC 电源手动将电池充电至4.0V、而不会出现任何问题。
我将向从地址0x6B 发送一个寄存器字节和一个数据字节。 我已经用 示波器查看了 BQ24160的 I2C 命令、它们看起来是正确的、BQ24160 ACK 所有命令。
我安装了由 BGATE 控制的外部 FET。 SYS 电压为3.9V、BAT 电压通常约为3.58V~3.68V。
希望有人能够深入了解问题所在。 我不确定当电池电压低于稳压电压时应发生什么情况。 我假设电池充电器尝试维持3.8V。
下面是我 在 MSP430F5659上使用的代码:
unsigned int BQ2416_RESET[] ={0x02、0x80}; //控制寄存器>将所有寄存器重置为默认值
unsigned int BQ2416_defaults[]={0x02、0x0D}; //控制寄存器>进入高阻态模式、默认值
unsigned int BQ2416_CURRENT[] ={0x02、0x2C}; //控制寄存器>保持高阻态模式、500mA 电流限制
unsigned int BQ2416_VOLT[] ={0x03、0x3C}; //电池电压寄存器>充电电压= 3.8V
// I2C 写入电池充电器
void I2C_write (int byteCount、unsigned int * data)
{
B1_Tx_Data =数据; // TX 数据数组地址
B1_ByteCtr =字节计数; //加载 TX 字节计数器
UCB1IE |= UCTXIE; //启用 TX 中断
UCB1CTL1 |= UCTR | UCTXSTT; // I2C TX,启动条件
_delay_cycles (1500); //允许传输完成
while (UCB1STAT 和 UCBBUSY); //等待传输完成
}
//电池初始化
空 initBattery (空)
{
P8DIR |= BIT5 | BIT6; // P8.5到 UCB1SDA 和
P8SEL |= BIT5 | BIT6; // P8.6至 UCB.S.
UCB1CTL1 |= UCSWRST; //启用 SW 复位
UCB1CTL0 = UCMST | UCMODE_3 | UCSYNC; // I2C 主器件、同步模式
UCB1CTL1 = UCSSEL_2 | UCSWRST; //使用 SMCLK、保持软件复位
UCB1BR0 = 40; // fSCL = SMCLK/40 =~100kHz
UCB1BR1 = 0; //字的高字节
UCB1I2CSA = 0x6B; // BQ24160从地址为6Bh
UCB1CTL1 &=~UCSWRST; //清除 SW 复位,恢复运行
UCB1IE |= UCNACKIE | UCTXIE; //启用 TX 中断、NACK 中断
UCB1IFG &=~UCTXIFG; //清除 USCI_B1 TX 中断标志
//控制寄存器>将所有寄存器重置为默认值(0x02、0x80)
I2C_WRITE (2、BQ2416_RESET); // I2C 将数据写入寄存器
//控制寄存器>进入高阻态模式、默认值(0x02、0x0D)
I2C_WRITE (2、BQ2416_DEFAULTS); // I2C 将数据写入寄存器
//控制寄存器>离开高阻态模式、500mA 电流限制(0x02、0x2C)
I2C_WRITE (2、BQ2416_Current); // I2C 将数据写入寄存器
//电池电压寄存器>充电电压= 3.8V (0x03、0x3C)
I2C_WRITE (2、BQ2416_VOLTAGE); // I2C 将数据写入寄存器
}
#pragma vector = USCI_B1_Vector
_interrupt void USCI_B1_ISR (void)
{
switch (__evo_in_range (UCB1IV、12))
{
情况 0:中断; //向量 0:无中断
情况 2:中断; //向量 2:ALIFG
情况 4:中断; //向量 4:NACKIFG
情况 6:中断; //向量 6:STTIFG
情况 8:中断; //向量 8:STPIFG
情况10: //向量10:RXIFG
if (UCB1STAT 和 UCNACKIFG) //如果从器件发送 NACK 则发送 STOP
{
UCB1CTL1 |= UCTXSTP;
UCB1STAT &=~UCNACKIFG;
}
中断;
情况12: //向量12:TXIFG
if (B1_ByteCtr) //检查 TX 字节计数器
{
UCB1TXBUF =* B1_Tx_Data++; //加载 TX 缓冲区
B1_ByteCtr -; //减量 TX 字节计数器
}
其他
{
UCB1CTL1 |= UCTXSTP; // I2C 停止条件
UCB1IFG &=~UCTXIFG; //清除 USCI_B1 TX 内部标志
}
默认值:break;
}
}