#include "main.h"
#include "hal_iic.h"
#include "eg2801.h"
EG2801_RAM EG2801_RAM_DATA =
{
.Flags = 0,
.StateOfCharge = 100,
};
const IIC_PIN EG2801_GPIO =
{
.SCL_PORT = GPIOB,
.SCL_PIN = GPIO_Pin_6,
.SDA_PORT = GPIOB,
.SDA_PIN = GPIO_Pin_7,
.DelayTick = 2,
.ADDR = 0x28
};
/*********************************************
函数名:EG2801_Init
功 能:电池管理器件初始化
形 参:
返回值:
备 注:
作 者:薛建强
时 间:2019/06/28
使 用:
**********************************************/
void EG2801_Init(void)
{
/*赋初值*/
EG2801_RAM_DATA.Flags = 0;
EG2801_RAM_DATA.StateOfCharge = 100;
IIC_Init(&EG2801_GPIO);//IIC初始化
}
/*********************************************
函数名:EG2801_read_DATA
功 能:利用IIC从EG2801读取2个字节
形 参:ACK--1应答 0不应答
返回值:读取到的2个字节
备 注:
作 者:薛建强
时 间:2019/06/28
使 用:
**********************************************/
uint16_t EG2801_read_DATA(uint8_t ACK)
{
uint8_t eg2801_buff[2] = {0};
IIC_ReadByte(&EG2801_GPIO, &eg2801_buff[0]);
IIC_ACK(&EG2801_GPIO);
IIC_ReadByte(&EG2801_GPIO, &eg2801_buff[1]);
if (ACK)
IIC_ACK(&EG2801_GPIO);
else
IIC_NACK(&EG2801_GPIO);
return ((eg2801_buff[1] << 8) | eg2801_buff[0]);
}
/*********************************************
函数名:EG2801_read_Vcc
功 能:读取EG2801数据
形 参:
返回值:
备 注:EG2801_RAM_DATA.StateOfCharge --电池剩余电量百分比
作 者:薛建强
时 间:2019/06/28
使 用:
**********************************************/
uint8_t temp = 0;
void EG2801_read_Vcc(void)
{
/*读取剩余电量*/
IIC_Start(&EG2801_GPIO);
IIC_WriteByte(&EG2801_GPIO, EG2801_GPIO.ADDR); //写命令
IIC_Wait_ACK(&EG2801_GPIO);
IIC_WriteByte(&EG2801_GPIO, 0x55); //命令码
IIC_Wait_ACK(&EG2801_GPIO);
IIC_WriteByte(&EG2801_GPIO, 0x2C); //寄存器地址--电池剩余电量百分比
IIC_Wait_ACK(&EG2801_GPIO);
IIC_Start(&EG2801_GPIO);
IIC_WriteByte(&EG2801_GPIO, EG2801_GPIO.ADDR | 1); //读命令
IIC_Wait_ACK(&EG2801_GPIO);
temp = EG2801_read_DATA(0);
if (temp <= 100)
{
EG2801_RAM_DATA.StateOfCharge = temp;
}
else
{
EG2801_RAM_DATA.StateOfCharge = 0;
}
IIC_Stop(&EG2801_GPIO);
/*读取电池状态 EG2801中文资料.pdf--9页*/
IIC_Start(&EG2801_GPIO);
IIC_WriteByte(&EG2801_GPIO, EG2801_GPIO.ADDR); //写命令
IIC_Wait_ACK(&EG2801_GPIO);
IIC_WriteByte(&EG2801_GPIO, 0x55); //命令码
IIC_Wait_ACK(&EG2801_GPIO);
IIC_WriteByte(&EG2801_GPIO, 0x0A); //寄存器地址
IIC_Wait_ACK(&EG2801_GPIO);
IIC_Start(&EG2801_GPIO);
IIC_WriteByte(&EG2801_GPIO, EG2801_GPIO.ADDR | 1); //读命令
IIC_Wait_ACK(&EG2801_GPIO);
temp = EG2801_read_DATA(0);
if (temp != 0xff)
{
EG2801_RAM_DATA.Flags = temp;
}
IIC_Stop(&EG2801_GPIO);
}
|