reference:https://blog.csdn.net/fzhykx/article/details/79490330

项目中用到了一种常见的低速接口(spi),于是整理了一下关于spi相关的知识,与AD采样的芯片7176通信的协议为spi

一.对spi协议的理解

spi扫盲

除了供电、接地两个模拟连接以外,SPI总线定义四组数字信号:

- 接口时钟SCLK(Serial Clock,也叫SCK、CLK),master输出至slave的通讯时钟。

- MOSI( Master Output Slave Input,也叫SIMO、MTSR、DI、DIN、SI)自master输出至slave的数据线。

- MISO (Master Input Slave Output,也叫SOMI、MRST、DO、DOUT、SO)自slave输出至master的数据线。

- SS(Slave select,也叫nSS、CS、CSB、CSN、EN、nSS、STE、SYNC)master对slave的片选信号,自master输出至slave,低有效。

SPI接口是一种典型的全双工接口,通过同步时钟SCLK的脉冲将数据一位位地传送。所以在开始通讯前,master首先要配置接口时钟(确定其通讯频率是SLAVE可以支持的,通常为数兆赫兹)。

当MASTER片选一个SLAVE时,每向SLAVE发送一个周期的SCLK信号,都会有1bit的数据从MOSI发送至slave,与此同时,slave每收到一个周期的SCLK信号,都会从MISO向master发送1bit的数据。这种全双工通讯,是由硬件保证的(MASTER与HOST中各有一个移位寄存器作为收发数据的缓存)。

二.AD7176使用简单说明

1>写入与读入方法

对于FPGA为master而言,要注意SCLK下降沿发数给AD7176,上升沿读AD7176的数。在写入的时候,先用SPI时序,写入一个8bits的CMD,CMD就是通信寄存器,负责控制写入还是读出和要通信的寄存器名称,随后写写入8bit/16bit/24bit的数据。

在读数据的时候也需要通过通信寄存器也就是CMD读取,要规定好读数据和读哪个寄存器的值。

2>AD7176配置流程

具体寄存器还需要查看手册具体配置。

三.程序源代码讲解

