最近看蓝桥杯的程序,对24C02读写采用的是软件IIC,使用软件IIC读写可以更好的了解IIC时序。今天查看了库函数使用硬件IIC进行读写。首先打开cubemx进行基本配置。
开启硬件I2C2,为了方便观察再驱动一个OLED,oled采用模拟I2C时序驱动。引脚配置如下,接着就可以点击生成代码。
新建两个文件24c02.c和24c02.h代码如下
#include "24c02.h"
#define eeprom_add 0xA0
HAL_StatusTypeDef EEPROM_Writebyte(I2C_HandleTypeDef *hi2c,uint16_t add,uint8_t data)
{
return HAL_I2C_Mem_Write(hi2c,eeprom_add,add,I2C_MEMADD_SIZE_8BIT,&data,1,HAL_MAX_DELAY);
}
HAL_StatusTypeDef EEPROM_readbyte(I2C_HandleTypeDef *hi2c,uint16_t add,uint8_t *data)
{
return HAL_I2C_Mem_Read(hi2c,eeprom_add,add,add,data,I2C_MEMADD_SIZE_8BIT,HAL_MAX_DELAY);
}
24c02.h
#ifndef __24C02_H__
#define __24C02_H__
#include "main.h"
HAL_StatusTypeDef EEPROM_Writebyte(I2C_HandleTypeDef *hi2c,uint16_t add,uint8_t data);
HAL_StatusTypeDef EEPROM_readbyte(I2C_HandleTypeDef *hi2c,uint16_t add,uint8_t *data);
#endif
对于HAL_I2C_Mem_Write我们需要传入的是需要写入的地址和数据 还有我们主机地址。我们查看下表可以知道24c02的8位地址,高位为1010,低位的b3、b2、b1我们买的模块默认均接地,最低位默认为0。所以我们的设备地址是0x50
在主函数中调用写好的读写函数,只需要定义一个变量来判断是不是返回HAL_OK即可。以下是一个简单的读写main函数并且用OLED显示的程序。
int main(void)
{
/* USER CODE BEGIN 1 */
uint16_t datawrite=0x1728;
uint8_t readdata;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
Delay_Init(72);
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C2_Init();
/* USER CODE BEGIN 2 */
OLED_Init();
HAL_StatusTypeDef status = EEPROM_Writebyte(&hi2c2,0x00,datawrite);
if(status!=HAL_OK)
{
EEPROM_readbyte(&hi2c2,0x00,&readdata);
}
OLED_ShowHexNum(2, 1,datawrite,8);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
可以看到我们对0x00地址写入的数据成功读出并且通过OLED显示。
完整的代码和工程附在下面