前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SPI协议_Verilog实现「建议收藏」

SPI协议_Verilog实现「建议收藏」

作者头像
全栈程序员站长
发布于 2022-11-04 08:39:20
发布于 2022-11-04 08:39:20
2.1K00
代码可运行
举报
运行总次数:0
代码可运行

SPI协议_Verilog实现

概述: 通过Verilog代码+仿真的形式来理解SPI的时序,此处只写了主机发送,从机接收的代码,后待续。。。

文章目录


## **SPI协议简介**

●SPI接口介绍

SCK:时钟信号,由主设备产生,所以主设备SCK信号为输出模式,从设备的SCK信号为输入模式。   CS:使能信号,由主设备控制从设备,,所以主设备CS信号为输出模式,从设备的CS信号为输入模式。   MOSI:主设备数据输出,从设备数据输入,所以主设备MOSI信号为输出模式,从设备的MOSI信号为输入模式。   MISO:主设备数据输入,从设备数据输出,所以主设备MISO信号为输入模式,从设备的MISO信号为输出模式。

●SPI接口连接图

  注意:MOSI和MISO不能交叉连接(可以把主从机理解为一个整体系统,MOSI为系统主机发送从机接收的数据线,MISO为主机接收从机发送的数据线)。

●SPI数据传输方向

SPI作为全双工的的串行通信协议,数据传输时高位在前,低位在后。主机和从机公用由主机产生的SCK信号,所以在每个时钟周期内主机和从机有1bit的数据交换(因为MOSI和MISO数据线上的数据都是在时钟的边沿处被采样)。   如下图:

 SPI协议规定数据采样是在SCK的上升沿或下降沿时刻(由SPI模式决定,下面会说到),观察上图,在SCK的边沿处,主机会在MISO处采样(接收来从机的数据),从机会在MOSI处采样(接收来自主机的数据),所以每个时钟周期中会有一bit的数据交换。

●SPI传输模式

SPI总线传输一共有4种模式,这4种模式分别由时钟极性(CPOL)和时钟相位(CPHA)来定义。

CPOL

CPHA

规定了SCK时钟信号空闲状态的电平

规定了数据是在SCK时钟的上升沿还是下降沿被采样

———–

————————————

模式0:CPOL=0,CPHA =0

SCK空闲为低电平,数据在SCK的上升沿被采样(提取数据)

模式1:CPOL=0,CPHA =1

SCK空闲为低电平,数据在SCK的下降沿被采样(提取数据)

模式2:CPOL=1,CPHA =0

SCK空闲为高电平,数据在SCK的下降沿被采样(提取数据)

模式3:CPOL=1,CPHA =1

SCK空闲为高电平,数据在SCK的上升沿被采样(提取数据)

以模式0为例: SCK空闲为低电平,数据在SCK的上升沿被采样(提取数据)。

  ◐在时钟的第1个上升沿(游标1处)(采样点)   MOSI上数据为1,则在此边沿从机采样(提取)数据为1,采样点在MOSI数据线的中间(游标1处)。   MISO上数据为0,则在此边沿主机采样(提取)数据为0,采样点在MISO数据线的中间(游标1处)。   ◐在时钟的第1个下降沿(游标2处)(切换点)   MOSI上数据由1切换为0,数据在时钟下降沿时切换数据。   MISO上数据由0切换为1,数据在时钟下降沿时切换数据。   ◐在时钟的第2~8个上升沿(采样点),主机在MISO上采样数据,从机在MOSI上采样数据。   ◐在时钟的第2~8个下降沿(切换点),主机在MISO上切换数据,从机在MOSI上切换数据。

SPI_verilog实现

