关于IIC的原理这里我就不多说了,网上有很多很好的解析,如果要看我个人对IIC的理解的话,可以点击查看,这里主要讲一下怎样利用STM32CubeMx实现IIC的通讯,经过个人实践,感觉HAL库的硬件IIC要比标准库的稳定。好了,下面就从STM32CubeMx 配置开始一步步实现IIC通讯。
STM32CubeMx的配置,这里关于新建工程的步骤我就不细说了,如果还不会操作STM32CubeMx 的可以点击查看, 这里主要对IIC的配置进行说明。
了解IIC的都知道,IIC通信有主从机之分,用两片STM32进行IIC通信当然也不例外,不过使用STM32CubeMx 配置有一个好处,就是不用分别配置主从机,在STM32CubeMx 配置里面,主从机的配置是一样,唯一不同的就是IIC的地址如上图,这个地址很重要,只要配置好了,基本就成功了。
还有一个要注意的,就是IIC的SDA、SCK引脚要配置成NPP模式,不然容易出现信号线忙,检测不到从机的情况。
配置配好后我们生成代码,就可以进行通信了,主从机核心代码如下:
下面是主机的重要代码:
/* I2C2 init function IIC配置*/ static void MX_I2C2_Init(void) { hi2c2.Instance = I2C2; hi2c2.Init.Timing = 0x10805D88; hi2c2.Init.OwnAddress1 = 20; //用户自己配置的地址 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(__FILE__, __LINE__); }