STM32HAL库 AT24C128驱动程序
时间: 2023-09-20 17:03:43 浏览: 60
以下是一个简单的基于STM32HAL库的AT24C128驱动程序示例:
首先需要定义I2C总线的句柄:
```c
I2C_HandleTypeDef hi2c1; //定义I2C1句柄
```
然后需要初始化I2C总线和AT24C128芯片:
```c
void AT24C128_Init(void)
{
uint8_t init_data[3] = {0x00, 0x00, 0x00}; //初始化数据
//初始化I2C总线
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 400000;
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_I2C_Mem_Write(&hi2c1, AT24C128_ADDRESS, 0x00, I2C_MEMADD_SIZE_16BIT, init_data, 3, 100);
}
```
接下来是读写函数:
```c
void AT24C128_Write(uint16_t address, uint8_t *data, uint16_t len)
{
uint16_t timeout = 100;
uint8_t addr[2];
addr[0] = (uint8_t)(address >> 8); //高8位地址
addr[1] = (uint8_t)address; //低8位地址
//等待芯片准备好
while (HAL_I2C_IsDeviceReady(&hi2c1, AT24C128_ADDRESS, 1, timeout) != HAL_OK)
{
if (timeout-- == 0)
{
Error_Handler();
}
}
//写入数据
HAL_I2C_Mem_Write(&hi2c1, AT24C128_ADDRESS, address, I2C_MEMADD_SIZE_16BIT, data, len, 100);
}
void AT24C128_Read(uint16_t address, uint8_t *data, uint16_t len)
{
uint16_t timeout = 100;
uint8_t addr[2];
addr[0] = (uint8_t)(address >> 8); //高8位地址
addr[1] = (uint8_t)address; //低8位地址
//等待芯片准备好
while (HAL_I2C_IsDeviceReady(&hi2c1, AT24C128_ADDRESS, 1, timeout) != HAL_OK)
{
if (timeout-- == 0)
{
Error_Handler();
}
}
//读取数据
HAL_I2C_Mem_Read(&hi2c1, AT24C128_ADDRESS, address, I2C_MEMADD_SIZE_16BIT, data, len, 100);
}
```
最后是一个简单的测试代码:
```c
#define DATA_LEN 8
uint8_t data_write[DATA_LEN] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};
uint8_t data_read[DATA_LEN];
int main(void)
{
HAL_Init();
AT24C128_Init();
//写入数据
AT24C128_Write(0x0000, data_write, DATA_LEN);
//读取数据
AT24C128_Read(0x0000, data_read, DATA_LEN);
while (1)
{
//检查读取到的数据是否正确
if (memcmp(data_write, data_read, DATA_LEN) == 0)
{
//数据正确
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
HAL_Delay(500);
}
else
{
//数据错误
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
HAL_Delay(500);
}
}
}
```