基于小梅哥所提的线性序列机思想设计读写该芯片的SPI协议,线性序列机简单来说就是用一个计数器对时钟计数,对于每一个计数值,按照时序要求对信号做出相应操作。简单写了一下 Read Manufacturer / Device ID (90h) 指令,需要先发送0x90(一字节),接着发送地址0x000000(三字节),再接收Manufacturer ID 和Device ID 两字节,接收正确的话分别是0xEF和0x14。芯片手册的指令说明及时序图如下。

按照时序图一步一步写即可,程序如下,已经验证。

module spi_dri(input wire sys_clk,input wire rst_n,input wire start,input wire [7:0] instruct,input wire [23:0] addr,output reg spi_clk,output reg spi_cs_n,output reg spi_mosi,input wire spi_miso,output reg work_done,output reg [7:0] manu_id,output reg [7:0] device_id
);reg [7:0] r_manu_id;
reg [7:0] r_device_id;reg work_ing;
reg [9:0] cnt_sysclk;always@(posedge sys_clk or negedge rst_n)if(!rst_n)work_ing <= 1'b0;else if(start)work_ing <= 1'b1;else if(work_done)work_ing <= 1'b0;elsework_ing <= work_ing;always@(posedge sys_clk or negedge rst_n)if(!rst_n)cnt_sysclk <= 10'b0;else if(work_ing)cnt_sysclk <= cnt_sysclk + 1'b1;else if(cnt_sysclk == 10'd97)cnt_sysclk <= 10'b0;elsecnt_sysclk <= cnt_sysclk;always@(posedge sys_clk or negedge rst_n)if(!rst_n)beginspi_cs_n <= 1'b1;spi_clk <= 1'b0;spi_mosi <= 1'b1;r_device_id <= 8'd0;r_manu_id <= 8'd0;device_id <= 8'd0;manu_id <= 8'd0;work_done <= 1'b0;endelse begincase(cnt_sysclk)0:begin spi_cs_n <= 1'b0; spi_clk <= 1'b0; spi_mosi <= instruct[7]; end1:begin spi_clk <= 1'b1; end2:begin spi_clk <= 1'b0; spi_mosi <= instruct[6]; end3:begin spi_clk <= 1'b1; end4:begin spi_clk <= 1'b0; spi_mosi <= instruct[5]; end5:begin spi_clk <= 1'b1; end6:begin spi_clk <= 1'b0; spi_mosi <= instruct[4];end7:begin spi_clk <= 1'b1; end8:begin spi_clk <= 1'b0; spi_mosi <= instruct[3];end9:begin spi_clk <= 1'b1; end10:begin spi_clk <= 1'b0; spi_mosi <= instruct[2];end11:begin spi_clk <= 1'b1; end12:begin spi_clk <= 1'b0; spi_mosi <= instruct[1];end13:begin spi_clk <= 1'b1; end14:begin spi_clk <= 1'b0; spi_mosi <= instruct[0];end15:begin spi_clk <= 1'b1; end16:begin spi_clk <= 1'b0; spi_mosi <= addr[23]; end17:begin spi_clk <= 1'b1; end18:begin spi_clk <= 1'b0; spi_mosi <= addr[22]; end19:begin spi_clk <= 1'b1; end20:begin spi_clk <= 1'b0; spi_mosi <= addr[21]; end21:begin spi_clk <= 1'b1; end22:begin spi_clk <= 1'b0; spi_mosi <= addr[20];end23:begin spi_clk <= 1'b1; end24:begin spi_clk <= 1'b0; spi_mosi <= addr[19];end25:begin spi_clk <= 1'b1; end26:begin spi_clk <= 1'b0; spi_mosi <= addr[18];end27:begin spi_clk <= 1'b1; end28:begin spi_clk <= 1'b0; spi_mosi <= addr[17];end29:begin spi_clk <= 1'b1; end30:begin spi_clk <= 1'b0; spi_mosi <= addr[16]; end31:begin spi_clk <= 1'b1; end32:begin spi_clk <= 1'b0; spi_mosi <= addr[15]; end33:begin spi_clk <= 1'b1; end34:begin spi_clk <= 1'b0; spi_mosi <= addr[14]; end35:begin spi_clk <= 1'b1; end36:begin spi_clk <= 1'b0; spi_mosi <= addr[13];end37:begin spi_clk <= 1'b1; end38:begin spi_clk <= 1'b0; spi_mosi <= addr[12];end39:begin spi_clk <= 1'b1; end40:begin spi_clk <= 1'b0; spi_mosi <= addr[11];end41:begin spi_clk <= 1'b1; end42:begin spi_clk <= 1'b0; spi_mosi <= addr[10];end43:begin spi_clk <= 1'b1; end44:begin spi_clk <= 1'b0; spi_mosi <= addr[9]; end45:begin spi_clk <= 1'b1; end46:begin spi_clk <= 1'b0; spi_mosi <= addr[8]; end47:begin spi_clk <= 1'b1; end48:begin spi_clk <= 1'b0; spi_mosi <= addr[7]; end49:begin spi_clk <= 1'b1; end50:begin spi_clk <= 1'b0; spi_mosi <= addr[6];end51:begin spi_clk <= 1'b1; end52:begin spi_clk <= 1'b0; spi_mosi <= addr[5];end53:begin spi_clk <= 1'b1; end54:begin spi_clk <= 1'b0; spi_mosi <= addr[4];end55:begin spi_clk <= 1'b1; end56:begin spi_clk <= 1'b0; spi_mosi <= addr[3];end57:begin spi_clk <= 1'b1; end58:begin spi_clk <= 1'b0; spi_mosi <= addr[2]; end59:begin spi_clk <= 1'b1; end60:begin spi_clk <= 1'b0; spi_mosi <= addr[1]; end61:begin spi_clk <= 1'b1; end62:begin spi_clk <= 1'b0; spi_mosi <= addr[0]; end63:begin spi_clk <= 1'b1; end64:begin spi_clk <= 1'b0; end65:begin spi_clk <= 1'b1; r_manu_id[7] <= spi_miso; end66:begin spi_clk <= 1'b0; end67:begin spi_clk <= 1'b1; r_manu_id[6] <= spi_miso; end68:begin spi_clk <= 1'b0; end69:begin spi_clk <= 1'b1; r_manu_id[5] <= spi_miso; end70:begin spi_clk <= 1'b0; end71:begin spi_clk <= 1'b1; r_manu_id[4] <= spi_miso; end72:begin spi_clk <= 1'b0; end73:begin spi_clk <= 1'b1; r_manu_id[3] <= spi_miso; end74:begin spi_clk <= 1'b0; end75:begin spi_clk <= 1'b1; r_manu_id[2] <= spi_miso; end76:begin spi_clk <= 1'b0; end77:begin spi_clk <= 1'b1; r_manu_id[1] <= spi_miso; end78:begin spi_clk <= 1'b0; end79:begin spi_clk <= 1'b1; r_manu_id[0] <= spi_miso; manu_id <= r_manu_id; end80:begin spi_clk <= 1'b0; end81:begin spi_clk <= 1'b1; r_device_id[7] <= spi_miso;end82:begin spi_clk <= 1'b0;  end83:begin spi_clk <= 1'b1; r_device_id[6] <= spi_miso;end84:begin spi_clk <= 1'b0; end85:begin spi_clk <= 1'b1; r_device_id[5] <= spi_miso; end86:begin spi_clk <= 1'b0; end87:begin spi_clk <= 1'b1; r_device_id[4] <= spi_miso; end88:begin spi_clk <= 1'b0; end89:begin spi_clk <= 1'b1; r_device_id[3] <= spi_miso; end90:begin spi_clk <= 1'b0;end91:begin spi_clk <= 1'b1; r_device_id[2] <= spi_miso;  end92:begin spi_clk <= 1'b0;  end93:begin spi_clk <= 1'b1;r_device_id[1] <= spi_miso; end94:begin spi_clk <= 1'b0;   end95:begin spi_clk <= 1'b1; r_device_id[0] <= spi_miso;device_id <= r_device_id;end96:begin spi_cs_n <= 1'b1; work_done <= 1'b1; enddefault:;endcaseendendmodule

