STM32H750VBT6通过SPI控制24位高速ADC实战:逻辑分析仪抓包全解析
引言
在精密测量系统中,高速24位ADC(如AD7793、CS553X系列)常通过SPI接口与微控制器通信。本文以STM32H750VBT6为主控,驱动24位Σ-Δ型ADC-LHA7530,结合逻辑分析仪捕获SPI波形,深入解析命令发送、寄存器配置、数据读取的全流程。文中将关键波形图截出,读者可对照代码与实测数据验证通信逻辑。
一、硬件与SPI配置
1. 硬件连接
- STM32H750VBT6(主设备)与24位ADC(从设备)引脚连接:
SCLK
→ PA5(SPI1时钟)MOSI
→ PA7(SPI1输出)MISO
→ PA6(SPI1输入)CS
→ PE3(自定义GPIO片选)
- ADC供电:3.3V,基准电压2.5V。
2. SPI参数配置(STM32CubeMX)
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT; // 8位命令字 + 24位数据
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // CPOL=0
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA=0
hspi1.Init.NSS = SPI_NSS_SOFT; // 软件控制片选
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; // 10 MHz
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; // 高位先行
HAL_SPI_Init(&hspi1);
二、SPI协议关键操作与波形分析
以下操作均通过逻辑分析仪(如Saleae Logic)捕获波形,截图位置预留,读者可自行补充。
1. 命令与数据字时序(Command and Data Word Timing)
- 协议要求:
- 每个SPI事务以
CS
拉低开始,拉高结束。 - 命令字为8位,数据字为24位(MSB先行)。
- 时钟空闲低电平(CPOL=0),数据在第一个边沿采样(CPHA=0)。
- 每个SPI事务以
- 波形解读:
CS
拉低后,SCLK开始输出,MOSI发送命令字(如0x10
),随后发送24位数据。- MISO在命令字发送完成后返回ADC数据。
2. 写配置寄存器(Write Configuration Register)
代码示例:
void ADC_WriteReg(uint8_t reg_addr, uint32_t data) {
uint8_t cmd = 0x00 | (reg_addr << 3); // 写命令:0b000 + 寄存器地址
uint8_t tx_buf[4] = {
cmd,
(data >> 16) & 0xFF, // 数据高位
(data >> 8) & 0xFF,
data & 0xFF
};
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, tx_buf, 4, 100);
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
}
逻辑分析仪配合Keil调试写配置寄存器:
分析要点:
- MOSI发送4字节:命令字(如
0x08
对应配置寄存器) + 24位配置值。 - MISO无有效数据返回。
3. 读配置寄存器(Read Configuration Register)
代码示例:
uint32_t ADC_ReadReg(uint8_t reg_addr) {
uint8_t cmd = 0x40 | (reg_addr << 3); // 读命令:0b100 + 寄存器地址
uint8_t tx_buf[4] = {cmd, 0x00, 0x00, 0x00};
uint8_t rx_buf[4] = {0};
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1, tx_buf, rx_buf, 4, 100);
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
return (rx_buf[1] << 16) | (rx_buf[2] << 8) | rx_buf[3];
}
逻辑分析仪配合Keil调试读配置寄存器:
分析要点:
- MOSI发送读命令(如
0x48
) + 3字节空数据。 - MISO返回24位寄存器值(需忽略首字节)。
4. 启动转换(Start Conversion)
代码示例:
void ADC_StartConversion(void) {
uint8_t cmd = 0x80; // 启动单次转换命令
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, &cmd, 1, 100);
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
}
逻辑分析仪配合Keil调试数据转换:
分析要点:
- 发送单字节命令
0x80
,ADC开始采样。 - 转换完成后DRDY引脚拉低(需额外GPIO监测)。
5. 读取转换数据(Read Data)
代码示例:
int32_t ADC_ReadData(void) {
uint8_t cmd = 0x40; // 读数据命令(假设数据寄存器地址0x00)
uint8_t tx_buf[4] = {cmd, 0x00, 0x00, 0x00};
uint8_t rx_buf[4] = {0};
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1, tx_buf, rx_buf, 4, 100);
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
return (rx_buf[1] << 16) | (rx_buf[2] << 8) | rx_buf[3];
}
逻辑分析仪配合Keil调试读取数据:
分析要点:
- MOSI发送读数据命令
0x40
+ 3字节空数据。 - MISO返回24位有符号数据(需补码转换)。
三、调试技巧与常见问题
-
逻辑分析仪设置:
-
采样率 ≥ 4倍SCLK频率(如10 MHz时钟需≥40 MHz采样)。
-
触发条件设为
CS下降沿
。 -
使用SPI协议解码器自动解析数据。
-
-
典型问题排查:
- 数据错位:检查SPI时钟相位(CPHA)是否与ADC要求一致。
- 无响应:确认片选信号是否在传输期间保持低电平。
- 噪声干扰:缩短SPI走线,增加地线屏蔽。
四、总结
通过逻辑分析仪捕获的SPI波形,开发者可直观验证:
- 命令字与数据字时序是否符合预期。
- 寄存器读写操作是否成功。
- 转换数据是否准确传输。
附:完整代码与波形图
相关标签:#STM32H750
#SPI协议
#24位ADC
#逻辑分析仪
讨论区:你在SPI调试中遇到过哪些问题?欢迎留言分享!