RISC-V MCU中文社区

【分享】 MCU200T的SPI FLASH驱动程序的单条指令设计

发表于 全国大学生集成电路创新创业大赛 2021-07-24 15:29:44
1
1841
1

大家好,我们队名是大黄蜂 队,队伍编号CICC1948 ,此帖将简要介绍MCU200T的SPIFLASH驱动程序的单条指令设计,以READ ID指令为例。

我们要在MCU200T完成图像处理或者音频处理,从MATLAB中设计软件,通过设计对应的算法来完成我们对图像处理或者音频处理,之后做硬件层面的映射。在设计完成后,需要我们对所作的设计进行验证。在MATLAB上我们通过直接导入图像文件或者音频文件来实现我们对算法的验证,硬件上导入对应的图像文件或者音频文件往往需要将MCU200T与PC或者其他传输数字信号数据的下位机相连,之后就可以进行验证,但是这里每次验证,都需要在验证前不断重复导入我们所需要的输入验证文件,未免过于繁琐,这时我们可以将验证文件导入到掉电不丢失的外挂SPIFLASH上,以便下次上板调试。

我们这里先设计 动程序的单条指令设计 ,由SPI串行外设接口协议规定,我们所作的先要满足SPI协议,同时我们需要查到MCU200T外挂的SPIFLASH的数据手册,以便我们了解到我们需要的指令,指令码,以及指令对应的时序。

我们先来讲如何卡准指令对应的时序,查到MCU200T外挂的是 GD25Q32C型号,同时我们需要明白这是norflash,并不需要复用,找到对应的数据手册,比如我们先设计一条读ID指令,

看到数据手册 知道指令码是9FH,这是我们要发送给FLASH的指令,发送过去就行了。

这是我们需要卡准的时序。

那怎么做这个时序,想到的一般是状态机,那怎么卡时序,每个时钟周期是一个状态,每个状态将CS ,SCLK,SO,SI分别发出,这样做当然可以。

同时,要讲如何让设计指令,我们这里先补充介绍下对这张时序图的理解,时序图大家想必在数电学习中已有所了解,就是看时钟上升沿,下降沿数据的变化,或者是看时钟电平拉高 或者 拉低 每个信号值,我们这里也是,我们同时还要对每个信号有所了解,像D触发器每个对应的信号。CS是片选信号,SI是FLASH数据输入信号,SO是FLASH数据输入信号,SCLK是FLASH的串行时钟信号。但要注意的是,我们设计的是驱动,是要驱动FLASH,所以SI是我们驱动指令程序的输出信号,SO是我们驱动指令程序的输入信号,SCLK是我们输出的时钟信号。那我们输入的时钟信号需要自己设定,我们这里用的是板子的系统时钟来提供输入的时钟信号。 在CS信号拉低后,SI信号先发送二进制指令码,之后SI信号是无效输入信号,我们通过接收SO信号 来得到我们需要的 设备 ID。

这是我们根据不同状态定义的状态机的状态,

之后这里是状态跳变(节选)


这里是我们设计的信号,以CS片选信号为例,由状态机对应的状态来设定CS的信号,注意我们这里的CLK要与SCLK区分。SCLK是FLASH的串行时钟信号,是我们指令的输出信号,而CLK信号是我们提供的输入信号

最后,将SO信号得到的二进制码拼接起来,就可以得到我们需要的读设备ID指令。

喜欢1
用户评论 (1)
  • 2021-08-02 15:42:35 1#

    同学,请问你们这个SPI FLASH是MCU200T板子上的MCU_FLASH吗?你们是怎么把用户文件和CPU的可执行代码一起烧录到这个FLASH里的?

FREE-LOOP

FREE-LOOP 实名认证

懒的都不写签名

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