简介
本次项目是通过STC8H1K08单片机的I2C接口,读取bq4050寄存器,从而获取电量信息,在188数码管上显示电量。
坑点
- bq4050的FUSE(25)引脚,如果没用到需要“接地”,不然输出会一直处于被保护状态(关闭)。
SMBUS与I2C仅仅是通信速率不一样,所以单片机与bq4050通信,最好用模拟i2c,灵活的调节“”,这个延时很重要!就是代码里面的延时函数!!很多时候读不出数据,就是因为延时做的不好。延时- 第二条划掉了,因为模拟i2c的延时函数很不准,连续多个数据的时候就会出现只读第一个字节的问题!!所以最好用硬件i2c!!硬件i2c只需把速度调低即可!
- STC8H1K08与bq4050的通信接口硬件上,有无上拉都可以,但必须先把SDA和SCL引脚,配置成标准io模式
参考代码
读0x00-0x17的内容(电量之类)
直接读一个字(2个字节)
//电量
I2C_ReadNbyte(BQ4050_ADDRRESS,0x0d, I2C_Buffer, 2);
读区块指令(充电状态,各种标志位,例如0x56)
第一个字节是长度,根据第一个字节来获取后面区块的内容
I2C_ReadNbyte(BQ4050_ADDRRESS,0x56, I2C_Buffer, 1);
len = I2C_Buffer[0];
I2C_ReadNbyte(BQ4050_ADDRRESS,0x56, I2C_Buffer, len);
读0x71,0x72的内容(电池电压电流,温度传感之类)
先写后读,下面参考(注意0x44命令)
// bq4050通过ManufacturerBlockAccess()读取寄存器数据
uint8_t BQ4050_MAC_Read(uint8_t cmd, uint8_t *dat, uint8_t dat_len)
{
if (dat_len > 64)
return 1;
memset(dat, 0, dat_len);
uint8_t cmd_list[2] = {cmd, 0x00};
if (I2C_WriteNbyte(BQ4050_ADDRRESS, 0x44, cmd_list, 2))
return 2;
if (I2C_ReadNbyte(BQ4050_ADDRRESS, 0x44, dat, dat_len))
return 3;
return 0;
}
// 这里是读MAC中DAStatus1寄存器内容,包含单节电池电压、电流等信息,详见说明书
status = BQ4050_MAC_Read(0x71, data, 32);
// 读DAStatus2内容,包含温度传感器信息
status = BQ4050_MAC_Read(0x72, data, 14);