1>程序源码

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2017/03/10 11:08:45
// Design Name:
// Module Name: spi_core
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module spi_core(input clk,//50Minput rst,input [7:0] din,  //要输出input s_valid,      //要输出input[1:0] readnum,//指示指令读取数据的长度 2’b00:0,2'b01:8,2'b10:256,2'b11:1664480(320*257*2)output spi_ready,output [23:0] dout,output m_valid,input cfg_finsih,input spi_miso,output spi_mosi,output spi_cs,output spi_clk,output empty);
/*
本模块只完成SPI协议所规定的时序,不涉及FLASH指令的编写
*/
parameter IDLE = 3'd0;
parameter S1   = 3'd1;
parameter S2   = 3'd2;
parameter S3   = 3'd3;
parameter S4   = 3'd4;
parameter S5   = 3'd5;
parameter S6   = 3'd6;
parameter Smid =3'd7;
reg [2:0] sta_spi;
reg spi_ready_r;
reg spi_clk_r;
reg spi_cs_r;
reg spi_mosi_r;wire wr_en;
reg rd_en;
wire dout_fifo;
//wire empty;
wire full;
wire[14:0] rd_count;assign spi_clk  = spi_clk_r;
assign spi_cs   = spi_cs_r;
assign spi_mosi = dout_fifo;//spi_mosi_r;
assign spi_ready = spi_ready_r;
assign wr_en = s_valid;
//fifo_generator_0 fifo_generator_0 (
//.rst(~rst),        // input wire rst
//.wr_clk(clk),  // input wire wr_clk
//.rd_clk(clk),  // input wire rd_clk
//.din(din),        // input wire [7 : 0] din
//.wr_en(wr_en),    // input wire wr_en
//.rd_en(rd_en),    // input wire rd_en
//.dout(dout_fifo),      // output wire [0 : 0] dout
//.full(full),      // output wire full
//.empty(empty),    // output wire empty
//.rd_data_count(rd_count)
//);
fifo_generator_0 fifo_generator_0 (.clk(clk),                      // input wire clk.srst(~rst),                    // input wire srst.din(din),                      // input wire [7 : 0] din.wr_en(wr_en),                  // input wire wr_en.rd_en(rd_en),                  // input wire rd_en.dout(dout_fifo),                    // output wire [0 : 0] dout.full(full),                    // output wire full.empty(empty)                 // output wire empty
//  .rd_data_count(rd_count)  // output wire [15 : 0] rd_data_count
);
reg recv_reg;
reg recv_ok;
reg [20:0] recv_num;
reg [20:0] NUM;
always @(posedge clk)
beginif(~rst)beginsta_spi <= IDLE;spi_clk_r <= 1'b1;spi_cs_r <= 1'b1;spi_mosi_r <=1'b0;rd_en <= 1'b0;recv_reg <= 1'b0;recv_ok <= 1'b0;spi_ready_r <= 1'b0;recv_num <= 21'd0;endelse begincase(sta_spi)IDLE:begin recv_ok <= 1'b0;recv_num <= 21'd0;spi_clk_r <= 1'b1;                if(~empty)beginrd_en <= 1'b1;sta_spi <= S1;spi_ready_r <= 1'b0;endelsespi_ready_r <= 1'b1;endS1:beginrd_en <= 1'b0;spi_clk_r <= 1'b0;spi_cs_r <= 1'b0;spi_mosi_r <= dout_fifo;sta_spi <= S2;endS2:beginspi_clk_r <= 1'b1;
//                sta_spi <= S3;if(~empty)beginrd_en <= 1'b1;sta_spi <= S1;                    end
//                else if(empty)
//                spi_cs_r<=1'b1;   else if(readnum!=2'b00)  //就是要读数的意思sta_spi <= S4;elsesta_spi <= S3;         endS3:beginsta_spi <= IDLE;spi_clk_r <= 1'b0;spi_cs_r <= 1'b1;endS4:beginspi_clk_r <= 1'b0;recv_ok <= 1'b0;sta_spi <= S5;endS5:beginspi_clk_r <= 1'b1;recv_num <= recv_num +1'b1;recv_reg <= spi_miso;recv_ok <= 1'b1;            if(recv_num!=NUM)sta_spi <= S4;else beginsta_spi <= IDLE;spi_cs_r <= 1'b1;endendendcaseend
endalways @(posedge clk)
beginif(~rst)NUM <= 21'd0;else begincase(readnum)2'b00:NUM <= 21'd0;2'b01:NUM <= 21'd7;2'b11:NUM <= 21'd23;endcaseend
end
reg [23:0] dout_r;
reg m_valid_r;
reg [3:0] cnt_bit;
always @(posedge clk)
beginif(~rst)begindout_r <= 16'd0;m_valid_r <= 1'b0;cnt_bit <= 4'd0;endelse if(recv_ok)begin//m_valid_r <= 1'b0;dout_r <= {dout_r[22:0],recv_reg};cnt_bit <= cnt_bit + 1'b1;if(cnt_bit==4'd15)m_valid_r <= 1'b1;elsem_valid_r <= 1'b0;endelsem_valid_r <= 1'b0;
end
assign dout = dout_r;
assign m_valid = m_valid_r;/*********************************/
endmodule

2>软件仿真时序

配置过程也就是FPGA用SPI输出过程,每次片选信号CS拉低,下降沿发数

3>读数阶段软件仿真

波形也和手册的时序相对应

转载于:https://www.cnblogs.com/limanjihe/p/9814697.html

