STM32·

STM32篇——IIC通信

ronger

ronger

2817 0

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!\r\n");
    else                printf("eeprom write fail!\r\n");
    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!\r\n");
        for(uint16_t i=0;i<length;i++)
        {
            printf("0x%02x ",Rd_buff[i]);
        }
        printf("\r\n");
    }
    else  printf("eeprom write fail!\r\n");
}

main函数中调用EEPROM_IIC_Test()

5. 编译下载

将程序编译下载至开发板,并将开发板连接至PC,打开串口调试助手RYCOM,并设置为:115200+8+N+1,接收结果如下。

6. 小结

本章学习了通过IIC总线读写EEPROM器件AT24Cxx,掌握了基本的读写操作。

所属系列

从当前文章继续阅读它所在合集中的前后内容。

关于我和 Hugh 学嵌入式开发这件事 —— STM32 篇 第 6 / 17 篇
查看合集

> 本作品集内教程基于 [Hugh](https://rymcu.com/user/hugh) 的创作基础上进行修订发布 关于我和 Hugh 学嵌入式开发这件事

相关文章

优先推荐同专题、同标签和同作者内容,补足热门文章。

评论 0

登录 后参与评论

评论

成为第一个评论的人