✯主机发送代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//采用SPI模式0:上升沿采样数据,下降沿切换数据
module SPI_MasterToSlave(CLK_50M,RST_N,SCK,CS,MOSI);
input CLK_50M;
input RST_N;
output reg SCK;
output reg CS;
output reg MOSI;
reg[7:0] Send_Data = 8'hA5;//所要发送的数据
/*构造状态机*/
reg[3:0] Data_State = 4'd0;
parameter D7_State = 4'd0;//发送最高位数据-状态
parameter D6_State = 4'd2;
parameter D5_State = 4'd4;
parameter D4_State = 4'd6;
parameter D3_State = 4'd8;
parameter D2_State = 4'd10;
parameter D1_State = 4'd12;
parameter D0_State = 4'd14;//发送最低位数据-状态
always@(posedge CLK_50M or negedge RST_N)
begin
if(RST_N == 0)//复位
begin
SCK <= 1'b0;    //SCK初始电平为低
CS <= 1'b1;     //CS初始电平为高
MOSI <= 1'b0;   //MOSI初始电平为低
end
else//产生SPI时序
begin
CS <= 0;//CS拉低准备数据传输
case(Data_State)
4'd1,4'd3,4'd5,4'd7,4'd9,4'd11,4'd13,4'd15://每次放置数据完毕后 在此拉高时钟线,便于下次的下降沿产生
begin
SCK <= 1'b1;//准备在下降沿放置数据,提前将SCK拉高
Data_State <= Data_State + 4'd1;//切换为数据放置状态(每发完1bit数据进入此一次,将时钟线拉高)
end
D7_State://7位数据发送状态
begin
MOSI <= Send_Data[7];//D7数据
SCK <= 1'b0;//在下降沿放置数据
Data_State <= Data_State + 4'd1;//切换状态
end
D6_State://6位数据发送状态
begin
MOSI <= Send_Data[6];//D6数据
SCK <= 1'b0;//在下降沿放置数据
Data_State <= Data_State + 4'd1;//切换状态
end
D5_State://5位数据发送状态
begin
MOSI <= Send_Data[5];//D5数据
SCK <= 1'b0;//在下降沿放置数据
Data_State <= Data_State + 4'd1;//切换状态
end
D4_State://4位数据发送状态
begin
MOSI <= Send_Data[4];//D4数据
SCK <= 1'b0;//在下降沿放置数据
Data_State <= Data_State + 4'd1;//切换状态
end
D3_State://3位数据发送状态
begin
MOSI <= Send_Data[3];//D3数据
SCK <= 1'b0;//在下降沿放置数据
Data_State <= Data_State + 4'd1;//切换状态
end
D2_State://2位数据发送状态
begin
MOSI <= Send_Data[2];//D2数据
SCK <= 1'b0;//在下降沿放置数据
Data_State <= Data_State + 4'd1;//切换状态
end
D1_State://1位数据发送状态
begin
MOSI <= Send_Data[1];//D1数据
SCK <= 1'b0;//在下降沿放置数据
Data_State <= Data_State + 4'd1;//切换状态
end
D0_State://0位数据发送状态
begin
MOSI <= Send_Data[0];//D0数据
SCK <= 1'b0;//在下降沿放置数据
Data_State <= Data_State + 4'd1;//切换状态
end
default: Data_State <= D7_State;
endcase
end
end
/*链接从机模块*/
SlaveGetMaster u2
(
.CLK_50M(CLK_50M),
.RST_N(RST_N),
.MOSI(MOSI),
.CS(CS),
.SCK(SCK)
);
endmodule

代码解析见代码注释,整体代码思路即SPI的模式0:SCK的上升沿采样数据,SCK的下降沿切换数据。

✯发送波形

  ★波形解析:主机发送的数据为0xA5,主机所执行的操作为将所要发送的8bit数据从高到低位依次在SCK的下降沿放置在MOSI数据线上,观察波形在图中①-⑧序号点为SCK的下降沿,在此下降沿时MOSI的数据进行了切换(因为从机要在时钟沿的上升沿采集数据,所以上升沿之前数据保持了稳定)。