FPGA构造spi时序——AD7176为例(转)相关推荐

  1. 【FPGA】SPI协议

    1.SPI简介 SPI(Serial Perripheral Interface, 串行外围设备接口)是 Motorola 公司推出的一种同步串行接口技术.SPI 总线在物理上是通过接在外围设备微控制 ...

  2. 【FPGA】SPI协议详解及对flash读写操作

    FPGA基于SPI实现对flash读写操作 概括 一.SPI协议.flash讲解 1.SPI协议 2.flash (1)WREN (2)RDID (3)WRSR (4)READ (5)PP (6)SE ...

  3. 基于FPGA的SPI FLASH控制器设计

    1.SPI FLASH的基本特征 本文实现用FPGA来设计SPI FLASH,FLASH型号为W25Q128BV.支持3种通信方式,SPI.Dual SPI和Quad SPI.FLASH的存储单元无法 ...

  4. 如何实现复杂FPGA设计的时序收敛

    "打鼹鼠"是一个古老(电子时代之前)的休闲游戏.在桌面上有许多洞,每个洞里都藏着鼹鼠.当有鼹鼠从洞里钻出来时,你就用锤子打它,让鼹鼠退回洞里,你因此而得分.当鼹鼠返回洞里时,又有一 ...

  5. 基于FPGA的 SPI通信 设计(1)

    引言 低速通信目前搞过 UART串口通信.IIC通信.其实 SPI 也算是中低速(有时也可以用作高速通信)串行通信的范畴,但是一直还没真正实现过,所以此系列就 SPI的协议以及FPGA设计作几篇博客记 ...

  6. XR20M1170实现FPGA 的SPI/IIC转UART

    最近基于FPGA实现UART通讯,因为项目中UART的各项参数需要可配置,使用verilog直接实现一个UART会麻烦一些,稳定性也会降低,因此使用了更为方便的方案,FPGA加上一块SPI/IIC转U ...

  7. spi四种工作模式时序图_SPI总线协议及SPI时序图详解

    嵌入式linux QQ交流群:175159209,欢迎爱好者加入交流技术问题! SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种 ...

  8. 在ARM Linux下使用GPIO模拟SPI时序详解

    Author:杨正  Data:2016.1.1  Mail:yz2012ww@gmail.com 一.       概述 SPI是英文SerialPeripheral Interface的缩写,顾名 ...

  9. 基于FPGA实现SPI接口(配置或通信)

    基于FPGA实现SPI接口(配置或通信总线) 1)总线简介 串行外设接口(SPI)是微控制器(FPGA)和外围IC(如传感器.ADC.DAC.移位寄存器.SRAM等)之间使用最广泛的接口之一.主要用于 ...

最新文章

  1. VS(Visual Studio)中快速找出含中文的字符串
  2. 详解shuffle过程(转载)
  3. 【转】采购订单行项目检查增强
  4. ffmpeg音视频基础知识
  5. 【转】掀起Azure AD的盖头来——深入理解Microsoft Graph应用程序和服务权限声明
  6. 中国光伏新增装机容量猛增
  7. 2.windows-and-mac在控制台创建ASP.NET-Core应用程序
  8. MySQL驱动包下载
  9. Android权限设置引导
  10. masm5安装教程_MASM5.0汇编器使用
  11. 面对局域网用户滥用网络执法官,p2p终结者等网管软件的破解方法
  12. Win10提示未插入扬声器或耳机
  13. python中怎么压缩文件_如何使用Python实现文件压缩?
  14. matlab标定工具安装,标定工具(matlab仿真工具)
  15. 数据恢复国赛经验与方法分享(电子产品芯片级检测维修与数据恢复赛项)
  16. 奇葩算法系列——猴子排序
  17. yolo+ocr集装箱字符识别(pytorch版本)
  18. boss直聘改回系统头像_Boss直聘VS猎聘,谁的营销广告更胜一筹
  19. 计算文件及字符串的VBS脚本
  20. 2020 年百度之星·程序设计大赛 - 初赛一题解

热门文章

  1. SAP Marketing cloud里的campaign管理
  2. SAP Marketing Cloud的技术架构
  3. 如何用JavaScript实现2+2=5? 1
  4. Tecplot 360 按教程安装完毕后,弹出“Is your Tecplot 360 EX liense valid?”【终极解决办法】
  5. mate 树莓派4b安装ubuntu_树莓派4B安装安装Ubuntu Mate 16.04
  6. 如何定义一个类对象并用next()的方法使用_深入理解-可迭代对象、迭代器(20个为什么)...
  7. tstringlist怎么查看是否存在该数据_财务报表审计该如何进行?
  8. c语言exit_C语言实现2048
  9. python如何安装wordcloud_不知如何利用Python中wordcloud的安装和使用?这里手把手教你...
  10. c++ 方向_GE医疗C型臂系列手术机设备全球装机量破万