赞
踩
首先,请问大家几个小小问题,你清楚:
今天,我们来一起探索并回答这些问题。为了便于大家理解,以下是本文的主题大纲:
QSPI全称为“Queued SPI”,本质上是属于SPI协议的一种,一般来说,SPI协议可以分为Standard SPI,Dual SPI,以及本文要讲解的Queued SPI。只不过Dual SPI,Queued SPI常用于作为SPI Flash的通信接口。
QSPI作为一种队列串行外围接口协议,就是对SPI协议的扩展,可以通过单线,双线或四线模式与外部Flash存储器进行高速通信。其功能应用场景如下:
数据存储:可以用来实现大量数据的存储,如代码,图像,视频等,从而提高数据的读写速度与容量;
代码执行:QSPI用于执行外部Flash存储器的代码,这样可以节约内部Flash的空间,如通过QSPI XIP模式从而实现在Memmap下执行代码;
与其他外围设备进行通信:QSPI也可支持与其他QSPI协议的外围设备进行通信,如传感器,显示器等,可以提高通信的效率与灵活性;
协议特点
虽然市面上存在许多的Flash驱动供应商,但是基本都大同小异,本文已TI系列的QSPI Flash驱动介绍举例给大家介绍下其QSPI的硬件实现原理,读写操作模式以及EDMA搬运等操作。
QSPI硬件实现原理
作为QSPI通信的双方,本质上来讲都是主芯片端作为主设备,可以通过控制CS引脚来决定与外围不同的Flash芯片进行通信,同时通过输出Clock时钟来完成针对从设备的通信传输控制,如下图所示:
左图为主芯片的内部QSPI的控制器,右图则为外部的支持QSPI协议的外部Flash,两者之间通过QSPI协议接口连接,包含1个CLK引脚,1个CS引脚与4个用于传输数据的IO引脚。
针对上图中的内容,小T将针对每个引脚做个较为详细的介绍,如下表所示:
QSPI读写操作模式
通过上述文章我们了解到QSPI存在3线Single Write/Read模式,4线Single Write/ Read,Dual Read模式,6线Quad Read模式的6种QSPI读写方式,在具体的项目实际应用过程中,我们一般推荐正常的写入操作通过4线Single Write来写入,读取操作推荐采用6线Quad Read模式,这样才能最大效率的利用Flash硬件自身特性,从而提高通信效率。
如下图所示为QSPI 控制器的内部组成关系,从中我们可以得出如下几个关键结论:
整个QSPI控制器可以分为SFI_MM_IF与SPI_CORE两个模块,其中SFI_MM_IF模块主要负责读写指令,地址以及dummy cycle的个数等,而SPI_CORE主要负责芯片的时钟极性与时钟相位以及传输的长度等;
SFI_MM_IF接口由以下两个部分组成:
SPI_CORE模块则是由如下四个部分组成:
QSPI控制器支持两种配置方式,一种是Config模式,另外一种则是Memmap方式;对于写入操作不支持Memmap方式仅支持Config模式,对于读取操作推荐使用Memmap方式,这样便可以直接在芯片MCU的Memory Layout中看到相应的外部Flash空间的代码或者数据。
对于QSPI接口的通信双方而言,需要确保两者通信的时钟极性与时钟相位是一致的,时钟极性与时钟相位的组合有如下4种方式:
QSPI EDMA搬运
小T将AUTOSAR架构下针对Flash驱动的标准接口以及相关需求列举如下,这样在我们使用Flash驱动过程我们能够快速的了解到Flash驱动的关键API的具体功能与作用。
在使用上述标准的AUTOSAR Flash驱动API也有很多需要注意的地方,小T将自己觉得需要特别注意的点列举如下,这也是大家容易忽视的一些点:
小T在具体的软件开发过程中,也遇到过很多跟Flash驱动操作有关的问题,这些问题往往解决起来非常棘手,因为非常偶发且极难复现。
这类问题更多时候还是我们缺乏防御性编程思维,没有针对Flash可能失效的场景进行全面的考虑,以下小T将我个人针对Flash驱动的几个常见的经验总结列举如下,希望能给大家后续的Flash驱动开发带来一些帮助与思考。
在每次系统启动或者复位的过程中,最为推荐的做法针对外部Flash同步进行reset操作,该操作可以一般存在如下三种方式:
每次启动或者复位的过程中可通过硬件来操作Flash的上下电操作来完成Flash自身的重置;
通过软件的方式来拉低Reset引脚来实现外部Flash复位,这种方式需要考虑到引脚复用功能是否可用的可能性;
通过软件的方式在初始化的过程中通过QSPI通信发送软复位指令让Flash芯片进行重置;
如果需要针对外部的SPI Flash通过QSPI进行通信,需要特别注意该SPI Flash芯片的QE位是否默认使能,如果没有使能,将无法采用QUAD SPI进行通信,因此建议工厂端刷写软件过程中均需要主动设置该QE位或者在软件初始化过程中设置该QE位,该QE位一旦写入掉电也会丢失,仅需写入一次即可;
在执行Flash初始化过程中需要针对Flash外部型号,如Manufacture ID等设备号进行校验,确保不会出现生产过程中出现芯片型号贴错的场景;
在软件运行过程中有时会偶发导致系统跑飞意外执行操作Flash驱动写或者擦除操作导致用户程序遭到破坏,从而软件无法正常启动,因此有必要针对关键应用程序代码空间进行Flash写保护,这样即使程序死机复位后整个系统也能够再次正常启动。
更多精彩内容,敬请关注公号“ADAS与ECU之吾见”!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。