sgm41511电源管理芯片STM32 iic驱动

    SGM41511是一种电源管理和充电器设备,适用于使用大容量单电池锂离子或锂聚合物电池的手机和平板电脑等应用。SGM41511可以容纳多种输入源,包括USB、墙壁适配器和汽车充电器。它为5V输入(USB电压)进行了优化,但能够在3.9V到13.5V的输入电压下工作。它还支持JEITA模式,以确保电池在高温或低温下的充电安全。自动电源路径选择从输入源(VBUS)、电池(BAT)或两者为系统(SYS)供电是设备的另一个功能。电池充电电流可编程,最大可达3A(充电)。在升压模式下,当VBUS引脚是通常调节到5.15V的电源接收节点(USB OTG)时,电池电压会升压,为VBUS引脚供电(最大1.2A)。

    设备可在几种不同模式下运行:

    在HIZ模式下,通过关闭反向阻断FET(Q1),VBU和输入源与电源电路断开。在这种模式下,内部REGN LDO、转换器开关和内部电路的一些其他部分保持关闭,以节省电池,同时通过BATFET向系统提供直流电源。

    在睡眠模式下,切换停止。当输入电源电压(VVAC)不足以为蓄电池充电时,充电器进入休眠模式。换言之,VVAC小于VBAT+VSLEEP(其中VSLEEP是一个小阈值),buck变换器即使在其最大占空比下也不能充电。如果反向出现类似问题(当VVAC几乎等于或小于VBAT时),则升压也可能进入休眠模式。

    在补充模式下,输入电源不足以提供系统所需的电源,电池通过向系统并联放电来辅助,从而提供不足。

器件地址:I2C Slave Address of SGM41511 is: 0x6B
写地址: ((0x6B<<1) | 0)
读地址:((0x6B<<1) | 1)

sgm41511.h .h文件

/******************************************************************************
*Description :SGM41511 电源管理芯片驱动
*Author      :
*Date        :2021.01.22
*******************************************************************************/
#ifndef  _SGM41511_H_
#define  _SGM41511_H_

#include 
#include "main.h"

#define SCL_PIN          GPIO_PIN_6
#define SDA_PIN          GPIO_PIN_7
#define IIC_PORT         GPIOB

#define SGM_DEVICE_ADDR  0x6B
#define SGM_WRITE_ADDR   ((SGM_DEVICE_ADDR<<1) | 0)  // 0X6B <<1  0xD6
#define SGM_READ_ADDR    ((SGM_DEVICE_ADDR<<1) | 1)  // (0X6B << 1) + 1     0xD7

#define REG00_ADDR       0x00
#define REG01_ADDR       0x01
#define REG02_ADDR       0x02
#define REG03_ADDR       0x03
#define REG04_ADDR       0x04
#define REG05_ADDR       0x05
#define REG06_ADDR       0x06
#define REG07_ADDR       0x07
#define REG08_ADDR       0x08
#define REG09_ADDR       0x09
#define REG0A_ADDR       0x0A
#define REG0B_ADDR       0x0B

#define SDA_H()          HAL_GPIO_WritePin(IIC_PORT, SDA_PIN, GPIO_PIN_SET)
#define SDA_L()          HAL_GPIO_WritePin(IIC_PORT, SDA_PIN, GPIO_PIN_RESET)
#define SCL_H()          HAL_GPIO_WritePin(IIC_PORT, SCL_PIN, GPIO_PIN_SET)
#define SCL_L()          HAL_GPIO_WritePin(IIC_PORT, SCL_PIN, GPIO_PIN_RESET)

void IIC_Init(void);
void IIC_Sda_Mod(unsigned char mod);
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Send_Byte(unsigned char txd);
unsigned char IIC_Read_Byte(unsigned char ack);
unsigned char IIC_Wait_Ack(void);
void IIC_Ack(void);
void IIC_NAck(void);

