银杏科技有限公司旗下技术文档发布平台 |
技术支持电话 | 0379-69926675-801 |
技术支持邮件 | Gingko@vip.163.com |
版本 | 日期 | 作者 | 修改内容 |
V1.0 | 2019-12-25 | gingko | 初次建立 |
实验十六:基于SPI总线的ARM+FPGA通信实验
一、实验目的与意义
了解SPI通信的基本原理。
掌握SPI通信基于FPGA的实现方法。
学习基于SPI总线的ARM+FPGA数据传输应用。
二、实验设备及平台
iCore3 双核心板( FPGA型号为EP4CE10F17,ARM型号为STM32F407IGT6)。
点击购买
Blaster(或相同功能的)仿真器和USB线缆。
点击购买
Micro USB线缆。
QuartusII开发软件(本实验中使用的是13.1版本)。
三、实验原理
SPI简介
串行外设接口(SPI)可与外部器件进行半双工/全双工的同步串行通信。通常SPI通过4个引脚与外部器件连接:
MISO:主输入/从输出数据。从模式下发送数据,主模式下接受数据。
MOSI:主输出/从输入数据。从模式下接受数据,主模式下发送数据。
SCLK:主器件的串行时钟输出和从器件的串行时钟输入
CS:从器件选择。挂载多个从器件时,此信号是“片选”信号。
通过FPGA建立的SPI模块对外提供SCLK、CS、MOSI、MISO接口,与STM32的SPI相连接,Commix串口精灵与STM32通过串口连接,实现三者之间的通信。本实验中,Commix串口精灵向STM32发送数据,STM32的RXD端口接收数据,然后,通过SPI把数据发送至FPGA,STM32起到一个桥梁的作用。程序运行后,FPGA收到数据向STM32发送数据,经过STM32发送至Commix串口精灵显示出来,并辅以LED显示进行验证。
本实验中SPI通信双方只有ARM和FPGA,因此信号按照单个主器件/单个从器件的方式连接,既MOSI引脚连接在一起,MISO引脚连接在一起。通过这种方式,主器件和从器件之间以串行方式传输数据(最高有效位在前)。下图为信号连接图:
四、代码讲解
1.FPGA接收数据。
always@(posedge spi_clk or negedge rst_n)
if(!rst_n)
data_in<=40'd0;
else if(!spi_cs)
data_in<=40'd0;
else
data_in<={data_in[38:0],spi_mosi_r};//将SPI输入数据存入data_in寄存器
always@(posedge spi_clk or negedge rst_n)
if(!rst_n)
data<=32'd0;
else if(data_in[7:0] == 8'd13)//“回车”键对应的ASCII码的值为8‘d13
data<=data_in>>8;//取回车键之前的值
else
data<=data;
//对比接收数据//
reg [2:0]led;
always@(posedge CLK_25M or negedge rst_n)
if(!rst_n)
led <= 3'b111;
else if (data == ledr)
led <= 3'b011; //红灯亮
else if (data == ledg)
led <= 3'b101; //绿灯亮
else if (data == ledb)
led <= 3'b110; //蓝灯亮
2.FPGA发送数据。
always@(negedge spi_clk or negedge rst_n)
if(!rst_n)
begin
spi_miso<=1;
data_out<=hello;
end
else if(!spi_cs )
begin
spi_miso <= data_out[39]; //将最高位通过SPI总线发送出去
data_out<=data_out<<1;
end
else
begin
spi_miso<=1'b1;
data_out<=hello;
end
五、操作流程和测试结果
1.操作步骤
把仿真器与iCore3的SWD调试口连接(直接相连或者通过转换器相连);
将USB-Blaster与iCore3的JTAG调试口相连;
将跳线帽插在USB UART;
把iCore3(USB_UART)通过Micro USB线与计算机连接,为iCore3供电;
打开Commix串口精灵,找到对应的端口打开;
打开Quartus II开发环境,并打开实验工程;
烧写FPGA程序到iCore3上;
打开Keil MDK开发环境,并打开实验工程;
烧写ARM程序到iCore3上;
输入串口命令,观察实验现象。
2.实验结果
串口发送命令格式 ARM_LED现象 | FPGA_LED现象 | |
LEDR\CR\LF | 红灯亮 | 红灯亮 |
LEDG\CR\LF | 绿灯亮 | 绿灯亮 |
LEDB\CR\LF | 蓝灯亮 | 蓝灯亮 |
* 在Commix上发送命令后,对应的ARM和FPGA的LED灯亮,同时接收显示:“hello”表示实验成功,如下面两图所示: