SPI电路设计

之前一直用SPI器件, 但是呢,没有从根本上理解这个通信协议,这一篇文章将主要介绍硬件设计

1. 什么是SPI协议?

SPI(Serial Perripheral Interface,串行外围设备接口)是摩托罗拉(Motorola)公司推出的一种同步串行接口技术,是一种高速的、全双工、同步的通信总线。常作为MCU外设芯片串行扩展接口,主要应用于EEPROM、FLASH、实时时钟、AD转换器、数字信号处理器和数字信号解码器之间。

2. SPI通信原理

2.1 采用主从模式的控制方式

SPI规定了两个SPI设备之间通信必须由主设备(Master)来控制次设备(Slave),Master设备可以通过对Slave设备进行片选来控制多个Slave设备,SPI协议还规定Slave设备本身不能产生或控制时钟信号,必须由Master设备通过SCLK管脚提供给Slave设备,没有Clock,则Slave设备不能正常工作。

2.2 采用同步方式传输数据

Master设备需要根据从机的工作模式等来配置控制寄存器并产生相应的时钟信号,从而保证数据在两个设备之间是同步传输的。

2.3 数据传输

SPI设备数据传输的工作原理如图1所示,Master中的8位数据寄存器和Slave中的8位数据寄存器通过信号线(MOSI、MISO)连接而组成一个分布式的16位数据寄存器;当执行数据传输操作时,该16位寄存器按照Master提供的时钟信号(SCLK)串行移动8位,所以Master和Slave中寄存器的数据就实现了数据交换;之后再被自动装入接收缓冲器中,并将接收缓冲器满标志位(BF)和中断标志位(SSPIF)置为高电平;而Master或Slave检测到标志位发生变化后,就会去读取接收缓冲器中的数据,这样就完成了一次通信过程。
在这里插入图片描述

3. SPI总线结构

3.1 引脚功能及模式