unsigned char SgmWriteByte(unsigned char reg,unsigned char data);
unsigned char SgmReadByte(unsigned char reg);
unsigned char SgmReadLen(unsigned char reg,unsigned char len,unsigned char *buf);
#endif

sgm41511.c .c文件

/******************************************************************************
*Description :SGM41511 SGM41511 电源管理芯片驱动
*Author      :
*Date        :2021.01.22
*******************************************************************************/
#include "sgm41511.h"
#include "includes.h"

/*******************************************************************************
* Function Name  : delay_us
* Description    : us延时
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void delay_us(unsigned short time)
{
    unsigned short i = 0;

    while(time--)
    {
        i = 100;
        while(i--);
    }
}

/*******************************************************************************
* Function Name  : IIC_Init
* Description    : IIC初始化
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void IIC_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* GPIO Ports Clock Enable */
    __HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_InitStruct.Pin   = SCL_PIN | SDA_PIN;
    GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_OD;
    GPIO_InitStruct.Pull  = GPIO_NOPULL;
    
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    SCL_H();
    SDA_H();
}

/*******************************************************************************
* Function Name  : IIC_Sda_Mod
* Description    : SDA输入输出选择
* Input          : mod SDA输入输出选择
* Output         : None
* Return         : None
*******************************************************************************/
void IIC_Sda_Mod(unsigned char mod)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    GPIO_InitStruct.Pin   = SCL_PIN;
    GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_OD;
    GPIO_InitStruct.Pull  = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
    if(mod != 0) //mod = 1,SDA OUTPUT
    {
        GPIO_InitStruct.Pin   = SDA_PIN;
        GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_OD;
        GPIO_InitStruct.Pull  = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);        
    }
    else //mod = 0,SDA INPUT
    {        
        GPIO_InitStruct.Pin   = SDA_PIN;
        GPIO_InitStruct.Mode  = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull  = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    }
}

/*******************************************************************************
* Function Name  : IIC_Start
* Description    : 产生IIC起始信号
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void IIC_Start(void)
{
    IIC_Sda_Mod(1);//SDA output
    SCL_H();
    SDA_H();
    delay_us(4);
    SDA_L();
    delay_us(4);
    SCL_L();
}

/*******************************************************************************
* Function Name  : IIC_Stop
* Description    : 产生IIC停止信号
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void IIC_Stop(void)
{
    IIC_Sda_Mod(1);//SDA output
    SCL_L();
    SDA_L();
    delay_us(4);
    SCL_H();
    SDA_H();
    delay_us(4);
}

/*******************************************************************************
* Function Name  : IIC_Wait_Ack
* Description    : 等待应答信号到来
* Input          : None
* Output         : 1,接收应答失败 0接收应答成功
* Return         : None
*******************************************************************************/
unsigned char IIC_Wait_Ack(void)
{
    unsigned char ucErrTime = 0;
    IIC_Sda_Mod(0);//SDA Input
    SDA_H();
    delay_us(1);
    SCL_H();
    delay_us(1);
    while(HAL_GPIO_ReadPin(IIC_PORT, SDA_PIN))
    {
        ucErrTime++;
        if(ucErrTime >250)
        {
            IIC_Stop();
            return 1;
        }
    }
    SCL_L();
    return 0;
}