✯从机接收代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//从机接收MOSI的数据 在上升沿的时候采样数据
module SlaveGetMaster(CLK_50M,RST_N,SCK,CS,MOSI);
input CLK_50M;
input RST_N;
input SCK;
input CS;
input MOSI;
reg [7:0] Rec_Data=8'd0;
reg[3:0] Data_State = 4'd0;
parameter D7_State = 4'd0;
parameter D6_State = 4'd1;
parameter D5_State = 4'd2;
parameter D4_State = 4'd3;
parameter D3_State = 4'd4;
parameter D2_State = 4'd5;
parameter D1_State = 4'd6;
parameter D0_State = 4'd7;
always@(posedge SCK)
begin
if(CS == 1)  //CS为高,从机不响应
Rec_Data <= 8'b0000_0000;
else        //CS为低,从机开始接收数据
begin
if(SCK == 1)
begin
case(Data_State)
D7_State:begin Rec_Data[7] <= MOSI; Data_State<= D6_State;end
D6_State:begin Rec_Data[6] <= MOSI; Data_State<= D5_State;end
D5_State:begin Rec_Data[5] <= MOSI; Data_State<= D4_State;end
D4_State:begin Rec_Data[4] <= MOSI; Data_State<= D3_State;end
D3_State:begin Rec_Data[3] <= MOSI; Data_State<= D2_State;end
D2_State:begin Rec_Data[2] <= MOSI; Data_State<= D1_State;end   
D1_State:begin Rec_Data[1] <= MOSI; Data_State<= D0_State;end
D0_State:begin Rec_Data[0] <= MOSI; Data_State<= D7_State;end          
default:Data_State<= D7_State;                          
endcase
end
end
end
endmodule

代码解析见代码注释,整体代码思路即SPI的模式0:SCK的上升沿采样数据。

✯从机接收波形

  ★波形解析:从机执行的操作为在SCK的上升沿对MOSI数据进行采样,即图中①-⑧序号点为从机对MOSI数据线的采样点。仔细观察采样点在每bit数据的中间点,满足采样定理。8bit数据均接收完毕后所得的数据为0xA5,正是主机发送的数据。 ★注意:若从机发送主机接收:则从机将数据放置在MISO数据线,主机从MISO数据线上采样数据。 经过以上描述应该明白MISO,MOSI数据线不能交叉连接的原因了*–*。

附:SPI协议_STM32实现

★★★如有错误欢迎指导。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/181668.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于fpga的spi通信设计_协议的概念
SPI(Serial Peripheral Interface)——串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM、FLASH、实时时钟,AD转换器以及数字信号处理器和数字信号解码器之间。SPI是一种高速,全双工,同步的通信总线,在芯片上只占用四根线(CS、MOSI、MISO、SCK),极大的节约了芯片的引脚。
全栈程序员站长
2022/11/19
8090
基于fpga的spi通信设计_协议的概念
fpga的spi的编程_UASP协议
FPGA实现的SPI协议(二)—-基于SPI接口的FLASH芯片M25P16的使用
全栈程序员站长
2022/11/03
1.3K0
fpga的spi的编程_UASP协议
SPI协议代码
概述:    通过两个MCU(STM32F103)来模拟SPI的主从机,完成主机发送从机接收,便于理解SPI协议。
全栈程序员站长
2022/11/03
7260
SPI协议代码
SPI 接口协议的Verilog HDL 实现
1.串行外设接口SPI(Serial Peripheral Interface)是一种由Motorola 公司推出的一种同步串行接口,得到了广泛应用。SPI 接口可以共享,便于组成带多个SPI 接口器件的系统,且传送速率可编程,连接线少,具有良好的扩展性,是一种优秀的同步时序电路。 SPI,顾名思义就是串行外围设备接口,只需4 条线就可以完成主、从与各种外围器件全双工同步通讯。4 根接口线分别是:串行时钟线(SCK)、主机输入/从机输出数据线(MISO)、主机输出/从机输入数据线(MOSI)、低电平有效从机
瓜大三哥
2018/02/24
3K1
SPI 接口协议的Verilog HDL 实现
2.2 SPI协议的FPGA实现
  SPI(Serial Peripheral Interface,串行外围设备接口),是Motorola公司提出的一种同步串行接口技术,是一种高速、全双工、同步通信总线,在芯片中只占用四根管脚用来控制及数据传输,广泛用于EEPROM、Flash、RTC(实时时钟)、ADC(数模转换器)、DSP(数字信号处理器)以及数字信号解码器上。SPI通信的速度很容易达到好几兆bps,所以可以用SPI总线传输一些未压缩的音频以及压缩的视频。   下图是只有2个chip利用SPI总线进行通信的结构图
