首先IIC的概念就略过了。这个网上写的很详细。
从CUBEMX配置完代码开始吧。
手上的项目是一主机,七个从机,从机使用中段收发。
关于地址是一个大坑,后续的读写中断也是个坑。
从机地址:
硬件为I2C_ADDRESSINGMODE_7BIT时的从机地址时,从机的地址需要左移一位,最低为表示读或者写。比如从机地址I2COwnAddr = 0x0A,左移一位配置为:
hi2c1.Init.OwnAddress1 = I2COwnAddr<<1;//从机的地址设置需要左移一位
这样从机的配置初始化函数:/* I2C1 init function */
void MX_I2C1_Init(void)
{
/* USER CODE BEGIN I2C1_Init 0 */
/* USER CODE END I2C1_Init 0 */
/* USER CODE BEGIN I2C1_Init 1 */
/* USER CODE END I2C1_Init 1 */
hi2c1.Instance = I2C1;
hi2c1.Init.Timing = 0x2000090E;
hi2c1.Init.OwnAddress1 = I2COwnAddr<<1;//从机的地址设置需要左移一位
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
/** Configure Analogue filter
*/
if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
{
Error_Handler();
}
/** Configure Digital filter
*/
if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN I2C1_Init 2 */
#ifndef MASTER
// HAL_I2C_Slave_Receive_IT(&hi2c1, I2CBuf_RxData, sizeof(I2CBuf_RxData)); // 启动中断接收
HAL_I2C_Slave_Transmit_IT(&hi2c1, I2CBuf_TxData, sizeof(I2CBuf_TxData)); // 启动中断发送
// HAL_I2C_EnableListen_IT(&hi2c1);
#endif
/* USER CODE END I2C1_Init 2 */
}
|