由SPI工作原理可知,SPI总线需要包含两条信号线(MOSI、MISO)和一条时钟线(SCLK),但是由于SPI是一个多从机系统,所以需要增加1条从设备选择信号线(SS)来选择需要通信的Slave设备(每个Slave设备都需要单独的从设备选择信号来控制)。这四条信号线的详细作用介绍如下:

  • SS(Slave Select):从设备选择信号线,常称为片选(Chip Select)信号线。当有多个SPI从设备与主机相连时,设备的其它信号线SCLK、MOSI及MISO同时并联到相同的SPI总线上,即无论有多少个从设备,都共同只使用这3条总线;而每个从设备都有独立的这一条CS信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。当主机要选择从设备时,把该从设备的CS信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行SPI通讯;所以SPI通讯以CS线置低电平为开始信号,以CS线被拉高作为结束信号。
  • MOSI(Master Output Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。
  • MISO(Master Input Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。
  • SCLK(Serial Clock):时钟信号线,用于通讯数据同步。它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如STM32的SPI时钟频率最大为Fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。

扩展:SPI通信有4种不同的模式,不同的从设备可能在出厂就是配置为某种模式,这是无法改变的;但我们的通信双方必须工作在同一模式下,所以我们可以通过对CPOL(时钟极性)和CPHA(时钟相位)的配置来设置我们的主设备的工作模式;CPOL是用来配置SCLK的电平的空闲态或者有效态时的电平,CPHA是用来配置数据采样是发生在上升沿还是下降沿。具体如下:

  • Mode0:CPOL=0,CPHA=0;空闲态时SCLK=0,数据在上升沿采样,在下降沿移位;
  • Mode1:CPOL=0,CPHA=1;空闲态时SCLK=0,数据在下降沿采样,在上升沿移位;
  • Mode2:CPOL=1,CPHA=0;空闲态时SCLK=1,数据在上升沿采样,在下降沿移位;
  • Mode3:CPOL=1,CPHA=1;空闲态时SCLK=1,数据在下降沿采样,在上升沿移位;

需要注意的是:因为我们的SPI通信并不像UART或者IIC通信那样有专门的通信周期、专门的通信起始信号、专门的通信结束信号;所以我们的SPI协议能够通过控制时钟信号线,当没有数据交流的时候我们的时钟线要么保持高电平要么保持低电平。

3.2 多从机拓扑结构

多器件连接的拓扑结构如下图所示,主从机的SCLK、MOSI和MISO相连接, 而有多少个从设备的话,在主机端就需要多少个SS(CS)管脚进行片选选择。cs是低电平有效, 如果需要选择哪个器件的话, 一般需要将该管脚拉低,所以在我们电路设计时,该管脚可以加上拉电阻。
在这里插入图片描述

3. 常见SPI电路设计

我们以GD25Q127CSIG为例,来讲讲SPI硬件设计。如下图所示,各个管脚解释如下:

  • CE脚为片选信号,由于是低电平触发,所以该管脚接了上拉电阻,默认不选中它
  • WP管脚为写保护,该管脚给低电平时,写保护打开,主机不能写入数据,这里关闭写保护,上拉至VCC
  • HOLD管脚为暂停收发控制管脚,该管脚给低电平时,表示不管此时该芯片在收还是发数据,将暂停收发过程,直接忽略数据。
    在这里插入图片描述

参考资料

好的,我会尽力回答你的问题。首先需要明确一下,Verilog是一种硬件描述语言,用于描述数字电路。在Verilog中,我们可以用模块的形式来描述电路,每个模块可以包含输入、输出和内部信号。因此,我们可以通过设计一个SPI模块来实现可配置的SPI电路。 下面是一个简单的SPI模块的Verilog代码,可以实现主设备接总线,四种模式可配置,地址长度和数据长度可配置。 ```verilog module spi ( input wire clk, input wire rst, input wire [7:0] addr, input wire [7:0] data_in, output wire [7:0] data_out, output wire cs_n, output wire sclk, output wire mosi, input wire miso ); parameter MODE0 = 2'b00; parameter MODE1 = 2'b01; parameter MODE2 = 2'b10; parameter MODE3 = 2'b11; parameter ADDR_LENGTH = 8; parameter DATA_LENGTH = 8; reg [1:0] mode = MODE0; reg [ADDR_LENGTH-1:0] addr_reg = 0; reg [DATA_LENGTH-1:0] data_reg = 0; reg [DATA_LENGTH-1:0] data_out_reg = 0; reg cs_n_reg = 1'b1; reg sclk_reg = 1'b0; reg mosi_reg = 1'b0; wire miso_reg = miso; always @(posedge clk) begin if (rst) begin mode <= MODE0; addr_reg <= 0; data_reg <= 0; data_out_reg <= 0; cs_n_reg <= 1'b1; sclk_reg <= 1'b0; mosi_reg <= 1'b0; end else begin case (mode) MODE0: begin cs_n_reg <= 1'b1; sclk_reg <= 1'b0; mosi_reg <= 1'b0; if (addr != 8'hFF) begin mode <= MODE1; addr_reg <= addr; end end MODE1: begin cs_n_reg <= 1'b0; mosi_reg <= addr_reg[0]; if (addr_reg != 0) begin mode <= MODE2; end else begin mode <= MODE3; end end MODE2: begin mosi_reg <= data_reg[0]; if (data_reg != 0) begin mode <= MODE3; end end MODE3: begin sclk_reg <= ~sclk_reg; mosi_reg <= data_reg[0]; data_out_reg <= {miso_reg, data_out_reg[7:1]}; if (sclk_reg == 1'b1) begin data_reg <= {data_in, data_reg[7:1]}; if (addr_reg == 1) begin mode <= MODE0; end end end endcase end end assign cs_n = cs_n_reg; assign sclk = sclk_reg; assign mosi = mosi_reg; assign data_out = data_out_reg; endmodule ``` 在上面的代码中,我们定义了四种工作模式(MODE0-MODE3),地址长度(ADDR_LENGTH)和数据长度(DATA_LENGTH)作为参数,并定义了一些内部寄存器来保存状态。在时钟上升沿时,根据当前的工作模式进行不同的操作。 在MODE0模式下,将片选信号设置为高电平,时钟信号设置为低电平,并将MOSI信号设置为低电平。如果接收到地址,则切换到MODE1模式,并将地址保存在寄存器addr_reg中。 在MODE1模式下,将片选信号设置为低电平,并将MOSI信号设置为addr_reg的最低位。如果地址不为0,则切换到MODE2模式;否则,切换到MODE3模式。 在MODE2模式下,将MOSI信号设置为data_reg的最低位。如果数据不为0,则切换到MODE3模式。 在MODE3模式下,将时钟信号翻转,并将MOSI信号设置为data_reg的最低位。同时,将MISO和data_out_reg的最高位连接起来,以便将接收到的数据保存到data_out_reg中。如果时钟为1,则将data_in和data_reg的最低位连接起来,以便将数据发送出去。如果addr_reg为1,则切换回MODE0模式。 这只是一个简单的实现,仅供参考。实际上,SPI电路的实现可能会更加复杂,需要根据具体的需求进行设计和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零涂

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值