傻瓜的SPI的通信

这两天一直在搞spi通信,我坚持没看任何参考例程,凭借自己的理解,闭门造车,编出来一段代码,实现spi功能,并仿真一小下。

`timescale 1 ps/ 1 ps
module try(
input clk,
input rst,
output [7:0]data
);
//reg f_clk;
reg flag;
reg [7:0] cmd;
generate_clk generate_clk(clk,rst,f_clk);

always @ (posedge clk or negedge rst)
begin
  if(!rst)
  begin
    cmd=8‘h44;
    flag=1;
  end
end
spi_send spi_send(f_clk,rst,cmd,flag,data);
spi_receive spi_receive(f_clk,rst,flag,);
endmodule

//////////////////////////////////////////////////////spi_send
module spi_send(
input f_clk,
input rst,
input [7:0] cmd,         //输入的发送命令
input en_send,           //发送使能
output reg flag_send,    //发送完成标志位,完成=1
output [7:0] data        //发送数据线
);
reg [3:0] num;
reg [7:0] temp_data;

always @ (posedge f_clk or negedge rst)
begin
   if(!rst)
   begin
        num<=4‘b0111;
         temp_data<=8‘h00;
         flag_send<=0;
   end
   else
   begin
      if(en_send==1)
      begin
         if(num==4‘b1111)
           begin
            num<=4‘b0111;
            flag_send<=1;
           end
         else
           begin
             flag_send<=0;
             num<=num-4‘b0001;
               temp_data[num]<=cmd[num];
             end
        end
     end
end
assign data=temp_data;
endmodule

/////////////////////////////////////////////////////////////spi_receive
module spi_receive(
input f_clk,
input rst,
input en_receive,      //接受使能端
input [23:0] d_in,     //外部芯片的数据输入口
output reg flag_receive,//接收完成标志位
output reg[23:0] d_out, //对外部芯片的输出
output [23:0] data   //模块间的数据传递,等价于d_in
);
reg [7:0] num;
reg[23:0] temp_data;
always @ (posedge f_clk or negedge rst)
begin
   if(!rst)
   begin
        num<=8‘d23;
        temp_data<=24‘d0;
        flag_receive<=0;
     end
     else
     begin
        if(en_receive==1)
        begin
          if(num==8‘hff)
            begin
              num<=8‘d23;
              flag_receive<=1;
            end
          else
            begin
              flag_receive<=0;
            num<=num-8‘d1;
              d_out[num]<=1;temp_data[num]<=d_in[num];
            end
         end
      end
end
assign data=temp_data;
endmodule
//////////////////////////////////////////////////////////////clk module
module generate_clk(
input clk,
input rst,
output reg f_clk
);
reg[31:0] temp;
always @ (posedge clk or negedge rst)
begin
   if(!rst)
       temp<=0;
    else
       temp<=temp+32‘h5A3D_70A4;
end
always @ (posedge clk or negedge rst)
begin
   if(!rst)
       f_clk<=0;
    else
    begin
       if(temp>=32‘h7fff_ffff)
           f_clk<=1;
        else
           f_clk<=0;
    end
end
endmodule

try为顶层模块,但是没有怎么丰富它。主要还是generate_clk,spi_send,spi_receive三个模块。分别是分频模块,发送和接受模块。

分频的不多说了,使用了32位数字分频原理。

发送模块,设置了使能位,完成标志位,命令,数据位等。

其仿真结果如下:接收端:

发送端:

最后说下,testbench代买,这是让我最头疼的,有好几次都是测试代码写错了,导致仿真不成功。现在贴上来,来警示下自己:

`timescale 1 ps/ 1 ps
module try_vlg_tst();
// constants
// general purpose registers
// test vector input registers
reg clk;
reg rst;
// wires
wire [7:0]  data_s;
wire [7:0]  data_r;
wire f_clk;
wire flag;
// assign statements (if any)                          

reg [23:0] d_in;
wire [23:0] d_out;
reg en_receive;
spi_receive spi_receive(
 clk,
 rst,
 en_receive,
 d_in,
 flag,
 d_out,
 data_r
);
reg [7:0] cmd;
reg en_send;
spi_send spi_send(
 clk,
 rst,
 cmd,
 en_send,
 flag,
 data_s
);
//////////////////////////////////////////
initial
begin
  cmd<=8‘h44;
  d_in<=24‘haaaaaa; 

  clk=0;
  rst=0;
  #2 rst=1;
  forever #2 clk=~clk;  

  //#20 en_send<=0;
end
initial
begin
  en_send=0;en_receive=0;
  #200 en_send=1;en_receive=1;

end
endmodule

需要注意的是:

1.module中所有的input信号都为reg形,output为reg形。所有的input的变量必须给予说明赋值!!!!!!!(其中的时钟和rst就是最重要的。通过rst的赋值,使得模块中的许多内部变量初始化。)

