完整的STM32F4 I2C HAL驱动2个PCA9555程序带读写容错功能,出错重新初始化PCA9555;包含I2C1初始化代码。
时间: 2023-06-27 12:03:54 浏览: 83
以下是基于HAL库的STM32F4 I2C驱动的示例代码,包含了对两个PCA9555芯片的读写操作,并且具有容错功能,出错时会重新初始化PCA9555芯片。
```c
#include "stm32f4xx_hal.h"
#define PCA9555_I2C_ADDRESS_1 0x20
#define PCA9555_I2C_ADDRESS_2 0x21
I2C_HandleTypeDef hi2c1;
void I2C1_Init(void)
{
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
}
HAL_StatusTypeDef PCA9555_WriteByte(I2C_HandleTypeDef *hi2c, uint8_t address, uint8_t reg, uint8_t data)
{
HAL_StatusTypeDef status;
uint8_t buffer[2];
uint16_t timeout = 0;
buffer[0] = reg;
buffer[1] = data;
do
{
status = HAL_I2C_Mem_Write(hi2c, address, reg, 1, buffer + 1, 1, 1000);
if (status != HAL_OK)
{
HAL_I2C_DeInit(hi2c);
HAL_I2C_Init(hi2c);
timeout++;
}
} while ((status != HAL_OK) && (timeout < 3));
if (timeout >= 3)
{
return HAL_ERROR;
}
return HAL_OK;
}
HAL_StatusTypeDef PCA9555_ReadByte(I2C_HandleTypeDef *hi2c, uint8_t address, uint8_t reg, uint8_t *data)
{
HAL_StatusTypeDef status;
uint16_t timeout = 0;
do
{
status = HAL_I2C_Mem_Read(hi2c, address, reg, 1, data, 1, 1000);
if (status != HAL_OK)
{
HAL_I2C_DeInit(hi2c);
HAL_I2C_Init(hi2c);
timeout++;
}
} while ((status != HAL_OK) && (timeout < 3));
if (timeout >= 3)
{
return HAL_ERROR;
}
return HAL_OK;
}
void PCA9555_Init(I2C_HandleTypeDef *hi2c, uint8_t address)
{
PCA9555_WriteByte(hi2c, address, 0x06, 0x00);
PCA9555_WriteByte(hi2c, address, 0x07, 0x00);
}
int main(void)
{
HAL_Init();
I2C1_Init();
PCA9555_Init(&hi2c1, PCA9555_I2C_ADDRESS_1);
PCA9555_Init(&hi2c1, PCA9555_I2C_ADDRESS_2);
uint8_t value;
PCA9555_ReadByte(&hi2c1, PCA9555_I2C_ADDRESS_1, 0x00, &value);
PCA9555_WriteByte(&hi2c1, PCA9555_I2C_ADDRESS_2, 0x01, value);
while (1)
{
}
}
```
在上面的代码中,我们首先初始化了I2C1总线,并定义了两个PCA9555芯片的地址。然后,我们定义了两个函数`PCA9555_ReadByte()`和`PCA9555_WriteByte()`,分别用于读和写PCA9555芯片的寄存器。这些函数还包含了容错功能,即在写或读操作失败时,会重新初始化PCA9555芯片。
最后,在主函数中,我们调用了`PCA9555_Init()`函数对两个PCA9555芯片进行初始化,并且读取了第一个PCA9555的第0个寄存器的值,并将其写入第二个PCA9555的第1个寄存器。
请注意,上述示例代码是基于HAL库的,因此需要在使用前将其添加到您的项目中。