RISC-V MCU中文社区

【分享】 MCU200T的SPIFLASH驱动程序的设计(多指令)

发表于 GD32VF103 MCU 2021-07-24 13:35:21
0
2479
1

大家好,我们队名是大黄蜂 队,队伍编号CICC1948 ,此帖将简要介绍MCU200T的SPIFLASH驱动程序的设计(多指令)

之前我们介绍了SPI FLASH单指令设计,用十几个状态机来进行状态转移,在单指令的情况下就非常繁琐,更何况多指令,在我们目前需要加载数据信号到FLASH上去,按目前的逻辑思维,需要设计非常繁琐的状态,先是设计一个指令译码,之后是执行阶段,然后是复位阶段,这样的话需要两层状态机嵌套。

目前的设想可不可以用一层状态机来做呢,是可以的。这需要我们寻找FLASH指令上的共性,还是拿上篇的FLASH READ ID 指令为例

我们了解到这条指令可以分为两个阶段,第一个阶段是先发送指令码,之后是SO信号接收(读等待)阶段。

我们再选一个WRITE ENABLE写使能指令。要分析这指令的阶段,我们这里先拓展讲一下SPI FLASH的指令,我们要写数据进SPI FLASH,可以直接发个写数据指令码,答案是不行的。 我们需要先发一个写使能指令,之后发一个擦除指令(如扇区擦除),之后才是写数据指令(如page program 页编程)。

我们对FLASH指令有初步了解之后,我们接着来分析这里的写使能阶段。我们看到WRITE ENABLE写使能指令很简单,就是发个指令码,然后啥都不用干。

那这个时候就有人会问,那干等着的话,你怎么知道FLASH到底懂没懂我们的意思,万一我们写使能指令写错了呢,这不就像个黑盒,没法知道FLASH是不是在偷懒。

这个问题问的好,当然商家已经替我们想到了这点,所以有读取状态寄存器命令。

这是它的时序,与我们之前的READ ID大同小异,不再赘述。

那我们讲了这么多,那还是不知道怎么写数据进去,别急,这里我们在WRITE ENABLE写使能指令,需要先对我们需要写入数据的地址所在的扇区进行擦除,擦除即将FLASH上的值均赋为1,即

下面是时序。

阶段是有发送指令码和发送扇区地址码。

这个时候有人可能会问,扇区应该不止一个地址,那哪个是我们需要发送的地址码,通过查阅数据手册了解到扇区内的任何地址都是扇区擦除(SE)命令的有效地址。这个问题就解决了

之后是页编程

这里阶段是发送指令码,发送地址码,写数据阶段。这里要注意的是,页编程  02H对应的指令,我们只能发送最多256个字节。如果发送给的字节超过256个,则先前锁存的数据将被丢弃,最后256个会字节在同一页内被正确编程。

这里我们总结下,我们目前所需要的指令阶段可以用发送指令码,发送地址码,写数据读等待这四个状态覆盖,作为状态机,我们还需要添加初始阶段状态,在每个指令结束,下条指令开始译码执行阶段,我们还需要补充指令完成阶段。


喜欢1
用户评论
FREE-LOOP

FREE-LOOP 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板