news 2026/9/4 7:08:09

fpga实现简单的SPI主机模块

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
fpga实现简单的SPI主机模块

一 SPI介绍

SPI(Serial Peripheral Interface,串行外围设备接口)通讯协议,是Motorola公司提出的一种同步串 行接口技术,是一种高速、全双工、同步通信总线,在芯片中只占用四根管脚用来控制及数据传输,广 泛用于 EEPROMFlashRTC(实时时钟)、ADC(数模转换 器)、DSP(数字信号处理器)以及数字信号解码器上,是常用的、重要的低速通讯协议之一。

二 SPI四线

1:CS/SS(Slave Select/Chip Select),这个是片选信号线,用于选择需要进行通信的从设备。I2C通信时通过主机发送从机设备地址来选择需要进行通信的从机设备,而 SPI 主机不需要发送从机设备,直接将相应的从机设备片选信号拉低即可。(片选信号是低电平有效)
2:SCK(Serial Clock),串行时钟,和 I2C 的 SCL 一样,为 SPI 通信提供时钟。
3:MOSI/SDO(Master Out Slave In/Serial Data Output)简称主出从入信号线,这根数据线只能用于主机向从机发送数据,也就是主机输出,从机输入。
4:MISO/SDI(Master In Slave Out/Serial Data Input)简称主入从出信号线,这根数据线只能用户从机向主机发送数据,也就是主机输入,从机输出。

三 SPI特点

SPI 作为一种经典的同步串行通信协议,具有以下几个显著特点:

1. 高速传输:SPI 没有像 I2C 那样的应答机制和地址帧开销,通信速率仅受限于从设备的最高工作频率和主设备的时钟产生能力,因此可以达到很高的数据传输速率,通常远高于 I2C 和 UART。

2. 全双工通信:SPI 采用主出从入(MOSI)和主入从出(MISO)两根独立的数据线,主机发送数据的同时可以接收从机返回的数据,实现真正的全双工同步传输,收发互不干扰。

3. 同步串行通信:SPI 依靠串行时钟线(SCK)来同步数据的发送与接收,所有数据位都在时钟沿的驱动下逐位传输,不需要额外的起始位、停止位和校验位,协议开销小、时序清晰。

4. 主从结构,一主多从:SPI 总线采用主从架构,由主机产生时钟并控制整个通信过程。主机通过独立的片选信号(CS/SS)来选择目标从设备,可以挂接多个从设备,且从设备之间互不干扰。

5. 接口简单,占用管脚少:SPI 通信仅需 SCK、MOSI、MISO、CS 四根信号线即可完成数据交互(若只做单向传输还可进一步减少),相比并行总线大大节省了芯片管脚资源。

6. 无设备地址,片选寻址:与 I2C 通过发送从机地址寻址不同,SPI 直接通过拉低对应从机的片选信号来选择通信对象,寻址方式简单直接,无需在数据帧中携带地址信息。

7. 协议灵活,模式可配置:通过配置时钟极性(CPOL)和时钟相位(CPHA),SPI 可以组合出四种工作模式,能够灵活适配不同从设备的时序要求,兼容性强。

8. 无应答机制,可靠性依赖约定:SPI 本身不包含应答和错误检测机制,通信是否成功需要由主从双方通过协议约定或软件方式(如 CRC 校验、超时判断)来保证,这是其与 I2C 的一个重要区别。

时钟极性和时钟相位

SPI总线的极性--时钟极性(CPOL):时钟极性决定SPI总线空闲时的时钟信号是高电平还是低电平。CPOL = 1:表示空闲时是高电平;CPOL = 0:表示空闲时是低电平。
SPI总线的相位--时钟相位(CPHA):时钟相位决定SPI总线从哪个跳变沿开始采样数据CPHA = 0:在时钟信号SCK的第1个跳变沿采样;CPHA = 1:在时钟信号SCK的第2个跳变沿采样。

五 工作模式

根据时钟的极性以及相位可以分为4种工作模式:

