手撕原子弹 发表于 2023-4-18 11:07:32

【ACX720】使用SPI实现MCU与FPGA之间的数据交互


使用SPI实现MCU与FPGA之间的数据交互

简介

本案例基于ACX720开发板和STM32F103最小系统板,两块板子之间使用SPI协议进行通信,其中STM32作为主机,FPGA作为从机,STM32通过SPI接口对FPGA发送指令,并实现数据交换功能,兼具FPGA强大与MCU的灵活。



性能

MCU与FPGA之间使用SPI协议,SCK时钟频率最大可设置为36M,数据传输可达4MB每秒,已经足够在一些对速度要求没那么高的场景使用了。

备注:这里的传输速度主要受限于STM32F103的性能,换用其它性能更好的MCU可以提高数据传输速度。

结构框图



在上图中展示了整个系统的结构,由STM32作为主控制器,FPGA作为它的一个外设,可通过SPI接口控制和交换数据。在本例中,STM32可以通过SPI接口连续读写FPGA内部DPRAM的任意地址,也可以通过SPI接口访问FPGA内部的串口功能相关的寄存器,将DPRAM中的任意数据通过FPGA的串口连续发送出去。

用户可以通过修改上图中的“uart_peripheral”来实现其它功能,例如ADC数据采集、摄像头数据采集、可调DDS波形输出、以太网口数据简单收发等,也可以将多种外设搭配使用,实现更复杂的功能。受限于SPI的传输带宽,一些需要MCU参与但对速度要求较高的功能是无法实现的,而且STM32F103不支持跑Linux系统,如果需要高速传输数据或者要求跑Linux系统,还是建议使用内部带硬核的SOC芯片,例如Xilinx的Zynq系列。https://item.taobao.com/item.htm?id=658673771255

功能框图



由上图可知,在该工程中,FPGA可以直接读写内部RAM和寄存器,而STM32可以通过SPI接口间接读写FPGA内部的RAM和寄存器,从而间接控制FPGA的UART外设。

用户可使用其它模块替换掉UART外设,以实现其它外设功能。

功能演示

首先STM32通过SPI接口读取FPGA内部RAM中的初始数据0~255(地址段为0x0000~0x00FF),为了方便展示将获取到的数据通过STM32自带的串口外设打印出来。这里实现了FPGA对内部RAM的写功能与STM32对FPGA内部RAM的读功能。



然后STM32会将一段连续数据0~254通过SPI接口写入FPGA的RAM(地址段为0x0F00~0x0FFE),再通过SPI接口从RAM里把这段数据读取回来,同样使用STM32自带的串口外设把这段数据打印出来。这里实现了STM32对FPGA内部RAM的读写功能。



最后STM32使用SPI接口控制FPGA内的UART寄存器,开启发送功能,从RAM(地址段为0x0F00~0x0FFE)中连续取出255个数据并使用UART外设发送出来。这里实现了STM32对FPGA内部寄存器的读写功能,以及FPGA对内部寄存器的读写功能。



附件

具体的说明文档和工程源码在这里,供大家下载学习












页: [1]
查看完整版本: 【ACX720】使用SPI实现MCU与FPGA之间的数据交互