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

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 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行