模式0CPOL= 0CPHA=0SCK串行时钟线空闲是为低电平,数据在SCK时钟的上升沿被采样,数在SCK时钟的下降沿切换。
模式1CPOL= 0CPHA=1SCK串行时钟线空闲是为低电平,数据在SCK时钟的下降沿被采样,数据在SCK时钟的上升沿切换。
模式2CPOL= 1CPHA=0SCK串行时钟线空闲是为高电平,数据在SCK时钟的下降沿被采样,数据在SCK时钟的上升沿切换。
模式3CPOL= 1CPHA=1SCK串行时钟线空闲是为高电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿切换。
以模式0为例:
第一步: 拉低片选信号;
第二步:产生同步时钟
第三步:主机发送数据(主机必须在数据采样之前把数据准备好,也就是在图中1位置和3位置,5位置等下降沿时(除1位置特殊情况外)将数据准备好,然后再时钟上升沿时,从机对数据集采样,也就是2位置4位置等。
第四步:从机发送数据(。与主机发送数据一样)
第五步:拉高片选信号,结束通讯。

六 代码编写

6.1接口分析

默认4线:SCK,MOSI,MISO,CS_n.

发送或者接受完成,以及SPI完成后产生的done信号:done_r,done_w,done_spi;

总数据量,发送数据量:data_len,wr_len;

输入数据,输出数据:data_i_spi,data_o_spi,(分别是需要发送的数据,以及接受到的数据)

工作开始信号:start_spi

6.2状态分析:

根据时序图:可以分为4种状态:空闲态,START,DATA,STOP。

空闲态:用来检测开始信号,检测到开始信号上升沿跳转到START

STATR:(拉低片选)。

,DATA:(发送数据与接受数据)。

STOP:将片选拉高。

6.3部分代码分析:

6.3.1 bit计数器与分频计数器;

分频计数器:选择6分频,

bit计数器最大值:data_len*8-1;

6.3.2开始信号寄存

通过寄存开始信号,可以选择在上升沿触发开始(start_reg==01),或者下降沿触发开始(start_reg==10),亦或是高电平(11)或者低电平00作为开始信号。

6.3.3发送数据与接收数据的时序分析

根据模式选择的不同,采样数据与接收数据需要根据模式来调整时序,

七 仿真结果

7.1仿真代码

`timescale 1ns/1ps module test(); reg clk ; reg rst_n ; reg start_spi ; reg [7:0] data_i_spi ; wire [7:0] data_o_spi ; wire done_r ; wire done_w ; wire done_spi ; wire SCK ; wire MOSI ; wire CS_n ; always #10 clk=~clk; initial begin clk=0; rst_n=1; start_spi=0; #20 rst_n=0; #20 rst_n=1; #20 start_spi=1; #20 start_spi=0; #20000 $stop; end always @(posedge clk or negedge rst_n) begin if(!rst_n) data_i_spi<=8'haa; else if(done_w||done_r) data_i_spi<=data_i_spi+8'h11; end SPI_master SPI_master_tb( .clk (clk ), .rst_n (rst_n ), .start_spi (start_spi ), .data_i_spi (data_i_spi ), .data_o_spi (data_o_spi ), .data_len (5 ), .wr_lenth (3 ), .done_r (done_r ), .done_w (done_w ), .done_spi (done_spi ), .SCK (SCK ), .MOSI (MOSI ), .CS_n (CS_n ), .MISO (MOSI ) ); endmodule

7.2结果

与预想结果一致

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 7:07:07

智能家居与物联网入门:别只让灯闪,给设备做一套看得懂的状态反馈

智能家居与物联网入门:别只让灯闪,给设备做一套看得懂的状态反馈 [!NOTE] LED是最小的输出实验,却能暴露供电、限流、GPIO方向和程序时序的基础问题。本文只使用经典ESP32、一个普通LED和限流电阻,把“亮一下”升级成启动、正常与错误三种可识别状态。你会知道为什么电阻不…

作者头像 李华
网站建设 2026/9/4 7:06:44

Imx6ull内核开发环境搭建

虚拟机环境 搭建虚拟机环境 电脑型号&#xff1a; surface pro6 i5-8250U 8G内存256G硬盘 WIN11(先用官方镜像U盘重装家庭版&#xff0c;然后升级专业版)&#xff1a; 版本 Windows 11 专业版 版本号 25H2 安装日期 ‎2026/‎8/‎24 操作系统版本 26200.9168 功能包 W…

作者头像 李华
网站建设 2026/9/4 7:06:30

模拟IC版图验证实战:DRC/LVS常见错误排查与Calibre修复指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 7:04:14

嵌入式调试笔记<7>MODBUS协议详解与调试实战

嵌入式调试笔记 一、MAX13487芯片产生数据回环问题 二、Keil在线调试过程中遇到的问题 三、使用VScdoe开发STM32单片机 四、VANTPEK可调电源接负载电压被拉低 五、用CD74HC4067扩展16路ADC采集及两个调试坑 六、4档旋转开关省IO采集&#xff0c;与Modbus中float的拆分还原 七、…

作者头像 李华
网站建设 2026/9/4 7:03:34

Mediapipe实时健康监护系统:从算法检测到行为干预的完整闭环

简介&#xff1a;这是一份面向计算机及相关专业本科生的优质课程设计资源&#xff0c;聚焦于基于摄像头的实时健康监护场景&#xff0c;解决久坐办公或学习中的疲劳状态识别与不良坐姿提醒问题。资源包含9个文件&#xff08;4个核心Python模块、1个配置文件yml、1个依赖说明txt…

作者头像 李华
网站建设 2026/9/4 7:02:33

TM7711高精度滤波算法实战:从厨房秤到嵌入式信号处理

简介&#xff1a;本资源是一份面向嵌入式开发工程师与IoT设备开发者的技术实践代码包&#xff0c;聚焦TM7711高精度称重传感器在厨房秤场景下的0.1克级稳定读数实现问题。针对传感器原始数据易受噪声干扰、内码跳动大于5等典型工程痛点&#xff0c;提供经实际验证的C语言滤波算…

作者头像 李华