Add complete data acquisition pipeline with LTC2508 ADC drivers, correction algorithms, data storage, and system monitoring. Includes ARM DSP optimized matrix operations for sensor calibration, SD card data logging with USB mass storage, and robust error handling with validation throughout the processing chain. - Add LTC2508 multi-channel SPI driver with DMA support and error recovery - Implement correction module with ARM DSP matrix operations for sensor calibration - Add data storage system with SD card logging and configurable file management - Integrate system monitor for health tracking and error reporting - Enhance data packet structure with CRC validation and timestamps - Add USB mass storage interface for SD card access - Implement comprehensive error handling and statistics collection
106 lines
2.9 KiB
C
106 lines
2.9 KiB
C
#include "data_packet.h"
|
|
#include "stddef.h"
|
|
#include "stm32f4xx_hal.h"
|
|
|
|
// CRC16-MODBUS算法实现
|
|
uint16_t Calculate_CRC16(const uint8_t *data, uint16_t len) {
|
|
uint16_t crc = 0xFFFF;
|
|
for (uint16_t i = 0; i < len; i++) {
|
|
crc ^= data[i];
|
|
for (uint8_t j = 0; j < 8; j++) {
|
|
if (crc & 0x0001) {
|
|
crc = (crc >> 1) ^ 0xA001;
|
|
} else {
|
|
crc = crc >> 1;
|
|
}
|
|
}
|
|
}
|
|
return crc;
|
|
}
|
|
|
|
void PackData(DataPacket_t *packet, int32_t adc1, int32_t adc2, int32_t adc3)
|
|
{
|
|
if (packet == NULL) return;
|
|
|
|
// 设置包头
|
|
packet->start_byte = PACKET_START_BYTE;
|
|
|
|
// 设置时间戳
|
|
packet->timestamp = HAL_GetTick();
|
|
|
|
// 设置ADC数据
|
|
packet->adc_data1 = adc1;
|
|
packet->adc_data2 = adc2;
|
|
packet->adc_data3 = adc3;
|
|
|
|
// 计算校验和 (不包括校验和字段本身和包尾)
|
|
uint16_t checksum = Calculate_CRC16((uint8_t*)packet,
|
|
sizeof(DataPacket_t) - sizeof(packet->checksum) - sizeof(packet->end_byte));
|
|
packet->checksum = checksum;
|
|
|
|
// 设置包尾
|
|
packet->end_byte = PACKET_END_BYTE;
|
|
}
|
|
|
|
uint8_t ValidatePacket(const DataPacket_t *packet)
|
|
{
|
|
if (packet == NULL) return 0;
|
|
|
|
// 检查包头
|
|
if (packet->start_byte != PACKET_START_BYTE) return 0;
|
|
|
|
// 检查包尾
|
|
if (packet->end_byte != PACKET_END_BYTE) return 0;
|
|
|
|
// 验证校验和
|
|
uint16_t calculated_crc = Calculate_CRC16((uint8_t*)packet,
|
|
sizeof(DataPacket_t) - sizeof(packet->checksum) - sizeof(packet->end_byte));
|
|
|
|
if (calculated_crc != packet->checksum) return 0;
|
|
|
|
return 1; // 验证通过
|
|
}
|
|
|
|
uint8_t ValidateCorrectedPacket(const CorrectedDataPacket_t *packet)
|
|
{
|
|
if (packet == NULL) return 0;
|
|
|
|
// 检查包头
|
|
if (packet->start_byte != PACKET_START_BYTE) return 0;
|
|
|
|
// 检查包尾
|
|
if (packet->end_byte != PACKET_END_BYTE) return 0;
|
|
|
|
// 验证校验和
|
|
uint16_t calculated_crc = Calculate_CRC16((uint8_t*)packet,
|
|
sizeof(CorrectedDataPacket_t) - sizeof(packet->checksum) - sizeof(packet->end_byte));
|
|
|
|
if (calculated_crc != packet->checksum) return 0;
|
|
|
|
return 1; // 验证通过
|
|
}
|
|
|
|
void PackCorrectedData(CorrectedDataPacket_t *packet, float x, float y, float z)
|
|
{
|
|
if (packet == NULL) return;
|
|
|
|
// 设置包头
|
|
packet->start_byte = PACKET_START_BYTE;
|
|
|
|
// 设置时间戳
|
|
packet->timestamp = HAL_GetTick();
|
|
|
|
// 设置校正后数据
|
|
packet->corrected_x = x;
|
|
packet->corrected_y = y;
|
|
packet->corrected_z = z;
|
|
|
|
// 计算校验和
|
|
uint16_t checksum = Calculate_CRC16((uint8_t*)packet,
|
|
sizeof(CorrectedDataPacket_t) - sizeof(packet->checksum) - sizeof(packet->end_byte));
|
|
packet->checksum = checksum;
|
|
|
|
// 设置包尾
|
|
packet->end_byte = PACKET_END_BYTE;
|
|
}
|