基于线性序列机的SPI协议读写winbond公司flash芯片25Q16相关推荐

  1. 小梅哥FPGA:基于线性序列机的TLC5620型DAC驱动设计

    小梅哥FPGA:基于线性序列机的TLC5620型DAC驱动设计 目标:学会使用线性序列机的思想设计常见的有串行执行特征的时序逻辑 实验现象:在QuartusⅡ软件中,使用ISSP工具,输入希望输出的电 ...

  2. 线性序列机与串行接口ADC驱动设计与验证

    线性序列机与串行接口ADC驱动设计与验证 ADC128S022 型 ADC 内部工作原理 在 AC620 开发板上使用的模数转换器为逐次逼近型的低功耗芯片 ADC128S022,其具有 8 通道以及 ...

  3. 线性序列机与串口接口DAC驱动设计与验证

    线性序列机与串口接口DAC驱动设计与验证 TLV5618 型 DAC 内部工作原理 TLV5618 是一个基于电压输出型的双通道 12 位单电源数模转换器,其由串行接口.一个速度和电源控制器. 电阻网 ...

  4. 关于FPGA设计中的线性序列机和状态机

    在FPGA设计中,线性序列机和状态机思想是十分重要的思想方法,用于实现各种时序要求.这次的内容是实现用FPGA,时钟周期为20ns,每间隔5000ns发送一个字节的数据,数据不从外部接入,而是内部给定 ...

  5. SPI协议读写SD卡介绍

    前言 在前面的文章中,我们主要介绍了如何利用SDIO协议对SD卡进行读写操作的流程及注意事项.虽然SDIO协议读写SD卡的效率很高,但是,操作却比较麻烦,另外,还需要使用的芯片具有SDIO外设.这对于 ...

  6. STM32F103标准库开发---SPI实验---读写 W25Q128 外部 Flash

    STM32F103标准库开发----目录 W25Q128读写----程序源码----点击下载 W25Qxx全系列数据手册-点击下载 一.实验前期准备 本次实验的 MCU 是 STM32F103C8T6 ...

  7. 利用SPI适配器读写控制AT45DBXX存储器芯片

    1.设置SPI适配器参数   2.向AT45DBXX存储器写入控制字"9F",设置读取字节数据长度read bits为4字节,点击"send.read data" ...

  8. 下载的内容:MSP430F149利用硬件SPI口读写串行Flash M25P64

    /*****************<SPI_Flash.C>**************************************/ #include "SPI_Flas ...

  9. STM32F103标准库开发---SPI实验---W25Qxx系列外部Flash芯片

    STM32F103标准库开发----目录 STM32F103标准库开发----SPI实验----基本原理 STM32F103标准库开发----SPI实验----底层驱动程序 W25Qxx全系列---- ...

