在200K/500KSPS高速采样场景下,如何保证数据不丢失?本文深入解析DABM-D223的USB HS 480M高速传输架构、双缓冲DMA机制、FPGA SRAM硬件记录仪以及FRAM铁电存储三级存储体系。
一、数据吞吐的挑战
在工业数据采集领域,采样率与数据传输速率之间存在一条看不见的红线。以DABM-D223为例:
| 采样率 | 8通道数据量 | 每帧数据量(含帧头CRC) |
|---|---|---|
| 200KSPS | 3.2 MB/s | ~3.3 MB/s |
| 500KSPS | 8.0 MB/s | ~8.2 MB/s |
传统USB 2.0 Full Speed的理论带宽仅12Mbps(1.5MB/s),远远无法满足实时传输需求。即便是USB 2.0 High Speed的480Mbps(60MB/s),在实际应用中受协议开销影响,有效带宽约为30-40MB/s。
DABM-D223选择USB HS 480M作为唯一通信接口,正是为了在500KSPS采样率下保证数据实时传输无瓶颈。
二、USB HS 480M:STM32H743的高速通信利器
2.1 USB OTG HS硬件接口
STM32H743内置USB OTG HS(High Speed)接口,速度达到480Mbit/s,支持设备/主机/OTG外设模式。这一接口的特点:
- PHY集成:内置高速PHY,无需外接USB收发器
- DMA支持:USB传输可与DMA结合,进一步降低CPU开销
- CDC虚拟串口:D223使用USB CDC类实现虚拟串口通信,上位机无需安装驱动
2.2 USB私有协议
D223采用USB私有协议进行数据传输,而非标准的Modbus TCP/RTU协议(这是DABL7606和DABL-G511的方案)。私有协议的优势在于:
- 更低的协议开销:去除Modbus的地址、功能码等冗余字段
- 更高的帧效率:自定义帧头+数据+CRC16校验,数据载荷占比更高
- 更适合高速场景:针对大数据量连续传输优化
2.3 USB帧结构
每帧数据的结构为:
[帧头] + [ADC数据(使能通道×2字节×采样点数)] + [CRC16校验]
帧头包含同步标识和帧长度信息,CRC16保证数据完整性。STM32在主线程中检测双缓冲标志位,一旦缓冲区填满,立即打包帧头和CRC,通过usb_sendMsg()发送。
三、双缓冲DMA机制:采集与传输的流水线
3.1 为什么需要双缓冲?
在单缓冲架构下,采集线程填满缓冲区后,必须等待USB传输完成后才能继续写入新数据。这段等待时间内,ADC产生的新数据无处可存,造成数据间隙。
双缓冲(Ping-Pong Buffer)机制完美解决了这个问题:
时间轴 →→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→
缓冲区A:[填充中...] → [满!发送中...] → [填充中...] → [满!发送中...]
缓冲区B: [填充中...] → [满!发送中...] → [填充中...]
↑ A和B交替工作
3.2 D223的双缓冲实现
定时器中断中(采集侧):
c
for(j=0; j<_uadc.adc_BufIndexGap; j++) {
for(i=0; i<8; i++) {
if(通道i使能) {
_adcBuf.data[_uadc.adc_collectIndex++] = SWAP16(ADC数据);
// A缓冲满 → 标记flag=2,切换到B缓冲
// B缓冲满 → 标记flag=3,切换回A缓冲
}
}
}
主线程中(传输侧):
c
if(adc_collectFullFlag == 2) {
// A缓冲满 → 打包帧头+CRC → USB发送
usb_sendMsg(&_adcBuf, frameLen);
adc_collectFullFlag = 0;
}
else if(adc_collectFullFlag == 3) {
// B缓冲满 → 同上
usb_sendMsg(&_adcBufB, frameLen);
adc_collectFullFlag = 0;
}
3.3 大小端转换
AD7606输出的16位数据与STM32内存中的字节序可能不一致。代码中使用SWAP16()函数进行大小端转换,确保数据正确解析:
c
_adcBuf.data[_uadc.adc_collectIndex++] = SWAP16(ADC数据);
这是一个容易被忽略但至关重要的细节------如果忽略字节序转换,16位ADC值的高8位和低8位会颠倒,导致测量结果完全错误。
四、FPGA SRAM硬件记录仪
4.1 记录仪的三种模式
D223的SRAM记录仪支持三种工作模式:
| 模式 | 说明 | 触发方式 |
|---|---|---|
| 连续记录 | SRAM环形覆盖,始终记录最新数据 | 自动 |
| 单点记录 | 记录触发时刻前后一段数据 | 外部触发 |
| 多点记录 | 多次触发,每次记录一段数据 | 外部触发 |
4.2 FPGA直接写SRAM
SRAM记录的最大特点是FPGA直接控制写入,不经过CPU。这意味着:
- 写入速度不受CPU限制:FPGA以硬件速度写入SRAM,可达到最高采样率
- CPU可同时执行其他任务:记录期间STM32可以处理USB通信、DAC输出等
- 外部触发响应极快:FPGA硬件检测触发信号,延迟在纳秒级
ARM通过寄存器配置SRAM记录参数:
c
// ARM → FPGA 寄存器
REG_SRAM_WORK_STATE1; // 0xff=复位, 1=SRAM记录, 2=停止, 3=在线采集
REG_SRAM_WORK_STATE2; // 外部触发使能
REG_SRAM_RECORD_MAX_LEN1; // 记录长度[7:0]
REG_SRAM_RECORD_MAX_LEN2; // 记录长度[15:8]
REG_SRAM_RECORD_MAX_LEN3; // 记录长度[23:16]
4.3 SRAM数据回读
触发事件发生后,STM32检测到外部触发状态变化,切换到SRAM读取模式:
c
// 1. 通知FPGA停止记录
_regA2FMap.REG_SRAM_WORK_STATE1 = 2;
fpga_write_register();
// 2. 循环读取SRAM并通过USB上传
while(未读完) {
QSPI_ReadDatas_DMA(0xEB, 6, ...); // 从SRAM读取数据(24位地址)
usb_sendMsg(...); // USB上传
}
SRAM读取使用QSPI命令码0xEB,24位地址空间,6个dummy cycle。读取完成后,数据通过USB上传到上位机进行波形回放和分析。
4.4 在线采集模式与记录模式的切换
D223支持两种工作模式之间的无缝切换:
- 在线采集模式 (
_deviceWorkMode_onlineRecord):ADC数据实时通过FIFO → QSPI DMA → 双缓冲 → USB上传 - SRAM记录模式:ADC数据由FPGA直接写入SRAM,触发后回读上传
模式切换通过REG_SRAM_WORK_STATE1寄存器控制,FPGA根据该寄存器值决定数据流向。
五、FRAM铁电存储器:参数的永久守护者
5.1 为什么选择FRAM?
FRAM(铁电随机存取存储器)兼具RAM的随机读写速度和ROM的非易失性,是存储配置参数的理想选择。D223使用SPI3接口连接MB85RS16PNF铁电存储器。
| 特性 | FRAM | EEPROM | Flash |
|---|---|---|---|
| 写入方式 | 随机写入 | 页写入 | 块擦除+写入 |
| 写入寿命 | 10^12次 | 10^6次 | 10^5次 |
| 写入速度 | 极快(ns级) | 慢(ms级) | 慢(ms级) |
| 掉电保持 | 是 | 是 | 是 |
| 数据保存 | 10年+ | 100年 | 20年 |
FRAM的10^12次写入寿命意味着,即使每秒写入100次参数,也可以持续使用超过300年,无需考虑磨损问题。
5.2 FRAM存储内容
D223的FRAM中存储了所有关键配置参数:
- ADC采样参数(采样率、通道使能、量程)
- ADC两点标定参数(数字量、模拟量、有效标志)
- DAC输出参数(波形模式、频率、幅度、偏置)
- DAC标定参数
- PWM参数(频率、占空比)
- 设备工作模式
5.3 FRAM驱动
c
// FRAM写操作
void FramWrite(u8* data, u16 addr, u16 len) {
FRAM_CS(0);
HAL_SPI_Transmit(&hspi3, WREN, 1, 100); // 写使能
FRAM_CS(1);
FRAM_CS(0);
HAL_SPI_Transmit(&hspi3, WRITE+addr, 3, 100); // 写命令+地址
HAL_SPI_Transmit(&hspi3, data, len, 100); // 写数据
FRAM_CS(1);
FRAM_CS(0);
HAL_SPI_Transmit(&hspi3, WRDI, 1, 100); // 写禁止
FRAM_CS(1);
}
写操作采用标准的"WREN → WRITE → WRDI"三步时序,确保数据安全写入。
六、三级存储体系
D223构建了一个层次分明的三级存储体系:
┌─────────────────────────────────────────────┐
│ 第一级:FPGA SRAM(高速缓存) │
│ • 容量:64MB │
│ • 速度:硬件级,无CPU介入 │
│ • 用途:实时波形记录、触发前后数据缓存 │
│ • 特点:环形覆盖,断电丢失 │
├─────────────────────────────────────────────┤
│ 第二级:FRAM铁电存储(参数存储) │
│ • 容量:16Kbit │
│ • 速度:SPI总线,微秒级 │
│ • 用途:标定参数、配置参数、工作状态 │
│ • 特点:掉电不丢,10^12次写入寿命 │
├─────────────────────────────────────────────┤
│ 第三级:USB上传至上位机(永久存储) │
│ • 容量:取决于PC │
│ • 速度:USB HS 480M │
│ • 用途:实时数据采集上传、SRAM历史数据回放 │
│ • 特点:实时在线,永久保存 │
└─────────────────────────────────────────────┘
七、产品介绍:DABM-D223的存储与通信系统
| 参数 | 规格 |
|---|---|
| 通信接口 | USB HS 480M |
| 通信协议 | USB私有协议(帧头+CRC16) |
| 传输机制 | QSPI四线DMA + 双缓冲乒乓 |
| SRAM记录 | FPGA硬件直接写入,支持连续/单点/多点 |
| 外部触发 | FPGA硬件检测,纳秒级响应 |
| FRAM | MB85RS16PNF,SPI3接口,10^12次写入寿命 |
| 存储层级 | SRAM(高速缓存)→ FRAM(参数)→ USB(上传) |
与其他型号对比
| 型号 | 通信接口 | 存储器 | 记录仪 | 协议 |
|---|---|---|---|---|
| DABL7606 | USB2.0/RS485/以太网 | SRAM/FLASH/FRAM | SRAM/Flash/连续/单点/多点 | Modbus TCP/RTU/私有 |
| DABL-G511 | USB2.0/RS485/以太网 | SRAM/FRAM | SRAM/连续/单点/多点 | Modbus TCP/RTU/私有 |
| DABM-D223 | USB HS 480M | SRAM/FRAM | SRAM/连续/单点/多点 | USB私有协议 |
D223放弃了RS485和以太网接口,专注于USB HS高速传输,这是其500KSPS采样率下的必然选择------唯有USB HS的带宽才能满足8通道500KSPS实时上传需求。
八、总结
DABM-D223的数据存储与传输系统体现了"高速、可靠、分层"的设计理念:
- USB HS 480M:提供60MB/s理论带宽,满足500KSPS实时传输
- QSPI四线DMA + 双缓冲:采集与传输流水线化,零数据间隙
- FPGA SRAM硬件记录仪:脱离CPU的硬件级记录,支持外部触发
- FRAM铁电存储:10^12次写入寿命,参数永久保存
- 三级存储体系:SRAM缓存→FRAM参数→USB上传,各司其职
这套系统确保了在高采样率下数据的完整性和实时性,是DABM-D223作为高速数据采集卡的核心竞争力之一。
本文为ZLinear DABM-D223系列技术文章第四篇,后续将介绍标定系统与精度提升等主题。