碎碎思
2020/06/30
2.3K0
FPGA实现spi协议通信_fpga pll
SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间,要求通讯速率较高的场合。
全栈程序员站长
2022/11/09
1.4K0
FPGA实现spi协议通信_fpga pll
FPGA零基础学习:SPI 协议驱动设计(上)
本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。
FPGA技术江湖
2021/03/23
1.1K0
FPGA零基础学习:SPI 协议驱动设计(上)
SPI
SPI全称为Seriel Peripheral Interface (串行外设接口),是 MCU 中常用的外设接口。SPI 通信原理很简单,它是以主从方式进行工作,通常有一个主设备和一个或多个从设备,至少需要4根线(支持全双工)工作,分别为 MISO(主入从出),MOSI(主出从入),SCLK(时钟),SS(片选)。
瓜大三哥
2020/07/24
2K0
FPGA零基础学习:SPI 协议驱动设计
本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。
FPGA技术江湖
2020/12/30
1.7K0
SPI协议,这篇就够了!
IIC支持热拔插吗?(附有详细CW32 IIC协议解读) 不知道你学会没有?我在这些低速实验写完以后会给出逻辑分析仪的调试步骤。
云深无际
2025/01/07
8100
SPI协议,这篇就够了!
SPI 协议详解_cifs协议
SPI 全称是 Serial Perripheral Interface,也就是串行外围设备接口。 SPI 是 Motorola 公司推出的一种同步串行接口技术,是一种高速、全双工的同步通信总线, SPI 时钟频率相比 I2C 要高很多,最高可以工作在上百 MHz。 SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,一般 SPI 需要4 根线,但是也可以使用三根线(单向传输)
全栈程序员站长
2022/11/03
2.1K0
SPI 协议详解_cifs协议
SPI协议简单介绍
串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。同时系统的更改和扩充极为容易。
全栈程序员站长
2022/11/04
2K0
SPI协议简单介绍
一文搞懂SPI通信协议
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是美国摩托罗拉公司(Motorola)最先推出的一种同步串行传输规范,也是一种单片机外设芯片串行扩展接口,是一种高速、全双工、同步通信总线,所以可以在同一时间发送和接收数据,SPI没有定义速度限制,通常能达到甚至超过10M/bps。
不脱发的程序猿
2022/06/16
6K0
一文搞懂SPI通信协议
SPI协议解析
SPI是串行外设接口的缩写,是一种高速的,全双工,同步的通信总线。由于SPI高速和同步的特性,使其成为嵌入式系统和小型设备中使用最广泛的几种通信接口之一。本文将详细讲解一下SPI,并且最后基于STM32编写一个例程。
跋扈洋
2023/09/02
1.6K0
SPI协议解析
Verilog:【8】基于FPGA实现SD NAND FLASH的SPI协议读写
在此介绍的是使用FPGA实现SD NAND FLASH的读写操作,以雷龙发展提供的CS创世SD NAND FLASH样品为例,分别讲解电路连接、读写时序与仿真和实验结果。
用户11033168
2024/06/21
2270
Verilog:【8】基于FPGA实现SD NAND FLASH的SPI协议读写
什么是SPI?SPI的优点有哪些?
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是Motorola公司推出的一种同步串行接口技术,是一种高速、全双工、同步的通信总线。
天天Lotay
2023/01/13
2.7K0
什么是SPI?SPI的优点有哪些?
SPI 协议简介
SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设 备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间, 要求通讯速率较高的场合。
全栈程序员站长
2022/09/28
8.2K0
SPI 协议简介
SPI通讯协议介绍「建议收藏」
  来到SPI通讯协议了。废话两句,“SPI很重要”,这是我在学校时候听那些单片机开发工程师说的。出来实习,到后来工作,确实如此,SPI的使用很常见,那么自然重要咯。
全栈程序员站长
2022/11/04
1.2K0
SPI通讯协议介绍「建议收藏」
ESP8266 Arduino Core.SPI函数列表
1.begin()     该功能用于初始化SPI通信。     语法:SPI.begin()     参数:无;     返回值:无;
云深无际
2021/02/23
1.4K0
ESP8266 Arduino Core.SPI函数列表
SPI 子系统(一):SPI spec
SPI:Serial Perripheral Interface,串行外围设备接口,由 Motorola 公司提出,是一种高速、全双工、同步通信总线。SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,无应答机制。
Jasonangel
2022/05/24
3K0
SPI 子系统(一):SPI spec
相关推荐
基于fpga的spi通信设计_协议的概念
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验