最新文章

  1. 你的机器学习模型为什么会出错?奉上四大原因解析及五条改进措施
  2. python pillow 扩展图片增强
  3. Vue用Cordova打包后的app自升级功能实现
  4. 服务器 不支持gbk,解决JS请求服务器gbk文件乱码的问题
  5. phoneGap 中修改生成APP的名字
  6. 13.QT中控制台程序console相关设置
  7. Django- UnicodeDecodeError:‘utf-8‘ codec can‘t decode 问题解决
  8. 语言技巧——scanf读入多行字符串
  9. 微信小程序上传 分享发测试
  10. 概率论的V=max{X,Y},U=min{X,Y},W=X+Y的求解分布律解法——笔记
  11. 目的地址和ARP地址应答中的源地址
  12. 物联网应用之远程控制
  13. 游戏和股票的结构有一定的类似性
  14. leetcode5473:灯泡开关 IV
  15. 二分图最大匹配—匈牙利算法
  16. matlab怎么开始使用方法,matlab怎么使用,matlab基本使用方法
  17. Android性能优化系列篇(五):弱网优化
  18. 10-200 C2-2修改特定职工的订单运费
  19. [jzoj 6305] 最小值 {单调栈}
  20. MTK 平台sensor arch 介绍-hal

热门文章

  1. 免费天气api 高速稳定的天气API接口 2019年4月测试稳定OK
  2. 【云计算】IBM开放云架构
  3. 一个球从100米高度自由落下,每次落地后反弹回原高度的一半,再落下。求它在第10次落地时
  4. 人工智能产品大数据分析.智能助手-小Qi,开创数据分析新格局
  5. 电子合同解决企业全程电子化的最后一公里难题!
  6. 什么是CS寄存器,什么是IP寄存器
  7. 【U8+】用友U8+对账不平案例及方法总结
  8. Kali更新源签名无效问题
  9. 计网实验一 做网线实现对等网,进行文件共享
  10. 前端设计中关于外部js文件加载的速度优化