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
相关推荐
風清掦17 小时前
【江科大STM32学习笔记-05】EXTI外部中断11
笔记·stm32·学习
小龙报17 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业17 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件
Industio_触觉智能17 小时前
瑞芯微RK3566开发板规格书,详细参数配置,型号EVB3566-V1,基于RK3566核心板SOM3566邮票孔封装
嵌入式硬件·开发板·rk3568·rk3566·核心板·瑞芯微
czwxkn17 小时前
4STM32(stdl)TIM定时器
stm32·单片机·嵌入式硬件
Love Song残响18 小时前
NVIDIA显卡终极优化指南
stm32·单片机·嵌入式硬件
qq_6725927518 小时前
电源芯片为什么发热
单片机·嵌入式硬件
天天爱吃肉821818 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车
国科安芯19 小时前
抗辐照MCU在精密时频系统中的单粒子效应评估与可靠性验证
单片机·嵌入式硬件·架构·制造·安全性测试
森焱森19 小时前
嵌入式硬件工程师应知 白银快速分析报告
linux·c语言·arm开发·嵌入式硬件·去中心化