STM32 IIC SPI 驱动 LPS22HB LPS系列通用

主控芯片

  • 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)
  • 异常诊断: 自动诊断传感器故障

cpp 复制代码
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
相关推荐
三佛科技-134163842129 小时前
FT32F103系列与APM32F103,STM32F103之间的对比,能否替换?
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
李永奉9 小时前
杰理可视化SDK开发-蓝牙的可发现可连接和回连
单片机·嵌入式硬件·物联网·语音识别
【ql君】qlexcel11 小时前
Visual Studio Code开发STM32设置头文件宏定义uint32_t报错
vscode·stm32·vs code·头文件宏定义·uint32_t报错·uint8_t报错·uint16_t报错
振浩微433射频芯片11 小时前
标签界的“千里眼”:VRT5312,150cm超远读写距离,重新定义RFID新可能!
科技·单片机·嵌入式硬件·物联网
andylauren12 小时前
论单点接地的重要性——从MP3模块噪声问题看接地设计的关键
嵌入式硬件
修勾勾L12 小时前
使用VSCode开发嵌入式开发详细教程——步骤二项目实战
嵌入式硬件
染予13 小时前
定时器时钟源介绍
单片机·嵌入式硬件
时空自由民.13 小时前
ESP32编译固件内存信息解读
单片机·性能优化
LCMICRO-1331084774614 小时前
长芯微LPS6288完全P2P替代TPS61288,是一款具有 15A 开关电流的全集成同步升压转换器
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·同步升压转换器
FreakStudio14 小时前
MicroPython对接大模型:uopenai + 火山方舟实现文字聊天和图片理解
python·单片机·ai·嵌入式·面向对象·电子diy