MCU使用stm32f103VET6,采用IO模拟时序匹配BQ4050的SMBus接口,读取BQ4050的寄存器数据。此处的IO模拟时序匹配SMBus接口,可用到TI公司的其它BQ芯片、SMBus接口。工程代码及调试资料,见文件夹:stm32f103ze_uart1234_3.5.0_34
SMBus说明:
BQ4050与单片机的通讯是SMBus,SMBus与I2C只是在速率上有些许区别。I2C的通迅速率:标准:100kHz,快速:400kHz。SMBus的速率只在10kHz~100kHz之间。stm32把硬件I2C设计得很复杂,通常用模拟I2C来进行通讯,据说模拟I2C的稳定性要比硬件I2C更高。模拟I2C可以由普通的IO口进行模拟,可以很自由的选择通讯的时钟线SCL和数据线SDA了。
注意:调试过程中一定要看BQ4050的数据手册和用户手册,尤其是SMBus时间要求。
工程代码说明:
1 硬件连接
Stm32f103zet6精鹰板。
Uart1接PC用于调试。
BQ4050:PB0接SCL/SMBC,PB1接SDA/SMBD。
2 编程
While循环中使用下面函数获取bq4050寄存器数据。
读取bq4050某寄存器数据过程:起始信号代表通讯开始——>发送BQ4050的器件地址,默认是0x16——>等待应答——>发送命令——>等待应答——>发送器件地址+1(+1表示读,+0表示写)——>等待应答信号——>读取数据——>发送应答信号——>再次读取数据——>发送非应答信号。
BQ4050发送的数据是16bit的,第一次发送数据的低8位,第二次发送数据的高8位。我们将这两个数据拼接起来就是一个16bit的数据,注意电流有可能是负数,正数代表充电,负数代表放电。
可在while循环中,使用该函数读rtubms报文需要的所有数据,并print显示。开尔文和摄氏温度转换:C=K-273.1。
2.1 延迟函数
延时函数在delay.c文件中。在不使用额外定时器的情况下,利用SysTick(滴答定时器)产生的微妙级延时。
2.2 SMBus通信的几个功能函数
在bms.c文件中。
1) 接口设置
PB0接SCL/SMBC,PB1接SDA/SMBD。
2) 起始和停止
void IIC_Start(void)
void IIC_Stop(void)
3) 应答相关
uint8_t IIC_Wait_Ack(void)
4) 发送和读取1byte数据
3 程序运行结构
详情见文件“读SMBus总线数据--串口助手显示.docx”。在858次循环读BMS数据过程中,出现了77次fail1情况,出现了29次fail2情况,出现了0次fail3情况。判断到fail后,再次读取该寄存器数据,以此来消除读取失败。
4 bms软件
TI提供 Battery Management Studio软件,连接好EV2300进行数据读写。
程序运行得到的各个寄存器数据,与bms软件得到的相关数据一致。