1. 前期准备
安装好 STM32CubeMX
安装好 Clion
2. 创建项目
配置 IIC
外设,如下图所示。
开发板上的 EEPROM
存储设备 AT24Cxx
与单片机之间通过 IIC
协议通信,并且连接至单片机的 PB6
,PB7
引脚,即对应上图的 I2C1
外设。配置 I2C1
实现对 AT24Cxx
的读写操作。
3. 编辑代码
main.c
文件中自动生成了 I2C1
对象以及初始化代码:
//I2C1对象
I2C_HandleTypeDef hi2c1;
//根据配置自动生成初始化代码,并在main函数中进行了调用
static void MX_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();
}
同时在项目中自动添加了 stm32f1xx_hal_i2c.h
,stm32f1xx_hal_i2c.c
文件,其中 2
个关键函数用来实现读写 AT24Cxx
:
HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_I2C_Mem_Read (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
参数定义如下:
- hi2c :I2C 对象指针
- DevAddress 器件地址,本章表示 AT24Cxx 器件的读或写地址
- MemAddress :需要读或写内部存储器的首地址
- MemAddSize:内部地址大小,支持 8bit 或 16bit
- pData :需要读或写数据 buff 指针
- Size :读或写数据大小
- Timeout :操作超时时间
4.读写 AT24Cxx 示例
mian.c
文件中添加全局变量及测试函数:
//IIC全局变量
#define ADDR_WR_AT24CXX 0xA0 //写器件地址
#define ADDR_RD_AT24CXX 0xA1 //读器件地址
#define BuffSize 256
uint8_t Wr_buff[BuffSize],Rd_buff[BuffSize];//读写数据buff
编写读、写测试函数:
//EEPROM测试
void EEPROM_IIC_Test(void)
{
HAL_StatusTypeDef error;
uint8_t length = 8 ;
for(uint16_t i = 0;i<256;i++) Wr_buff[i] = i;
//AT24Cxx地址00开始写入8Byte数据
error = HAL_I2C_Mem_Write(&hi2c1,ADDR_WR_AT24CXX,0x00,I2C_MEMADD_SIZE_16BIT,Wr_buff,length,1000);
if(error == HAL_OK) printf("eeprom write done!rn");
else printf("eeprom write fail!rn");
HAL_Delay(1000);
//从地址0x00开始读8Byte数据,并打印。
error = HAL_I2C_Mem_Read(&hi2c1,ADDR_RD_AT24CXX,0x00,I2C_MEMADD_SIZE_16BIT,Rd_buff,length,1000);
if(error == HAL_OK)
{
printf("eeprom read done!rn");
for(uint16_t i=0;i<length;i++)
{
printf("0x%02x ",Rd_buff[i]);
}
printf("rn");
}
else printf("eeprom write fail!rn");
}
在 main
函数中调用 EEPROM_IIC_Test()
。
5. 编译下载
将程序编译下载至开发板,并将开发板连接至 PC
,打开串口调试助手 RYCOM
,并设置为:115200+8+N+1
,接收结果如下。
6. 小结
本章学习了通过 IIC
总线读写 EEPROM
器件 AT24Cxx
,掌握了基本的读写操作。