0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SPI通信总线概述和Verilog实现

FPGA设计论坛 来源:FPGA设计论坛 2025-02-07 14:28 984次阅读

概述

SPI = Serial Peripheral Interface,是串行外围设备接口,是一种高速,全双工,同步的通信总线。

优点
支持全双工
支持高速
协议支持字长不限于8bit,可以根据应用灵活选择消息字长。
硬件连接简单

缺点
相比I2C多两条线
没有寻址机制,只能靠片选选择不同的设备
没有回应ACK机制,主设备不知道消息发送是否成功
典型应用仅支持单主控

硬件结构

信号定义

SCK

:Serial Clock,时钟信号,由主设备产生。

MOSI

:Master Output,Slave Input 主发从收信号。在片选信号有效时,数据由高位到低位,在时钟的上升沿依次发送给从设备。

MISO

:Master Input,Slave Output 主收从发信号,在片选信号有效时,数据由高位到低位,在时钟的上升沿依次发送给主设备。

SS/CS

:Slave Select 片选信号,低有效,由主设备控制。即只有片选信号为预先规定的使能信号时,对应的芯片操作才有效,这使得在同一总线上连接多个SPI设备成为可能。

电路连接
单个主设备和单个从设备:
3643ce5e-e50a-11ef-9310-92fbcf53809c.png
单个主设备和多个从设备,通过用多个片选信号或者菊花链的形式完成。
3654bd72-e50a-11ef-9310-92fbcf53809c.png

传输模式
通过设置相关控制寄存器,SPI可以有四种传输模式。
1、时钟空闲时的电平为高或低。
2、数据采样发生在时钟(SCK)的上/下边沿。
将以上两种情况两两组合,即可得四种传输模式。
数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取,完成一位数据传输,输入与输出原理相近。这样通过至少8次时钟信号的改变(上升沿和下降沿为一次),就可以完成8位数据的传输。如下图所示。
36670d1a-e50a-11ef-9310-92fbcf53809c.png

标准SPI读
36757d0a-e50a-11ef-9310-92fbcf53809c.png
片选→读指令→地址→数据读出

标准SPI写
368f3f6a-e50a-11ef-9310-92fbcf53809c.png
片选→写指令→地址→数据写入

Verilog代码解析

本文以SPI Master控制器为例来对Verilog源码进行分析,参考资料为《VERILOG HDL应用程序设计实例精讲》。
1、时钟分频模块,将原始时钟进行四分频,过程较为简单,不再详述。

module clkdiv(clk,clkout);
input clk;
output clkout;

reg [1:0]cnt=2'd0;
reg clkout=1'b0;

