first 感谢开源骚客Kevin的视频讲解,需要了解的话自行付费(不算广告吧,,)
学习操作之前,要先清楚概念。要了解什么是flash:
FLASH闪存
是属于内存器件的一种,"Flash"。闪存则是一种非易失性( Non-Volatile )内存,在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘,这项特性正是闪存得以成为各类便携型数字设备的存储介质的基础。
各类 DDR 、 SDRAM 或者 RDRAM 都属于挥发性内存,只要停止电流供应内存中的数据便无法保持,因此每次电脑开机都需要把数据重新载入内存。
本次工程使用的芯片
大致flash的芯片结构
页:
页结构=页头+节区xN+页尾,当然页结构不是固定不变的,对于不同的厂家会有所不同,在FLASH数据恢复大师里面已经集成了常见的页结构信息,用户只需要根据页大小来选择不同的结构,如页长度为2112的就存在以下几种情况:
2112=0+(512+16)x4+0
2112=30+(512+8)x4+2
2112=0+512x4+16x4
通常flash页每页含有512个字节,对于任何flash页的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。而对于页的擦除,需要注意的是,擦除必须擦除完整一页,所以页是最小单位。
字节
是二进制数据的单位。一个字节通常8位长。但是,一些老型号计算机结构使用不同的长度。为了避免混乱,在大多数国际文献中,使用词代替byte。
大部分FLASH性质存储器都有很多相似的操作规则,比如擦除方式就很特殊,最小擦出单位必须按照扇区来操作,而数据的写入地址的内容必须是擦除状态。这也是为什么EEPROM还能存在的一方面的原因吧(可以字节擦除)。由于这种特殊的性质,导致我们在利用FLASH存储数据的时候必须注意对扇区擦除的操作
以这块 16Mbit 的 Flash 为例,寻址时需要的位数为: Bulk = 32 Sector -> 5bit Sector = 256 Page -> 8bit Page = 256 Byte -> 8bit 总共需要 21 bit
操作上篇帖子很详细的讲述了在stm32 的开发中如何进行flash操作,而今天我们要把他做到FPGA上进行试验和验证
SPI协议简介
SPI协议,即串行外围设备接口,是一种告诉全双工的通信总线,它被广泛地使用在ADC,LCD等设备与MCU间通信的场合。
SPI信号线
SPI包含4条总线,分别为SS,SCK,MOSI,MISO.作用如下:
1) SS:片选信号线,当有多个SPI设备和MCU相连时,每个设备的这个片选信号线是与MCU单独的引脚相连的,而其他的SCK,MOSI,MISO线则为多个设备并联到相同的SPI总线上,当SS信号线为低电平时,片选有效,开始SPI通信.
2) SCK:时钟信号线,由主通信设备产生,不同的设备支持的时钟频率不一样.
3) MOSI:主设备输出/从设备输入引脚,主机的数据从这条信号线输出,从机由这条信号线读入数据,即这条线上的数据方向为从主机到从机.
4)MISO:主设备输入/从设备输出引脚,这条线上数据是从机到主机.
Serial Data Output: 数据输出端口,在串行时钟的下降沿改变数据。 Serial Data Input: 数据输入端口,可传输指令、地址和需要写入的数据,该管脚上的值在串行时钟的上升沿锁存。 Serial Clock: 该输入信号提供SPI的时序参考 Chip Select: 片选信号,为低电平时,表示使能器件。并且在执行任何指令之前都需要把片选信号拉低。
SPI模式
根据时钟极性(CPOL)和时钟相位(CPHA)配置的不同,分为4种SPI模式。
时钟极性是指SPI通信设备处于空闲状态时(也可以认为这是SPI通信开始时,即SS线为低电平),SCK信号线的电平信号。CPOL=0时,SCK在空闲状态时为低电平,CPOL=1时则相反。
时钟相位是指数据采样的时刻,当CPHA=0时,MOSI或MISO数据线上的信号将会在SCK时钟线的奇数边沿被采样。当CPHA=1时,数据线在SCK的偶数边沿被采样。
sd卡的spi常用的是mode 0 和mode 3,这两种模式的相同的地方是都在时钟上升沿采样传输数据,区别这两种方式的简单方法就是看空闲时,时钟的电平状态,低电平为mode 0 ,高电平为mode 3。
下面以CPHA=0为例讲解SPI时序。
首先,由主机把片选信号NSS拉低,意为主机输出。
在NSS被拉低的时刻,SCK分为两种情况,若我们设置CPOL=0,则SCK时序在这时为低电平,若设置为CPOL=1,则SCK在这个时刻为高电平。
无论CPOL为0还是1,因为我们配置的时钟相位CPHA=0,在采样时刻的时序中我们可以看到,采样时刻都是在SCK的奇数边沿(注意奇数边沿有时为下降沿,有时为上升沿)。
因此,MOSI和MISO数据线的有效信号在SCK的奇数边沿保持不变,这个信号将会在SCK奇数边沿时被采集,在非采样时刻,MOSI和MISO的有效信号才发生切换。
对于CPHA=1的情况也类似,只是数据信号的采样时刻为偶数边沿。
注意:使用SPI协议通信时,主机和从机的时序要保持一致,即两者都选择相同的SPI模式。
指令结构