bq24780s和stm32通讯充电例程程序
时间: 2023-11-14 22:07:02 浏览: 90
以下是一个简单的例程程序,演示了如何使用STM32与BQ24780S通讯进行充电:
```
#include "stm32f10x.h"
/* 定义BQ24780S的I2C地址 */
#define BQ24780S_ADDRESS 0x12
/* 定义I2C总线速度 */
#define I2C_SPEED 400000
/* 定义I2C发送和接收buffer的长度 */
#define BUFFER_SIZE 2
/* 定义I2C的GPIO引脚 */
#define I2C_GPIO GPIOB
#define I2C_SCL GPIO_Pin_6
#define I2C_SDA GPIO_Pin_7
/* 定义I2C读写函数 */
void I2C_Start(void);
void I2C_Stop(void);
void I2C_SendByte(uint8_t data);
uint8_t I2C_ReadByte(void);
void I2C_SendAcknowledge(FunctionalState ack);
/* 定义BQ24780S的充电控制寄存器地址 */
#define CHARGE_CTRL_REG 0x02
int main(void)
{
/* 初始化I2C总线 */
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
/* 使能I2C和GPIO的时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
/* 配置I2C的GPIO引脚 */
GPIO_InitStructure.GPIO_Pin = I2C_SCL | I2C_SDA;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(I2C_GPIO, &GPIO_InitStructure);
/* 配置I2C的参数 */
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = I2C_SPEED;
I2C_Init(I2C1, &I2C_InitStructure);
/* 使能I2C */
I2C_Cmd(I2C1, ENABLE);
/* 发送I2C START信号 */
I2C_Start();
/* 发送BQ24780S的I2C地址和写命令 */
I2C_SendByte(BQ24780S_ADDRESS << 1);
I2C_SendByte(CHARGE_CTRL_REG);
/* 发送I2C STOP信号 */
I2C_Stop();
return 0;
}
void I2C_Start(void)
{
/* 发送I2C START信号 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 等待I2C BUSY状态结束 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
}
void I2C_Stop(void)
{
/* 发送I2C STOP信号 */
I2C_GenerateSTOP(I2C1, ENABLE);
}
void I2C_SendByte(uint8_t data)
{
/* 将数据发送到I2C总线上 */
I2C_SendData(I2C1, data);
/* 等待数据发送完成 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
}
uint8_t I2C_ReadByte(void)
{
uint8_t data;
/* 使能I2C的ACK */
I2C_SendAcknowledge(ENABLE);
/* 等待数据接收完成 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
/* 读取数据 */
data = I2C_ReceiveData(I2C1);
return data;
}
void I2C_SendAcknowledge(FunctionalState ack)
{
/* 使能或禁止I2C的ACK */
I2C_AcknowledgeConfig(I2C1, ack);
}
```
这个例程程序只是演示了如何使用STM32与BQ24780S通讯充电控制寄存器,还有很多其他的寄存器和功能可以使用。需要根据具体的应用场景和需求进行相应的修改和调整。
阅读全文