陶武86164.09 2022-10-10 11:22 采纳率: 100%
浏览 229
已结题

IIC设备如何设置多个从地址

问题背景:

利用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广播功能和点对点通信的同时实现

  • 写回答

2条回答 默认 最新

  • 陶武86164.09 2022-10-10 14:55
    关注

    兄弟们!!!找到问题所在了,代码第43行广播模式没使能,所以......
    惭愧,分析问题找原因还是不够细致hhh

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月18日
  • 已采纳回答 10月10日
  • 创建了问题 10月10日

悬赏问题

  • ¥15 高价求抖音抓包技术,抖音抓包无网络问题
  • ¥15 【matlab】已知功率谱密度反求时域信号
  • ¥15 mindspore项目_模型适配
  • ¥15 openstack使用cinder后,实例运行时分配的总空间不能大于ceph的总空间
  • ¥15 [pcl::PLYWriter::writeASCII] Error during opening (?鶂?)!
  • ¥15 得到XY两轴的数据如何绘制成圆,输入整形器
  • ¥29 PHP读取PDF文件添加多个数字签名
  • ¥25 联邦学习vgg修改最后一个全连接层报错(默认是1000个输出,我的改为11就报错,改为200就没问题)
  • ¥15 maple画图问题,为什么会是这样
  • ¥15 RC522开发arduino作品刷卡失效