问题背景:
利用3块stm32搭建一主二从环境,实现主机对从机的广播和轮询(点对点通信)
遇到问题:
手册里写iic的通用广播地址为0x00,我最初理解是不需要另外配置了,但从机识别不了这个地址,收不到广播;
用代码块功能插入代码,请勿粘贴截图
/* I2C2 init function */
void MX_I2C2_Init(void)
{
/* USER CODE BEGIN I2C2_Init 0 */
/* USER CODE END I2C2_Init 0 */
/* USER CODE BEGIN I2C2_Init 1 */
/* USER CODE END I2C2_Init 1 */
hi2c2.Instance = I2C2;
hi2c2.Init.Timing = 0x10909CEC;
/* hi2c2.Init.OwnAddress1 = 0; */
if(BOARD_NUM == 0)
{
hi2c2.Init.OwnAddress1 = 32;
}
else if(BOARD_NUM == 1)
{
hi2c2.Init.OwnAddress1 = 96;
}
else if(BOARD_NUM == 2)
{
hi2c2.Init.OwnAddress1 = 160;
}
hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c2.Init.OwnAddress2 = 0;
/*if(BOARD_NUM == 0)
{
hi2c2.Init.OwnAddress2 = 32;
}
else if(BOARD_NUM == 1)
{
hi2c2.Init.OwnAddress2 = 96;
}
else if(BOARD_NUM == 2)
{
hi2c2.Init.OwnAddress2 = 160;
}*/
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();
}
运行结果及报错内容
从机只能收到携带第一个从地址信息的消息
我的解答思路和尝试过的方法
1、尝试过利用cubeMX配置iic,iic初始化结构体中可以定义2个从地址,网上相关资料很少,但我看到过一个词条介绍iic设备可以设置2个从地址,于是我把第二个地址设置为广播地址,仍无效;后经调试发现:初始化配置中的第二个地址hi2c1.Init.OwnAddress2不起作用,也就是说我目前只能利用第一个地址,要么实现点对点,要么实现广播。
2、网上看到有通过I2C_OwnAddress2Config函数来配置第2个地址寄存器,但这个好像和CubeMX自动生成驱动的思路不契合。
3、另一个解决思路:由于3块单片机都是用的一个工程,所以设计了装订参数和预编译来实现主从机对应的程序下载。基于此,我可以在iic初始化部分多加一句条件语句,是的从地址设置动态可变,但这样好像会变得很复杂
4、个人感觉以上尝试都是在绕远路,手册上写了通用广播地址(General Call address),应是有更高效的处理方法
我想要达到的结果
IIC广播功能和点对点通信的同时实现