always @(posedge clk)begin
    if(cnt==2'd1)begin
        clkout<=1'b1;
        cnt<=cnt+2'd1;
    end
    else if(cnt == 2'd3)begin
        clkout<=1'b0;
        cnt<=2'd0;
    end
    else begin
        cnt<=cnt+2'd1;
    end
end
endmodule

2、SPI发送数据部分,在spiclk的上升沿完成数据的传输。spics为片选信号,低有效;spido为输出的数据;dstate为FSM变量。dsend为待传送数据,其中部分数据过程重复,代码中仅保留首尾数据的传输过程。

begin
case (dstate)
8'd0:
begin
spics <= 1'b0;
spiclk <= 1'b1;
spido <= 1'b1;
dstate <= 8'd1;
end
8'd1:
begin
spics <= 1'b0;
spiclk <= 1'b1;
spido <= 1'b1;
dstate <= 8'd2;
end
8'd2:
begin
spics <= 1'b0;
spiclk <= 1'b0;
spido <= 1'b1;
dstate <= 8'd3;
end
8'd3:
begin
spics <= 1'b0;
spiclk <= 1'b1;
spido <= dsend[7];
dstate <= 8'd4;
end
8'd4:
begin
spics <= 1'b0;
spiclk <= 1'b0;
spido <= dsend[7];
dstate <= 8'd5;
end
……
8'd17:
begin
spics <= 1'b0;
spiclk <= 1'b1;
spido <= dsend[0];
dstate <= 8'd18;
end
8'd18:
begin
spics <= 1'b0;
spiclk <= 1'b0;
spido <= dsend[0];
dstate <= 8'd19;
end
8'd19:
begin
spics <= 1'b0;
spiclk <= 1'b1;
spido <= 1'b1;
dstate <= 8'd20;
end
8'd20:
begin
spics <= 1'b0;
spiclk <= 1'b1;
spido <= 1'b1;
dstate <= 8'd0;
spistate <= idle;
end
endcase
end
default:
begin
spics <= 1'b1;
spiclk <= 1'b1;
spido <= 1'b1;
spistate <= 2'b00;
end
endcase
end

36a3815a-e50a-11ef-9310-92fbcf53809c.png
可以看到当片选信号spics为低有效时,数据在spiclk的上升沿按顺序被发送至SPI总线上,数据信号spido与输入数据相对应,SPI Master发送时序得到验证。
3、SPI接收数据部分,参数定义与2一样,其中部分数据过程重复,代码中仅保留首尾数据的传输过程。在时钟的下降沿进行数据的接收。

begin
case (dstate)
8'd0:
begin
spics <= 1'b0;
spiclk <= 1'b1;
dstate <= 8'd1;
end
8'd1:
begin
spics <= 1'b0;
spiclk <= 1'b1;
dstate <= 8'd2;
end
8'd2:
begin
spics <= 1'b0;
spiclk <= 1'b0;
dstate <= 8'd3;
end
8'd3:
begin
spics <= 1'b0;
spiclk <= 1'b1;
dstate <= 8'd4;
end
8'd4:
begin
spics <= 1'b0;
spiclk <= 1'b0;
dreceive[7] <= spidi;
dstate <= 8'd5;
end
8'd5:
begin
spics <= 1'b0;
spiclk <= 1'b1;
dstate <= 8'd6;
end
……
8'd18:
begin
spics <= 1'b0;
spiclk <= 1'b0;
dreceive[0] <= spidi;
dstate <= 8'd19;
end
8'd19:
begin
spics <= 1'b0;
spiclk <= 1'b1;
dstate <= 8'd20;
dataout <= dreceive;
end
8'd20:
begin
spics <= 1'b0;
spiclk <= 1'b1;
dstate <= 8'd0;
spistate <= 2'b00;
end
endcase
end

36b4341e-e50a-11ef-9310-92fbcf53809c.png
由上图分析看出,收到的数据与SPI传输的数据相对应,SPI接收数据部分得到正确验证。

实验项目框图:
36caea9c-e50a-11ef-9310-92fbcf53809c.png

实验心得:
1、在给复位信号低电平时时间过短,分频后时钟上升沿还未到复位信号就拉高了,导致未进行有效复位。
2、进行发送/接收状态检测时设置的计数子过大,如下图,每过40个时钟周期进行一次检测,当仿真时间过短时,容易看不到结果。

if(cnt == 8'd40)
begin
cnt <= 8'd0;
if((wr == 1'b0) && (rd == 1'b1))
begin
spistate <= send_data;
dstate <= 8'd0;
dsend <= datain;
end
else if((wr == 1'b1) && (rd == 1'b0))
begin
spistate <= receive_data;
dstate <= 8'd0;
end
end
else
begin
cnt <= cnt + 8'd1;
end

3、若结果出现问题,将相关控制信号添加至窗口,观察其状态,分析程序存在的问题。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1360

    浏览量

    111118
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1737

    浏览量

    93395
  • 通信总线
    +关注

    关注

    0

    文章

    45

    浏览量

    9947

原文标题:SPI详解及Verilog源码分析

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    相关推荐

    SPI总线的原理与Verilog设计实现

     SPI(Serial Peripheral Interface,串行外围设备接口),是Motorola公司提出的一种同步串行接口技术
    发表于 08-14 09:00 1317次阅读
    <b class='flag-5'>SPI</b><b class='flag-5'>总线</b>的原理与<b class='flag-5'>Verilog</b>设计<b class='flag-5'>实现</b>

    SPI总线概述

    文章转自 http://www.51hei.com/mcu/4011.htmlSPI总线概述 SPI全称是串行外设接口(Serial Peripheral Interface),是由
    发表于 10-19 09:42

    怎么使用FPGA实现SPI总线通信接口?

    随着现代技术的发展,SPI接口总线已经成为了一种标准的接口,由于协议实现简单,并且I/O资源占用少,为此SPI总线的应用十分广泛。目前,
    发表于 08-09 08:14

    STM32通信接口之硬件SPI概述

    一、概述 SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI,是一种高速的,全双工,同步的通信总线
    发表于 08-11 08:38

    介绍一下SPI通信总线构成与通信特点

    一、SPI通信概述SPI,Serial Peripheral Interface,串行外设接口。1、总线构成:时钟线SCK(主机用于控制
    发表于 02-14 06:58

    SPI总线实现DSP和MCU之间的高速通信

    简述了SPI总线协议工作时序和配置要求,通过一个成功的实例详细介绍了使用SPI总线实现DSP与MCU之间的高速
    发表于 11-27 15:10 58次下载

    FPGA实现CAN总线通信节点设计

    基于对CAN 总线控制器的功能分析, 并应用Verilog语言进行软件设计, 从而实现CAN节点之间的通信功能。
    发表于 04-28 09:56 1.5w次阅读
    FPGA<b class='flag-5'>实现</b>CAN<b class='flag-5'>总线</b><b class='flag-5'>通信</b>节点设计

    带有N的SPI总线详细资料概述

    本文档概述SPI(串行外围接口)总线,该总线通常用于集成电路或传感器之间的通信。本教程讨论了总线
    发表于 03-10 08:00 0次下载
    带有N的<b class='flag-5'>SPI</b><b class='flag-5'>总线</b>详细资料<b class='flag-5'>概述</b>

    使用Verilog实现SPI串行总线接口的资料和源代码免费下载

    器件以串行方式进行通信、交换信息。本文简述了SPI总线的特点,介绍了其4条信号线,SPI串行总线接口的典型应用。重点描述了
    发表于 08-19 08:00 9次下载
    使用<b class='flag-5'>Verilog</b><b class='flag-5'>实现</b><b class='flag-5'>SPI</b>串行<b class='flag-5'>总线</b>接口的资料和源代码免费下载

    SPI总线驱动的C语言源代码详细概述

    本文档的主要内容详细介绍的是SPI总线驱动的C语言源代码详细概述
    的头像 发表于 09-26 11:36 8632次阅读

    基于SPI串行总线接口的Verilog实现

    与各种外围接口器件以串行方式进行通信、交换信息。本文简述了SPI总线的特点,介绍了其4条信号线,SPI串行总线接口的典型应用。 重点描述了
    的头像 发表于 05-29 10:16 5264次阅读
    基于<b class='flag-5'>SPI</b>串行<b class='flag-5'>总线</b>接口的<b class='flag-5'>Verilog</b><b class='flag-5'>实现</b>

    SPI通信

    SPI简介SPI是一种串行外围设备通信接口,高速全双工通信总线,主要用于通信速率较高的场合。
    发表于 12-22 19:13 3次下载
    <b class='flag-5'>SPI</b><b class='flag-5'>通信</b>

    通信协议:SPI

    STM32模拟SPI通信协议SPI的简介:SPI是串行外设接口的缩写,是一种高速的,全双工、同步的串行通信
    发表于 12-22 19:20 22次下载
    <b class='flag-5'>通信</b>协议:<b class='flag-5'>SPI</b>

    常用串行总线(二)——SPI协议(Verilog实现)

    SPI(Serial Perripheral Interface, 串行外围设备接口)是 Motorola 公司推出的一种同步串行接口技术。SPI 总线在物理上是通过接在外围设备微控制器
    的头像 发表于 01-06 14:35 9242次阅读

    浅谈SPI总线通信接口及其协议

    上篇内容我们介绍了IIC总线通信接口及其协议,这一篇文章我们介绍另一种项目开发中非常常见的通信接口——SPI总线
    的头像 发表于 03-22 16:11 1999次阅读
    浅谈<b class='flag-5'>SPI</b><b class='flag-5'>总线</b><b class='flag-5'>通信</b>接口及其协议