利用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广播功能和点对点通信的同时实现
兄弟们!!!找到问题所在了,代码第43行广播模式没使能,所以......
惭愧,分析问题找原因还是不够细致hhh
可以将2个从机的地址设置成一样的,保证通讯正常,然后通过片选CS去选择对应通讯的从机。广播的方法我没试过,但是感觉不太好,因为有可能会相互抢占数据线的使用,所以还是通过片选去选择需要去轮询的设备