硬汉嵌入式论坛

 找回密码
 立即注册
查看: 133|回复: 4
收起左侧

[有问必答] STM32L431 I2C多从机问题

[复制链接]

2

主题

7

回帖

13

积分

新手上路

积分
13
发表于 7 天前 来自手机 | 显示全部楼层 |阅读模式
大佬们,我用STM32L431,一个I2C,接三个传感器,T117P,SHT40,BMP580,I2C跑着跑着就出问题了,这是为什么?
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 7 天前 来自手机 | 显示全部楼层
或者能不能给我简单说一下如果你做这个,i2c接3个传感器,还有一个串口接GPS,一个i2c接九轴模块,再一个串口接Lora模块,你会咋样做?
回复

使用道具 举报

28

主题

425

回帖

509

积分

金牌会员

积分
509
发表于 6 天前 | 显示全部楼层
方便给原理图的话可以上个图。
描述一下软件的情况,比如是否用rtos,是否用的硬件i2c,和这些设备通信时怎么调用的i2c接口。
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120977
QQ
发表于 6 天前 | 显示全部楼层
勇往直前的勇士 发表于 2026-1-30 22:26
或者能不能给我简单说一下如果你做这个,i2c接3个传感器,还有一个串口接GPS,一个i2c接九轴模块,再一个串 ...

一个任务里面实现三个I2C从机设计,做好ACK应答判断,即使是软件I2C,也基本不出问题。
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 昨天 17:18 | 显示全部楼层
没有使用RTOS,I2C是使用HAL库,配置是这样:
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 = 0x10D19CE4;                //400khz
  hi2c2.Init.OwnAddress1 = 0;
  hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c2.Init.OwnAddress2 = 0;
  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();
  }

  /** Configure Analogue filter
  */
  if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Digital filter
  */
  if (HAL_I2CEx_ConfigDigitalFilter(&hi2c2, 0) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN I2C2_Init 2 */

  /* USER CODE END I2C2_Init 2 */

}
这是我采集部分的代码
void EnvCollect_StateMachine(void)
{
    switch(env_collect_state)
    {
        case 0: // 开始采集环境数据
            env_collect_time = HAL_GetTick();
            env_collect_state = 1;
            break;
            
        case 1: // 采集T117温度数据
             if((HAL_GetTick() - env_collect_time) > 100)
             {
                 float temperature;
                 int ret = APP_T117_ReadTemperature(&temperature);
                 printf("T117 Read Temp Result: %d\r\n", ret);
                 g_t117_temperature = temperature;
                 env_collect_time = HAL_GetTick();
                 env_collect_state = 2;
             }
            break;
            
        case 2: // 采集SHT40温湿度数据
            if((HAL_GetTick() - env_collect_time) > 100)
            {
                float humidity, temperature;
                if(SHT40AD1B_ReadData(&humidity, &temperature) == 0)
                {
                    g_sht40_humidity = humidity;
                    g_sht40_temperature = temperature;
                }
                env_collect_time = HAL_GetTick();
                env_collect_state = 3;
            }
            break;
            
        case 3: // 采集BMP580气压数据
            if((HAL_GetTick() - env_collect_time) > 100)
            {
                APP_BMP580_GetData(&bmp580_dev, &bmp580_data);
                env_collect_time = HAL_GetTick();
                env_collect_state = 4;
            }
            break;
            
        case 4: // 环境数据采集完成
            env_collect_complete = true;
            if(g_sht40_temperature >= SHT40_TEMP_MIN && g_sht40_temperature <= SHT40_TEMP_MAX)
            {
                // SHT40温度在量程内,使用SHT40的温度
                final_temperature = g_sht40_temperature;
                printf("Use SHT40 temperature (in range): %.2f°C\r\n", final_temperature);
            }
            else
            {
                // SHT40温度超量程,改用T117的温度
                final_temperature = g_t117_temperature;
                printf("SHT40 temperature out of range (%.2f°C), use T117 temperature: %.2f°C\r\n",
                       g_sht40_temperature, final_temperature);
            }
                                                       
            DATA_LOG("T117=%.2fC, SHT40=%.2fC/%.1f%%, BMP580=%.2fhPa\r\n",
                   g_t117_temperature, g_sht40_temperature, g_sht40_humidity, bmp580_data.pressure);
            printf("Environment Data Collection Complete\r\n");
            env_collect_state = 0;
            break;
            
        default:
            env_collect_state = 0;
            break;
    }
}

现在主要问题是T117会在采集一会,采集不回来数
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-2-6 06:26 , Processed in 0.062847 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表