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

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 我这个代码哪里有问题 acm 平台上显示错误 90%,我自己运行好像没什么问题
  • ¥50 C#编程中使用printDocument类实现文字排版打印问题
  • ¥15 找会编程的帅哥美女 可以用MATLAB里面的simulink编程,用Keil5编也可以。
  • ¥15 已知隐函数其中一个变量τ的具体值,求另一个变量
  • ¥15 r语言Hurst指数
  • ¥15 Acrn IVSHMEM doorbell问题
  • ¥15 yolov5中的val测试集训练时数量变小问题
  • ¥15 MPLS/VPN实验中MPLS的配置问题
  • ¥15 materialstudio氢键计算问题
  • ¥15 echarts图表制作