完整的STM32F4 I2C HAL驱动PCA9555程序带读写容错功能,出错重新初始化PCA9555;包含I2C1初始化代码
时间: 2023-06-27 11:03:58 浏览: 176
Demo_18_I2C_LoLevel.zip_DEMO_I2C example_coocox_stm32f4_stm32f4
以下是一个基于STM32F4 HAL库的I2C驱动PCA9555的代码示例,包含了读写容错功能,以及出错重新初始化PCA9555的处理。
```c
#include "stm32f4xx_hal.h"
/* PCA9555 I2C地址 */
#define PCA9555_ADDR 0x40
/* PCA9555寄存器地址 */
#define PCA9555_INPUT 0x00 /* 输入寄存器 */
#define PCA9555_OUTPUT 0x01 /* 输出寄存器 */
#define PCA9555_POLAR 0x02 /* 极性反转寄存器 */
#define PCA9555_CONFIG 0x03 /* 配置寄存器 */
/* PCA9555输出状态宏定义 */
#define PCA9555_OUTPUT_HIGH 0xFF
#define PCA9555_OUTPUT_LOW 0x00
/* I2C句柄 */
extern I2C_HandleTypeDef hi2c1;
/* PCA9555初始化函数 */
void PCA9555_Init(void)
{
/* PCA9555配置字节,配置所有IO口为输出模式 */
uint8_t config_byte = 0x00;
HAL_I2C_Mem_Write(&hi2c1, PCA9555_ADDR, PCA9555_CONFIG, 1, &config_byte, 1, 100);
}
/* PCA9555重新初始化函数 */
void PCA9555_ReInit(void)
{
/* 先关闭I2C外设 */
HAL_I2C_DeInit(&hi2c1);
/* 等待一段时间 */
HAL_Delay(100);
/* 重新初始化I2C外设 */
MX_I2C1_Init();
/* 重新初始化PCA9555 */
PCA9555_Init();
}
/* PCA9555读取输入寄存器函数 */
uint8_t PCA9555_ReadInput(void)
{
/* 读取输入寄存器 */
uint8_t input_byte = 0x00;
if (HAL_I2C_Mem_Read(&hi2c1, PCA9555_ADDR, PCA9555_INPUT, 1, &input_byte, 1, 100) != HAL_OK)
{
/* 读取失败,重新初始化PCA9555 */
PCA9555_ReInit();
/* 返回默认值 */
return 0xFF;
}
return input_byte;
}
/* PCA9555写入输出寄存器函数 */
void PCA9555_WriteOutput(uint8_t output_byte)
{
/* 写入输出寄存器 */
if (HAL_I2C_Mem_Write(&hi2c1, PCA9555_ADDR, PCA9555_OUTPUT, 1, &output_byte, 1, 100) != HAL_OK)
{
/* 写入失败,重新初始化PCA9555 */
PCA9555_ReInit();
}
}
/* PCA9555输出高电平函数 */
void PCA9555_OutputHigh(void)
{
PCA9555_WriteOutput(PCA9555_OUTPUT_HIGH);
}
/* PCA9555输出低电平函数 */
void PCA9555_OutputLow(void)
{
PCA9555_WriteOutput(PCA9555_OUTPUT_LOW);
}
```
以上代码中,`PCA9555_Init()`函数用于初始化PCA9555,将所有IO口配置为输出模式;`PCA9555_ReInit()`函数用于重新初始化PCA9555,当I2C通信出现错误时调用该函数;`PCA9555_ReadInput()`函数用于读取PCA9555的输入寄存器,并且在读取失败时重新初始化PCA9555;`PCA9555_WriteOutput()`函数用于写入PCA9555的输出寄存器,并且在写入失败时重新初始化PCA9555;`PCA9555_OutputHigh()`和`PCA9555_OutputLow()`函数用于将PCA9555的输出状态设置为高电平和低电平。需要注意的是,以上代码中的`hi2c1`变量是I2C句柄,需要在主函数中初始化。
阅读全文