Xilinx-Spartan6-学习笔记(24):通过SPI总线读写FLASH

Xilinx-Spartan6-学习笔记(24):通过SPI总线读写FLASH

利用SPI总线实现对FLASH进行读写,写入255个数据再读出255个数据。(这里为了模拟SDO信号,随机生成了0~1信号方便观察)

一、SPI总线时序介绍

1、什么是SCPI总线

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种同步串行接口技术,是一种高速的、全双工、同步的通信总线。

SPI的通信模式通常有一个主设备和一个或多个从设备,需要4根线,也可以是3根线(单向传输时)。
SCLK:时钟信号,由主设备产生。
CS:从设备使能信号,由主设备控制。
SDI/MOSI:主设备数据输出,从设备数据输入。
SDO/MISO:主设备数据输入,从设备数据输出。

2、SPI通信模式分析

共有四种模式:
Mode0:CPOL=0,CPHA=0
Mode1:CPOL=0,CPHA=1
Mode2:CPOL=1,CPHA=0
Mode3:CPOL=1,CPHA=1

  • CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是 SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿

  • CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是 SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。

  • CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是 SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。

  • CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是 SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。

当在模式0的时序下时,为:
在这里插入图片描述

二、利用SPI总线读写FLASH

1、FLASH操作状态机

(1)对FLASH的读写操作主要包括以下15个阶段,通过执行完一个阶段跳转到下一个阶段即可实现对FLASH的读写。

S0: flash_cmd=90,cmd_type=1000 (读DEVICE ID)
S1: flash_cmd=06,cmd_type=1001 (写使能instruction)
S2: flash_cmd=20,cmd_type=1010 (块擦除)
S3: flash_cmd=00,cmd_type=0000 (延时100时钟周期)
S4: flash_cmd=05,cmd_type=1011 (读状态寄存器)
S5: flash_cmd=04,cmd_type=1100 (写不使能instruction)
S6: flash_cmd=05,cmd_type=1011 (读状态寄存器)
S7: flash_cmd=06,cmd_type=1001 (写使能instruction)
S8: flash_cmd=00,cmd_type=0000 (延时100时钟周期)
S9: flash_cmd=02,cmd_type=1101 (写255个数据到flash)
S10: flash_cmd=00,cmd_type=0000 (延时100时钟周期)
S11: flash_cmd=05,cmd_type=1011 (读状态寄存器)
S12: flash_cmd=04,cmd_type=1100 (写不使能instruction)
S13: flash_cmd=05,cmd_type=1011 (读状态寄存器)
S14:flash_cmd=03,cmd_type=1110 (读flash中的256个数据)

其中:flash_cmd为操作FLASH的命令,cmd_type为对SPI总线状态机的控制方式。

(2)SPI总线读写的状态迁移图如下:
在这里插入图片描述

2、读写操作仿真解析

(1)读DEVICE ID:

这一步骤开始时,flash_cmd=90,cmd_type=1000。首先通过SDI/D线发送flash命令(以时钟上升沿采样),然后发送flash地址,然后读取数据,仍然按照上升沿采样(其实就是时钟后沿输出)。
在这里插入图片描述
在编写代码的时候,通过cnta来进行计数,记8个数,将cmd_reg中的数一位一位发送到总线上,然后以时钟的下降沿将数据写入,这样上升沿采样的时候正好采到数据的中心位置。
在这里插入图片描述
(2)写使能instruction

这一步骤开始时,flash_cmd=06,cmd_type=1001。首先通过SDI/D线发送flash命令(以时钟上升沿采样),如下图时序所示。
在这里插入图片描述
在写使能状态下,SPI总线状态机变化为IDLE到CMD_SEND到FINISH_DONE,最终回到IDLE状态,从图中spi_reg即可看出。
在这里插入图片描述
(3)数据读

发送指令flash_cmd=03, cmd_type=1001。首先通过SDI/D线发送flash命令(以时钟上升沿采样),然后发送24位地址,最后接收数据,接收数据在时钟的上升沿进行采样。
在这里插入图片描述
仍然采用在时钟下降沿时将数据写入到datain总线上,然后这样能实现在时钟上升沿时采样,下图为将flash命令03写入,告诉flash要开始读数据了。
在这里插入图片描述
紧接着将24位的地址0x000001写入到数据线上,仍然在时钟上升沿写入。
在这里插入图片描述
按照时钟上升沿,读取dataout上的数据,并将数据一位一位地移入mydata寄存器中,读取完8位数据后,将最终结果锁存到my_data_o中。
在这里插入图片描述

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值