主控芯片
- 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