没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
18页
基于Verilog的SPI通信FPGA程序设计,很多外设都会有 Spi 串行接口,比如我们常用下串并转换芯片 74HC595,以及我们米联客的 FEP 扩展 ADC 模块 DAQ7606 也支持串行 SPI 接口。SPI 接口作为一种标准接口而被广泛应用。本文笔者详细讲解 SPI 协议接口的 FPGA 设计,本文实现的是标准的 SPI 接口,很多器件也可以使用非标准的 SPI 接口实现更加灵活的使用。本文的除了提 供 SPI 接口的 FPGA 设计方案,更重要的是让读者继续学习 FPGA 的编程,提高自己的编程能力。在设计任何的通信接口前,我们一定要熟悉协议本身的通信时序,通信格式,SPI 串行通信也不例外。
资源推荐
资源详情
资源评论
基于 Verilog 的 SPI 通信 FPGA 程序设计
很多外设都会有 Spi 串行接口,比如我们常用下串并转换芯片 74HC595,以及我
们米联客的 FEP 扩展 ADC 模块 DAQ7606 也支持串行 SPI 接口。SPI 接口作为
一种标准接口而被广泛应用。本文笔者详细讲解 SPI 协议接口的 FPGA 设计,
本文实现的是标准的 SPI 接口,很多器件也可以使用非标准的 SPI 接口实现更
加灵活的使用。本文的除了提 供 SPI 接口的 FPGA 设计方案,更重要的是让读
者继续学习 FPGA 的编程,提高自己的编程能力。
在设计任何的通信接口前,我们一定要熟悉协议本身的通信时序,通信格式,SPI
串行通信也不例外。下面内 容我们先了解下 SPI 通信协议。
1 技术性能
SPI 接口是 Motorola 首先提出的全双工三线同步串行外围接口,采用主从模式
(MasterSlave)架构;支持多 slave 模式应用,一般仅支持单 Master。时钟由
Master 控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后
(MSBfirst);SPI 接口有 2 根单向数据线,为全双工通信,目前应用中的数
据速率可达几 Mbps 的水平。总线结构 如下图所示。
接口定义:
SPI 接口共有 4 根信号线,分别是:设备选择线、时钟线、串行输出数据线、
串行输入数据线。
(1)MOSI:主器件数据输出,从器件数据输入
(2)MISO:主器件数据输入,从器件数据输出
(3)SCLK:时钟信号,由主器件产生
(4)/SS:从器件使能信号,由主器件控制
时钟极性和时钟相位:
SPI 数据的传输是在串行同步时钟信号(Serial Clock,SCK)的控制下进行的。
主机的时钟发生器一方面控制主机的移位寄存器,另一方面通过从机的 SCK 信
号线来控制从机的移位寄存器,从而保证主机与从机的数据交换是同步进行的。
SPI 串行同步时钟可以设置为不同的极性(Clock Polarity ,CPOL)与相位(Clock
Phase ,CPHA)。
时钟的极性(CPOL)用来决定在总线空闲时,同步时钟(SCK)信号线上的电
位是高电平还是低电平。当时钟极性为 0 时(CPOL=0),SCK 信号线在空闲
时为低电平;当时钟极性为 1 时(CPOL=1),SCK 信号线在空闲时为高电平;
时钟的相位(CPHA)用来决定何时进行信号采样。
当时钟相位为 1 时(CPHA=1),在 SCK 信号线的第二个跳变沿进行采样;
这里的跳变沿究竟是上升沿还是下降沿?取决于时钟的极性。当时钟极性为 0
时,取下降沿;当时钟极性为 1 时,取上升沿;如下图:
CPHA=1 的 SPI 时序
当时钟相位为 0 时(CPHA=0),在 SCK 信号线的第一个跳变沿进行采样。
跳变沿同样与时钟极性有关:当时钟极性为 0 时,取上升沿;当时钟极性为 1
时,取下降沿;如下图:
CPHA=0 的 SPI 时序
数据传输
在一个 SPI 时钟周期内,会完成如下操作:
1)主机通过 MOSI 线发送 1 位数据,从机通过该线读取这 1 位数据;
2)从机通过 MISO 线发送 1 位数据,主机通过该线读取这 1 位数据。
这是通过移位寄存器来实现的。如下图所示,主机和从机各有一个移位寄存器,
且二者连接成环。随着时钟脉冲,数据按照从高位到低位的方式依次移出主机寄
存器和从机寄存器,并且依次移入从机寄存器和主机寄存器。当寄存器中的内容
全部移出时,相当于完成了两个寄存器内容的交换。
2 SPI 发送程序
module master_spi_tx#
(
parameter CPOL = 1'b0,
parameter CPHA = 1'b0
)
(
input clk_i,
output spi_tx_o,//mosi
output spi_clk_o,//SPI 时钟输出 SCK
input spi_tx_en_i,//发送发送使能信号
input [7:0] spi_tx_data_i,//待发送数据
output spi_en_o,//SPI 传输使能
output spi_busy_o//SPI 正在传输
);
//SPI 时钟分频单元
parameter [9:0] SPI_DIV = 10'd499;//分频 假设(50Mhz/100K/ - 1'b1=499
剩余17页未读,继续阅读
资源评论
icysmile131
- 粉丝: 2635
- 资源: 64
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功