/*******************************************************************************
* Function Name  : IIC_Ack
* Description    : 产生IIC应答信号
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void IIC_Ack(void)
{
    SCL_L();
    IIC_Sda_Mod(1);//SDA output
    SDA_L();
    delay_us(2);
    SCL_H();
    delay_us(2);
    SCL_L();
}

/*******************************************************************************
* Function Name  : IIC_Stop
* Description    : 产生IIC停止信号
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void IIC_NAck(void)
{
    SCL_L();
    IIC_Sda_Mod(1);//SDA output
    SDA_H();
    delay_us(2);
    SCL_H();
    delay_us(2);
    SCL_L();
}

/*******************************************************************************
* Function Name  : IIC_Send_Byte
* Description    : IIC发送一个字节
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void IIC_Send_Byte(unsigned char txd)
{
    unsigned char t;
    unsigned char temp;
    IIC_Sda_Mod(1);//SDA output
    SCL_L();
    for(t=0;t<8;t++)
    {
        temp = (txd & 0x80) >>7;

        if(temp == 1)
        {
            SDA_H();
        }
        else
        {
            SDA_L();
        }
        
        txd <<= 1;
        delay_us(2);
        SCL_H();
        delay_us(2);
        SCL_L();
        delay_us(2);
    }
}

/*******************************************************************************
* Function Name  : IIC_Read_Byte
* Description    : 
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
unsigned char IIC_Read_Byte(unsigned char ack)
{
    unsigned char i,receive=0;
    IIC_Sda_Mod(0);//SDA Input

    for(i=0;i<8;i++)
    {
        SCL_L();
        delay_us(2);
        SCL_H();
        receive <<=1;
        if(HAL_GPIO_ReadPin(IIC_PORT, SDA_PIN))
        {
            receive++;
        }
        delay_us(1);
    }

    if(!ack)
    {
        IIC_NAck();
    }
    else
    {
        IIC_Ack();
    }

    return receive;
}

/*******************************************************************************
* Function Name  : SgmWriteByte
* Description    : IIC写一个字节
* Input          : reg 寄存器地址     data数据
* Output         : 0正常 1错误
* Return         : None
*******************************************************************************/
unsigned char SgmWriteByte(unsigned char reg,unsigned char data)
{
    IIC_Start();
    IIC_Send_Byte(SGM_WRITE_ADDR);//发送写命令
    if(IIC_Wait_Ack())
    {
        IIC_Stop();
        return 1;
    }
    IIC_Send_Byte(reg);//写寄存器地址
    IIC_Wait_Ack();
    IIC_Send_Byte(data);
    if(IIC_Wait_Ack())
    {
        IIC_Stop();
        return 1;
    }
    IIC_Stop();
    return 0;
}


/*******************************************************************************
* Function Name  : SgmReadByte
* Description    : IIC读取一个字节
* Input          : reg 寄存器地址
* Output         : 读到的数据
* Return         : None
*******************************************************************************/
unsigned char SgmReadByte(unsigned char reg)
{
    unsigned char temp1;
    IIC_Start();
    IIC_Send_Byte(SGM_WRITE_ADDR);//发送写命令
    IIC_Wait_Ack();
    IIC_Send_Byte(reg);//写寄存器地址
    IIC_Wait_Ack();
    IIC_Start();
    IIC_Send_Byte(SGM_READ_ADDR);//发送读命令
    IIC_Wait_Ack();
    temp1 = IIC_Read_Byte(0);
    IIC_Stop();
    return temp1;
}

/*******************************************************************************
* Function Name  : SgmReadLen
* Description    : IIC连续读取
* Input          : reg 寄存器地址,len要读取的长度,buf读取到的数据存储
* Output         : 读到的数据
* Return         : 0正常,1错误
*******************************************************************************/
unsigned char SgmReadLen(unsigned char reg,unsigned char len,unsigned char *buf)
{
    IIC_Start();
    IIC_Send_Byte(SGM_WRITE_ADDR);//发送写命令
    if(IIC_Wait_Ack())
    {
        IIC_Stop();
        return 1;
    }
    IIC_Send_Byte(reg);//写寄存器地址
    IIC_Wait_Ack();
    IIC_Start();
    IIC_Send_Byte(SGM_READ_ADDR);//发送读命令
    IIC_Wait_Ack();
    while(len)
    {
        if(len == 1)
        {
            *buf = IIC_Read_Byte(0);
        }
        else
        {
             *buf = IIC_Read_Byte(1);
        }
        len--;
        buf++;
    }
    IIC_Stop();
    return 0;
}

你可能感兴趣的:(C语言)