本篇内容讲述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)文章来源:https://www.toymoban.com/news/detail-401812.html
读数据函数,最重要函数之一,用法同函数3。文章来源地址https://www.toymoban.com/news/detail-401812.html
#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数据数组中
到了这里,关于STM32 HAL库函数学习 I2C篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!