STC8H1K08与bq4050通信调试记录

简介

本次项目是通过STC8H1K08单片机的I2C接口,读取bq4050寄存器,从而获取电量信息,在188数码管上显示电量。

坑点

  1. bq4050的FUSE(25)引脚,如果没用到需要“接地”,不然输出会一直处于被保护状态(关闭)。
  2. SMBUS与I2C仅仅是通信速率不一样,所以单片机与bq4050通信,最好用模拟i2c,灵活的调节“延时”,这个延时很重要!就是代码里面的延时函数!!很多时候读不出数据,就是因为延时做的不好。
  3. 第二条划掉了,因为模拟i2c的延时函数很不准,连续多个数据的时候就会出现只读第一个字节的问题!!所以最好用硬件i2c!!硬件i2c只需把速度调低即可!image.png
  4. STC8H1K08与bq4050的通信接口硬件上,有无上拉都可以,但必须先把SDA和SCL引脚,配置成标准io模式image.png

参考代码

读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);
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值