《STM32 HAL库:I2C函数学习指南》

本篇内容讲述STM32的硬件IIC功能。硬件IIC的使用在F1系列上可能会有问题。本次使用的测试平台是H7,用于AT24C02芯片的读写正常,暂不清楚在其他芯片上使用是否正常。

1、HAL_StatusTypeDef HAL_I2C_Init (I2C_HandleTypeDef * hi2c)

 I2C_HandleTypeDef hi2c2;

/* I2C2 init function */
void MX_I2C2_Init(void)
{

 hi2c2.Instance = I2C2;
  hi2c2.Init.Timing = 0x00707CBB;
  hi2c2.Init.OwnAddress1 = 0;
  hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c2.Init.OwnAddress2 = 0;
  hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c2) != HAL_OK)
  {
    Error_Handler();
  }
}

I2C初始化函数,使用CubeMx生成。需要选中I2C硬件指定的IO口。

2、void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)

void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  if(i2cHandle->Instance==I2C2)
  {
  /* USER CODE BEGIN I2C2_MspInit 0 */

  /* USER CODE END I2C2_MspInit 0 */
  /** Initializes the peripherals clock
  */
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2C2;
    PeriphClkInitStruct.I2c123ClockSelection = RCC_I2C123CLKSOURCE_D2PCLK1;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_RCC_GPIOH_CLK_ENABLE();
    /**I2C2 GPIO Configuration
    PH4     ------> I2C2_SCL
    PH5     ------> I2C2_SDA
    */
    GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;
    HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);

    /* I2C2 clock enable */
    __HAL_RCC_I2C2_CLK_ENABLE();
  /* USER CODE BEGIN I2C2_MspInit 1 */

  /* USER CODE END I2C2_MspInit 1 */
  }
}

I2C的IO口配置、指定时钟的配置,两个功能。

3、HAL_StatusTypeDef 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)

写数据的函数,最重要的函数之一。

hi2c:代表I2C设备句柄。

DevAddress: 目标设备地址, 此处填写写数据的从机地址加命令(一字节)

MemAddress:内部存储器地址,寄存器需要写入数据的内部地址

MemAddSize:写入数据的数据类型

pData:数据指针,指向要写入到数据地址。

Size:写入数据的大小

Timeout:超时等待时间。

I2C写入字符型数据到E2PROM中:

#define ADDR_Write 0xA0
#define ADDR_Read 0xA1

u8 Array[8] =  "ABCDEFG";

HAL_I2C_Mem_Write(&hi2c2,ADDR_Write,0,I2C_MEMADD_SIZE_8BIT,Array,7,0xff);
//向设备地址为0XA0的存储器的内部0地址开始写入7位单字节类型的数据"ABCDEFG".

I2C写入数字型数据到E2PROM中:

#define ADDR_Write 0xA0
#define ADDR_Read 0xA1

u8 King[5] = {12,13,34,56,67};

HAL_I2C_Mem_Write(&hi2c2,ADDR_Write ,0,I2C_MEMADD_SIZE_8BIT,(u8*)King,5,0xff);
//向设备地址为0XA0的存储器内部地址0开始写入5个数字

4、HAL_StatusTypeDef 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)

读数据函数,最重要函数之一,用法同函数3。

 
#define ADDR_Write 0xA0
#define ADDR_Read 0xA1

u8 King[5] = {12,13,34,56,67};//写入E2PROM
u8 Arec[5] = {0}; //读出内部数据缓存区

HAL_I2C_Mem_Write(&hi2c2,ADDR_Write ,0,I2C_MEMADD_SIZE_8BIT,(u8*)King,5,0xff);
//向设备地址为0XA0的存储器内部地址0开始写入5个数字




HAL_I2C_Mem_Read(&hi2c2,ADDR_Read,0,I2C_MEMADD_SIZE_8BIT,(u8*)Arec,5,0xff);
//从上述设备中读取数据存放到Arec数据数组中

物联沃分享整理
物联沃-IOTWORD物联网 » 《STM32 HAL库:I2C函数学习指南》

发表评论