基于BQ40Z50芯片的寄存器读写

     前两天项目需要实现以下功能:使用单片机读取电池电量信息,电池管理芯片为TI的BQ40Z50,当时lian连续调试了3天才完成,各种原因无法一一诉说,今天闲来无事总结下,供自己以后查阅。

    单片机使用的STM32F207,使用模拟I2C读取BQ40Z50芯片寄存器。

    单独使用此模拟I2C时序读取AT24C02,光模块均可正常工作,但是读取BQ40Z50就不可以。

   (1)查芯片手册如下

尝试对0x16寄存器的0x44写入0x21 0x00,使用示波器观察发现0x44无应答,然后更改为0x00等均无应答,不知道什么原因;

(2)查SMB时序与I2C时序的不同,发现其速率为10K-100K,不可过低或者过高,更改模拟I2C代码,固定时序为40K左右,发现寄存器地址有应答,但是读取的数值不对一直为0xff;

(3)尝试读取操作0x16 0x0D,得到电池电量,一直没有进展;

(4)使用开发板飞线,用单片机自身i2c CORE生成的时序访问BQ40Z50,发现竟然可以成功读取;

(5)确认为模拟I2C问题,使用示波器抓取波形分析,发现单片机自身I2C波形和模拟I2C波形在写完读时序后的状态不一致,更改模拟I2C波形与自身I2C波形一致后问题解决。

总结:不要随便造时序,因为你不知道其通用性到底如何。

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
首先,需要在代码中包含 HAL 库和 CMSIS 库的头文件。然后,需要初始化 I2C 总线和 BQ40Z50 芯片。 以下是一个使用 HAL 库的示例代码: ``` #include "stm32f1xx_hal.h" #include "cmsis_os.h" I2C_HandleTypeDef hi2c1; #define BQ40Z50_ADDR 0x16 void BQ40Z50_Init(void) { uint8_t tx_data[2]; // Set the BQ40Z50's "Control" register to 0x00 tx_data[0] = 0x00; tx_data[1] = 0x00; HAL_I2C_Master_Transmit(&hi2c1, BQ40Z50_ADDR, tx_data, 2, 1000); // Set the BQ40Z50's "Control" register to 0x01 tx_data[0] = 0x00; tx_data[1] = 0x01; HAL_I2C_Master_Transmit(&hi2c1, BQ40Z50_ADDR, tx_data, 2, 1000); } void BQ40Z50_Read(uint8_t reg_addr, uint8_t *data, uint8_t len) { HAL_I2C_Mem_Read(&hi2c1, BQ40Z50_ADDR, reg_addr, 1, data, len, 1000); } void BQ40Z50_Write(uint8_t reg_addr, uint8_t *data, uint8_t len) { uint8_t tx_data[20]; tx_data[0] = reg_addr; memcpy(&tx_data[1], data, len); HAL_I2C_Master_Transmit(&hi2c1, BQ40Z50_ADDR, tx_data, len+1, 1000); } int main(void) { uint8_t data[20]; // Initialize I2C bus and BQ40Z50 HAL_I2C_Init(&hi2c1); BQ40Z50_Init(); // Read data from BQ40Z50's "Manufacturer Name" register BQ40Z50_Read(0x20, data, 20); // Do something with the data... // Write data to BQ40Z50's "Manufacturer Access" register data[0] = 0x01; data[1] = 0x02; BQ40Z50_Write(0x3E, data, 2); while (1) { // Main program loop } } ``` 在这个示例代码中,我们使用了 `HAL_I2C_Master_Transmit()` 和 `HAL_I2C_Mem_Read()` 函数来进行 I2C 通讯。`BQ40Z50_Init()` 函数用于初始化 BQ40Z50 芯片。`BQ40Z50_Read()` 函数用于从 BQ40Z50 芯片读取数据,`BQ40Z50_Write()` 函数用于向 BQ40Z50 芯片中写入数据。 需要注意的是,以上代码仅供参考。实际使用时,需要根据具体的硬件和软件环境进行相应的修改。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值