STM32 IIC SPI 驱动 LPS22HB LPS系列通用

发布于:2025-09-04 ⋅ 阅读:(13) ⋅ 点赞:(0)

主控芯片

  • STM32F103RCT6: ARM Cortex-M3内核,64KB SRAM,256KB Flash
  • 时钟系统: 72MHz主频(HSE外部晶振 + PLL倍频)

传感器配置

I2C传感器: 1个,地址0x5D,连接PB6(SCL)/PB7(SDA)

SPI传感器: 4个,通过CS0-CS3引脚控制,连接PA5(SCK)/PA6(MISO)/PA7(MOSI)

通信接口: 支持I2C1和SPI1外设

1. 双通信模式支持

  • I2C模式: 标准I2C通信,地址0x5D
  • SPI模式: 支持4个独立传感器,每个有独立的CS控制

2. 智能数据监控

  • 实时监控: 500ms采样间隔
  • 变化检测: 自动检测数据变化,避免重复输出
  • 状态监控: 监控数据可用性标志(P_DA, T_DA)
  • 异常诊断: 自动诊断传感器故障

if (HAL_GetTick() - last_read >= 500) {
		  last_read = HAL_GetTick();
		  
		  // Check sensor status
		  uint8_t status = LPS22HB_CheckStatus();
		  uint8_t p_da = (status >> 1) & 0x01;  // Pressure data available
		  uint8_t t_da = status & 0x01;          // Temperature data available
		  
		  // Read sensor data
		  if (LPS22HB_ReadData(&sensorData) == 0) {
		    // Check if data has changed (with small tolerance for noise)
		    int32_t pressure_diff = abs(sensorData.pressureRaw - last_pressure);
		    int16_t temp_diff = abs(sensorData.temperatureRaw - last_temperature);
		    
		    if (pressure_diff > 10 || temp_diff > 2) {  // Allow small variations
		      // Data changed significantly - display it
		      if (CURRENT_PRINT_MODE == PRINT_MODE_VERBOSE) {
		        sprintf((char*)txBuffer, "P: %.3f hPa, T: %.2f C, Alt: %.2f m [CHANGED]\r\n", 
		                sensorData.pressure, sensorData.temperature, sensorData.altitude);
		        UART_Send_String((char*)txBuffer);
		        
		        // Check if pressure is within sensor range (260-1260 hPa)
		        if (sensorData.pressure < 260.0f || sensorData.pressure > 1260.0f) {
		          sprintf((char*)txBuffer, "WARNING: Pressure %.3f hPa is outside sensor range (260-1260 hPa)!\r\n", 
		                  sensorData.pressure);
		          UART_Send_String((char*)txBuffer);
		        }
		        
		        sprintf((char*)txBuffer, "Raw: P=0x%06lX (%ld), T=0x%04X (%d), Status=0x%02X (P_DA:%d,T_DA:%d)\r\n", 
		                (uint32_t)sensorData.pressureRaw & 0xFFFFFF, sensorData.pressureRaw,
		                (uint16_t)sensorData.temperatureRaw, sensorData.temperatureRaw, status, p_da, t_da);
		        UART_Send_String((char*)txBuffer);
		      }
		      
		      last_pressure = sensorData.pressureRaw;
		      last_temperature = sensorData.temperatureRaw;
		      unchanged_count = 0;
		    } else {
		      // Data unchanged or minor variation
		      unchanged_count++;
		      if (CURRENT_PRINT_MODE == PRINT_MODE_VERBOSE) {
		        if (unchanged_count == 1) {
		          // First time detecting unchanged data
		          sprintf((char*)txBuffer, "Data stable: P=%.3f hPa, T=%.2f C\r\n", 
		                  sensorData.pressure, sensorData.temperature);
		          UART_Send_String((char*)txBuffer);
		        } else if (unchanged_count % 10 == 0) {  // Every 5 seconds
		          sprintf((char*)txBuffer, "Data stable for %ld seconds - Status: 0x%02X (P_DA:%d,T_DA:%d)\r\n", 
		                  unchanged_count * 500 / 1000, status, p_da, t_da);
		          UART_Send_String((char*)txBuffer);
		          
		          // If data is stuck for too long, run diagnosis
		          if (unchanged_count >= 60) {  // After 30 seconds of no change
		            UART_Send_String("Data appears stuck! Running diagnosis...\r\n");
		            LPS22HB_DiagnoseSensor();
		            unchanged_count = 0;
		          }
		        }
		      }
		    }
		  } else {
		    UART_Send_String("Failed to read sensor data!\r\n");
		    // Try to diagnose the problem
		    LPS22HB_DiagnoseSensor();
		  }
		}
		
		HAL_Delay(100);  // Short delay to avoid high CPU usage
    //IIC code end
    
    //SPI code start - 使用新的打印模式
    static uint32_t last_spi_test = 0;
    
    if (HAL_GetTick() - last_spi_test >= 500) {  
      last_spi_test = HAL_GetTick();
      
      // 读取所有SPI传感器数据
      LPS22HB_SPI_ReadAll(spiSensorData);
      
      // 使用新的打印模式函数
      PrintSensorData_CurrentMode(&sensorData, spiSensorData);
    }
		HAL_Delay(100);  // Short delay to avoid high CPU usage