继《OSPI Flash适配秘籍之内功心法篇》之后,本文将继续深入探讨如何将Winbond(华邦)W35T51NW OSPI Flash适配到你的系统[JX1] [DX2]中。笔者感谢老铁们对瑞萨嵌入式小百科的持续关注。如果有读者是第一次接触OSPI接口,笔者建议先跳转到内功心法篇,先修炼《内功心法篇》,否则直接上阵,怕是要走火入魔。
之前也说了广大不同厂家的OSPI Flash,虽然说大部分功能相似,大部分功能也可以复用,但是不同厂家的OSPI Flash还是存在或多或少的差别。因此如果客户出于成本的考虑,需要更换OSPI Flash的时候,是需要做驱动层的适配工作。
那如何做OSPI Flash的驱动的适配工作?请让笔者倾囊相授。
首先,不同门派(厂商)的OSPI Flash虽说套路相似,但细节上总有些“暗器”藏着。适配之前,务必翻阅芯片手册,了解其配置流程。尤其是从单线模式切换到八线模式时,稍有不慎,便会“变线”翻车。
一般OSPI Flash除了支持8线模式,默认都支持单线模式。所以一般Flash上电复位后,都默认支持单线的协议。单线模式下,大部分厂商的OSPI Flash,命令码以及命令-地址-数据之间的时延(如下时序图中的Latency field)差别较小,但是在八线模式下这些差别就不能忽视,下面笔者会具体说明。
OSPI Flash适配的关键在于从单线模式转换成八线模式的时候,如何正确通过单线指令完成转换。图2说明了Winbond W35T51NW OSPI Flash的具体的配置流程。不同厂商的Flash的初始化和配置流程是不一样的,尤其是涉及到输入输出模式的切换时,这也是移形换位大法的关键所在。
大多数厂家的Flash默认设置就是单线模式。所以如果只是适配单线模式的情况下,过程会简单很多。但是多线模式的适配注意事项会更多,也相对麻烦一些。
图2展示了W35T51NW设备的存储器读取操作流程,包括XIP(Execute-in-Place)模式和标准命令模式(Standard Command Mode)。以下是对该图的解析:
1.设备启动流程
设备上电后,会进行设备初始化并刷新易失性/内部配置寄存器(Volatile/Internal Configuration Register Refresh)。
配置寄存器的值,来自非易失性配置寄存器(Non-Volatile Configuration Register),决定设备是进入XIP模式还是标准命令模式。
2.XIP模式(Execute-in-Place)
如果设备进入XIP模式,它会直接执行地址输入-数据输出序列,用于直接从闪存执行代码,无需额外的读取命令。
退出XIP模式需要将XMb设为1。(XMb是Non-Volatile Configuration Register配置寄存器中的一位,由于XIP模式不是本篇文章的重点,这里不做过多的介绍)
3.标准命令模式(Standard Command Mode)
在标准命令模式下,需要按照命令-地址-数据输入/输出序列进行数据访问。
该模式可以支持不同的数据传输模式,包括:
SDR 3字节地址模式
SDR 4字节地址模式
Octal DDR 4字节地址模式
4.工作模式切换
在标准命令模式下,默认支持3字节地址模式,但可以通过B7h命令启用4字节地址模式。通过E9h命令可禁用4字节地址模式,切换回3字节地址模式。
通过81h命令码写易失性配置寄存器(Volatile Config Reg)可以切换工作模式(从单线转到八线):
通过1s-1s-1s的协议向VCR(volatile Config Reg)寄存器用81h命令码写入E7h/C7h,可以把Flash的协议模式从1s-1s-1s切换成8d-8d-8d。不同的地址模式不影响协议模式的切换。Flash的工作模工切换成功后,紧接着要切换XSPI Master(ra8d1)这边的协议模式。
同样的如果要把Flash的协议模式从8d-8d-8d切回1s-1s-1s,此时需要用8d-8d-8d的协议通过81h命令码向VCR写入FFh/DFh。同样Flash的工作模工切换成功后,紧接着要切换XSPI Master(ra8d1)这边的协议模式。两边的协议要一致才能正常工作。
这里对VCR寄存器做一些说明,VCR寄存器共有00h-07h共8个地址。其中对00h地址通过81h命令码写入配置值就可以设置Flash的输入输出的协议模式。其它地址范围的配置功能请参考手册中的内容,默认情况下一般不会对其它地址的内容进行配置。
这里笔者还想说明一下,手册中除了VCR还有NVCR,这两者有什么区别呢?
NVCR的全称是Non-volatile Configuration Register为非易失性的寄存器,而VCR是易失性的寄存器,即下电之后VCR的内容将会重置为0。所以Flash在启动的时候会默认读取NVCR里面的配置作为默认启动配置,而VCR可以在启动之后再去配置,但是VCR的配置只存在当前的上电周期中生效。如果对Flash下电再上电VCR中的内容将失效。
总结一句话,如果开发者想对Flash的启动配置项永久生效就写NVCR,如果是临时调整配置就可以写VCR。
下图让读者感性的认识一下,同样是通过85h命令码读取VCR的内容,示波器的波形会是什么样的?
左边是1s-1s-1s可以很清晰的看出85h这个命令码。右边由于示波器通道数有限,加上示波器信号质量也比较差,读者不能清晰的感知到85h这个命令码。但是通过黄色时钟信号通道,读者可以感受到八线的模式下,完成同样的读取VCR的操作所需要的时钟数量会少很多。
5.复位
硬件复位(Hardware Reset)会使设备重新进入上电初始化状态。
软件复位(Software Reset)通过66h+99h指令实现,会让设备回到上电后的初始状态。
其次开发者要注意8线输入输出模式,常用的读写擦写使能等指令,不同厂商的命令码可能稍有不同,并且“Latency field”也可能不同。
如下图5所示,在4字节地址模式下的快读取的指令,指令码是0Ch,其它的厂商就不一定也是0Ch。所以开发者要查看Flash手册里的指令列表,换Flash芯片需要适配新的指令。
此外对于Dummy cycle数值也可能不一样的,也就是前面提到的“Latency Field“。图5中的8(16)表示如果是SDR模式的话,Dummy cycle是8,如果是DDR模式的话,Dummy cycle值是16。
对于Dummy Cycle,在具体的波形图里以如下方式呈现:
笔者想强调一点的是在ODDR模式下,指令的长度变成两个字节。如下图所示,数据可以正常输出。
对于这个ODDR工作模式的指令长度要变成2字节的说明在Winbond的Flash使用手册上并没有明确说明。但是在ra8d1的手册上,37.2.2.7章节中有相关的寄存器配置说明。比如在ODDR模式下读取VCR的值的命令码是8585h,而不是85h,对应的command_length 也需要调整为2。
最后要注意不同厂家的OSPI Flash所对应的“Device ID”是不一样的。一般驱动代码里都会有读取&校验“Device ID”的操作,所以在驱动代码适配的时候“Device ID”值要从手册中找到对应的读取“Device ID“的指令和ID值。
总结来说做OSPI Flash适配要关注以下方面:
初始化的配置流程的差异;
模式切换时候的差异;
关注指令码和Dummy Cycle的差异;
以及Flash Device ID的差异。
需要技术支持?
如您在使用瑞萨MCU/MPU产品中有任何问题,可识别下方二维码或复制网址到浏览器中打开,进入瑞萨技术论坛寻找答案或获取在线技术支持。
https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/
全部评论