2.如果有需要延时的信号,就用两个initial,否则会影响都其他信号。反正initial是并行执行的。

之后,需要把这代码移植到真正的板子上,还有许多地方需要改,否则通信的速度可能提不上去。希望可以成功!!!

时间: 2024-08-25 04:15:49

傻瓜的SPI的通信的相关文章

芯片级通信总线之一:SPI

打算写几篇专题,系统总结下常用的片上总线.现场总线,就先从最常用的SPI开始吧. 1. SPI是干什么的?除了SPI还有那些其它电路板及的通讯总线?有何差别? 相信接触过MCU的同学对SPI都不陌生,详细定义就不罗嗦了.SPI常用的场合包括ADC读写.存储芯片读写.MCU间通讯等等.可以一主多从(通过片选来选择Slave),也可以做成菊花链等等形式的拓扑.与SPI类似的总线还有IIC.UART等,甚至还有很多单根线的总线,原理都是基于简单的串行通信,区别在于收发时序和连接拓扑.要熟练使用这些总线

[转]SPI通信原理简介

[转自]http://www.cnblogs.com/deng-tao/p/6004280.html 1.前言 SPI是串行外设接口(Serial Peripheral Interface)的缩写.是 Motorola 公司推出的一 种同步串行接口技术,是一种高速的,全双工,同步的通信总线. 2. SPI特点 高速.同步.非差分.总线式.支持全双工通信 主从式通信 通信协议简单 可靠性有缺陷.没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据,可靠性上有一定的缺陷.

STM32——SPI接口

STM32--SPI接口 宗旨:技术的学习是有限的,分享的精神的无限的. 一.SPI协议[SerialPeripheral Interface] 串行外围设备接口,是一种高速全双工的通信总线.在ADC/LCD等与MCU间通信. 1.SPI信号线 SPI 包含 4 条总线,SPI 总线包含 4 条总线,分别为SS .SCK.MOSI.MISO. (1)SS(SlaveSelect):片选信号线,当有多个 SPI 设备与 MCU 相连时,每个设备的这个片选信号线是与 MCU 单独的引脚相连的,而其他

spi协议及工作原理分析

转自----http://blog.csdn.net/skyflying2012/article/details/11710801 一.概述. SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控制器(PICmicro) 上面的微处理控制单元 (MCU) 上叫作同步串行端口(Synchronous Serial Port) 的模块(Module)来实现的, 它允

嵌入式通讯开发 SPI,UART,I2C都有什么区别

SPI,UART,I2C都有什么区别,及其各自的特点 区别:SPI:高速同步串行口.3-4线接口,收发独立.可同步进行 UART:通用异步串行口.按照标准波特率完成双向通讯,速度慢 I2C:一种串行传输方式,三线制,网上可找到其通信协议和用法的 3根线实现数据双向传输 串行外围接口 Serial peripheral interface UART:通用异步收发器 UART是用于控制计算机与串行设备的芯片.有一点要注意的是,它提供了RS-232C数据终端设备接口,这样计算机就可以和调制解调器或其它

SPI总线小结

串行外设接口(Serial Peripheral Interface,SPI)的缩写.是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线.Motorola首先在其MC68HCXX系列处理器上定义的.SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间. SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时).也是所有基于SPI的设备共有的,它们是

SPI学习

转载:http://bbs.chinaunix.net/thread-1916003-1-1.html 一.概述. SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控制器(PICmicro) 上面的微处理控制单元 (MCU) 上叫作同步串行端口(Synchronous Serial Port) 的模块(Module)来实现的, 它允许 MCU 以全双工的同步串

SPI在linux3.14.78 FS_S5PC100(Cortex A8)和S3C2440上驱动移植(deep dive)

由于工作的原因,对SPI的理解最为深刻,也和SPI最有感情了,之前工作都是基于OSEK操作系统上进行实现,也在US/OS3上实现过SPI驱动的实现和测试,但是都是基于基本的寄存器操作,没有一个系统软件架构的思想,感觉linux SPI驱动很强大,水很深,废话少说,SPI总线上有两类设备:一类是主机端,通常作为SOC系统的一个子模块出现,比如很多嵌入式MPU中都常常包含SPI模块.一类是从机被控端,例如一些SPI接口的Flash.传感器等等.主机端是SPI总线的控制者,通过使用SPI协议主动发起S

SPI总线协议分析

一.概述 SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控制器(PICmicro) 上面的微处理控制单元 (MCU) 上叫作同步串行端口(Synchronous Serial Port) 的模块(Module)来实现的, 它允许 MCU 以全双工的同步串行方式, 与各种外围设备进行高速数据通信. SPI 主要应用在 EEPROM, Flash, 实时时钟(R