STM32与FPGA的SPI通信实战:从硬件搭建到代码调试全解析
在嵌入式系统开发中,STM32与FPGA的协同工作越来越常见,而SPI(Serial Peripheral Interface)作为两者间高效通信的首选协议之一,其稳定性和灵活性备受开发者青睐。本文将带您完成一个完整的STM32F103与Xilinx Spartan-6 FPGA的SPI通信项目,从硬件连接到软件实现,再到联调技巧,手把手解决实际开发中可能遇到的各种问题。
1. 硬件准备与连接
1.1 所需硬件清单
在开始项目前,请确保您已准备好以下硬件设备:
- STM32F103开发板(如正点原子MiniSTM32或野火指南者)
- Xilinx Spartan-6 FPGA开发板(如Digilent Atlys或自定义开发板)
- 杜邦线若干(建议使用不同颜色区分信号线)
- USB转串口模块(用于调试信息输出)
- 逻辑分析仪(可选,但强烈推荐用于信号观测)
1.2 SPI引脚连接指南
SPI通信需要正确连接以下四根信号线(以STM32作为主机,FPGA作为从机为例):
| STM32引脚 | FPGA引脚 | 信号类型 | 备注 |
|---|---|---|---|
| PB13 (SCK) | 对应SCK输入 | 时钟信号 | 确保电平匹配 |
| PB14 (MISO) | FPGA的MISO | 主入从出 | 数据输入到STM32 |
| PB15 (MOSI) | FPGA的MOSI | 主出从入 | 数据输出到FPGA |
| PC3 (CS) | FPGA的CS_N | 片选信号 | 低电平有效 |
注意:不同开发板的引脚定义可能有所差异,请根据实际使用的开发板原理图进行调整。若使用其他型号STM32芯片,SPI2的引脚位置也可能不同。
1.3 电平匹配与上拉电阻
STM32F103的IO口工作电压为3.3V,而Xilinx Spartan-6 FPGA通常也支持3.3V电平,但需要注意:
- 如果FPGA开发板设计为5V电平,必须添加电平转换电路
- 建议在SCK、MOSI、MISO线上添加4.7kΩ上拉电阻
- CS信号可根据实际情况决定是否加上拉
常见问题排查:若通信不稳定,首先检查所有连接线是否接触良好,然后用万用表测量各信号线的电压是否符合预期。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. STM32端SPI配置详解
2.1 SPI外设初始化
STM32标准库提供了完善的SPI配置接口,以下是针对STM32F103 SPI2的初始化代码示例:
c复制void SPI2_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// 使能SPI2和GPIO时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// 配置SPI引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15; // SCK和MOSI
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; // MISO
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 配置CS引脚(普通IO)
G
