Linux开发讲课20--- QSPI

SPI 是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口,一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,为 PCB 的布局上节省空间,提供方便,主要应用在 EEPROM,Flash,RTC,AD转换,传感器等设备上。
  SPI 的四根信号线:
  CS
  片选信号线,每个设备都占用一个片选信号线,当 CS 信号线显低电平时,表示该设备被选中,则 SCK,MOSI 和 MISO 信号有效。每个设备都拥有属于自己的 CS 信号线,主机选中设备时,会拉低指定设备的 CS 线电平。使用 CS 信号线,可以使多个设备共同使用同一份 SCK,MOSI 和 MISO 信号线,减少引脚数量,也可以告诉设备本次访问已结束,方便下次重新发起访问请求。
  SCK
  时钟信号线,为 SPI 通信过程中提供时钟信号,当 SCK 每次产生上升沿或下降沿时,MOSI 和 MISO 传输一比特数据。
  MOSI
  主机发送,从机接收信号线,主机通过该信号线发送数据,从机从该信号线接收到数据。
  MISO
  主机接收,从机发送信号线,与 MOSI 相反,这里主机要接收数据,从机要发送数据。两根串行数据信号线保证了主从机之间可以全双工通信。
  SPI 可以实现全双工通信,但与 SPI Flash 通信的时候反而不需要进行全双工通信:在 Host 不把指令和地址发送完之前,SPI Flash 不会知道 Host 要干嘛,自然不会主动向 Host 发送数据;在 SPI Flash 向 Host 发送数据的时候,Host 也没有必要发送任何数据,因此,当 Host 与 SPI Flash 通信时,总是处于半双工状态,也总有一根数据信号线处于空闲状态。如图 1 所示。

为了把这跟信号线充分利用起来,从而发明了 DSPI 。
  当 SPI Flash 准备给 Host 发送数据的时候,如果把 MOSI 也作为 SPI Flash 给 Host 发送数据的数据信号线使用,则每个 SCK 时钟可以发送两比特的数据:原来的MOSI (现在称之为 D0)发送第一个比特,MISO(现在称之为 D1)发送第二个比特,在不增加信号线的基础上,一个时钟发送两个比特数据,相当于传输速率提升了一倍!这就叫做 DSPI,D 是 Dual 的意思。如图 2 所示。

但 DSPI 的速度好像还是有些慢,如果再增加两条数据线(D3 和 D4),让传输速度提升到 DSPI 的两倍,那么 DSPI 就变成了 QSPI,Q 是 Quad 的缩写。
  相比较于 SPI,QSPI 在数据传输的时候,一个 SCK 时钟能传输 4 比特数据,两个 SCK 时钟就能传输一字节的数据,性能提升,让 CPU 直接执行存储在 SPI Flash 的程序变成了可能。如图 3 所示。

能否再让数据引脚增加一倍,8 根数据线岂不是速度更快,那就了解下 FSMC 吧,直接 16 根数据信号线,速度自然变得更快了,但使用 SPI FLash,不就是图一个线少嘛。
  为了方便描述,我们将使用 QSPI 接口连接的 SPI Flash 称之为 QSPI Flash。一般来说,在与 QSPI Flash 通信时,并不是全程都是四根数据信号线传输数据,当同一时间只有一根数据线在传输数据的模式可称为单线模式,两根数据线可称为双线模式,四根数据线可称为四线模式。
  通信过程
  在使用 QSPI 与 QSPI Flash 通信的过程中,可分为五个阶段:
  指令阶段
  传输方向为 Host 发送给 QSPI Flash,目的是告诉 QSPI Flash 接下来要做什么事情,其长度只能为 8 bit。
  地址阶段
  传输方向为 Host 发送给 QSPI Flash,目的是告诉 QSPI Flash 要从哪个地址开始读或写数据,其长度可能为 8 bit,16 bit,24 bit 和 32 bit。
  交替字节阶段:
  传输方向为 Host 发送给 QSPI Flash,具体用法需参考所使用的 QSPI Flash 手册,传输方向由 Host 发送给 QSPI Flash,其长度可能为 8 bit,16 bit,24 bit 和 32 bit。
  空指令周期阶段
  给 QSPI Flash 缓冲时间准备数据,等待 n 个 SCK 周期,n 取值范围 0 ~ 31,具体值需参考所使用 QSPI Flash 手册。这段时间 Host 只产生特定数量的 SCK 时钟,不从数据信号线中读取或发送任何内容。
  数据阶段
  读数据或写数据,长度不定,由主机决定发送或接收多少数据。

        在与 QSPI Flash 通信时,其通信过程如图 4 所示:

CS(NSS)信号线拉低,表示 QSPI Flash 器件被微控制器选中,然后发送一个字节大小的指令,紧接着发送地址,然后是交替字节,空指令周期,最后是数据,任意两个阶段之间都是紧挨着的。
  一般来说,每次与 QSPI Flash 通信都至少包含指令阶段,其余的阶段都是可选的,例如读写 QSPI Flash 的寄存器值,只需要指令阶段和数据阶段;写使能和写失能,只需要指令阶段;读写数据,需要指令,地址,数据阶段,可能还有空指令周期阶段。
  但有一种情况下,可能会省略掉指令阶段,部分 QSPI Flash 支持仅在第一次读数据的时候,需要指令阶段,下一次读数据的时候,直接由地址阶段开始,无需指令阶段。
  一般 QSPI Flash 还支持一种叫做 QPI 模式的通信方式,当 QSPI Flash 进入 QPI 模式后,所有的阶段都只能使用四线模式通信,包括指令阶段,通过这种方式,能够极大减少指令阶段和地址阶段花费的 SCK 时钟数。
  通信实例
  图 5 是一款型号为 FM25Q16A QSPI Flash 的 Fast Read Quad Output 的传输波形示意图:

从图中可以看到,四线快读数据的过程中分为四个步骤:
  指令阶段
  Host 发送了一个 8 bit 长度的指令 0x6B,使用单线模式。
  地址阶段
  一段 24bit 长度的地址,使用单线模式。
  空指令周期
  8 bit 的空指令周期。
  数据阶段
  以四线模式连续读取存储在 QSPI Flash 指定位置的数据。
  可以发现,除了数据阶段,其它阶段均以单线模式工作,数据阶段则是四线模式,每两个时钟读取一个字节的数据。当读取一个四字节数据时,总共花费了 48 个 SCK 时钟。
  通过内存地址访问 QSPI Flash
  前文中了解了如何通过 QSPI 接口访问 QSPI Flash,但如果每次通信都要配置 QSPI 外设的寄存器,再通过 QSPI 的数据寄存器获取数据的话,则无法让微控制器直接执行存储在 QSPI Flash 中的程序(XIP)。
  因此,可以将 QSPI Flash 映射到一段指定的内存地址空间内,例如,指定到 0x90000000 ~ 0x9FFFFFFF 这段 256MB 大小的空间内,当 CPU 访问 0x90000008 这段地址时,QSPI 模块将会读取 QSPI Flash 中 0x00000008 的数据,如果 CPU 继续访问 0x9000000C 的数据时,QSPI 模块将会读取 QSPI Flash 中 0x0000000C 的数据。对 CPU 而言,访问存储在 QSPI Flash 中的数据,就只是访问某一段地址空间的数据。这种读数据的方式称为 QSPI 的直接读模式,如图 6 所示。

值得注意的是,32 位的 CPU 一般会连续读取 4 字节的数据,当 CPU 读取 0x90000008 这段地址时,实际读取了 0x90000008 ~ 0x9000000B 四个字节的数据,但 QSPI 不会每读取一字节数据,就发起一次指令阶段+地址阶段+数据阶段的过程,而是以指令阶段+地址阶段+数据阶段读一字节,再读一字节,再读一字节……的方式读数据,当后面 CPU 继续访问 0x0000000C 时,就会跳过指令阶段和地址阶段,直接继续数据阶段再读一字节,再读一字节……直到微控制器访问了一个不连续的地址时,QSPI 才会重新发起指令阶段和地址阶段。
  因为地址连续的访问 QSPI Flash,QSPI 无需再次发起指令和地址阶段,所以其访问速度会比地址不连续的访问速度要快。
  计算机程序有一个特点,叫做时间局限性和空间局限性:
  时间局限性
  最近被访问的单元,很可能在不久的将来还要被访问。
  空间局限性
  最近被访问的单元,很可能它附近的单元也即将被访问。
  基于上述的特点,一般支持 QSPI 扩展 Flash 的微控制器会使用 CACHE 来暂存 QSPI Flash 中的内容,当 CPU 再次访问 QSPI Flash 前一段时间曾访问过的地址时,实际上访问的是暂存在 CACHE 中的数据,以此来减少访问 QSPI Flash 所花费的时间,加快程序执行的速度。在实际使用 QSPI Flash 存储应用程序的时候,效果可能不比片内 Flash 差多少。
  直接读模式能够读取 QSPI Flash 中的数据,但 QSPI Flash 中的程序不是一直不变的,不管程序员调试代码,还是 OTA 升级,都需要读数据之外的操作,这时候,如果还使用直接读模式访问 QSPI Flash 的话,就显得不太合适了:直接模式下,我们只需要配置一次 QSPI 访问 QSPI Flash 各阶段的配置,就能不断读取 QSPI Flash 中的数据,虽然方便,但缺少一定的自由度,例如无法实现写操作等过程。

因此,QSPI 还提供了间接模式,间接模式下,需要指定每一次数据传输过程的每一个细节:如指令阶段的参数是什么,地址阶段的具体地址值是多少等,虽然复杂,但给了我们充分通过 QSPI 访问 QSPI Flash 的方法,例如,当我们希望写修改 QSPI Flash 中的数据时,就可以使用间接写模式,将数据阶段的传输方向由 QSPI Flash 到 Host 转变为 Host 到 QSPI Flash,而在直接模式下,数据阶段只能是由 QSPI Flash 到 Host。
  

总结
  在本章中,介绍了 SPI,DSPI,QSPI的区别,访问 QSPI Flash 的过程,以及微控制器如何通过 QSPI 的直接读模式访问 QSPI Flash。
  微控制器通过 QSPI 的直接读模式访问 QSPI Flash,为直接执行存储在 QSPI Flash 中的应用程序提供了可能,这也是 2nd Bootloader 的目的所在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/757998.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20240629在飞凌的OK3588-C开发板的Linux R4系统下使用i2cdetect确认I2C总线

rootok3588:/# i2cdetect -y -r 0 rootrk3588-buildroot:/# i2cdetect -l rootrk3588-buildroot:/# i2cdetect -F 0 20240629在飞凌的OK3588-C开发板的Linux R4系统下使用i2cdetect确认I2C总线 2024/6/29 15:37 在CAM1、CAM2挂载OV13850。 在CAM3、CAM4和CAM5挂载OV5645了。 in…

AI大模型技术在音乐创造的应用前景

大模型技术在音乐创作领域具有广阔的应用前景,可以为音乐家、作曲家和音乐爱好者提供以下方面的帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 音乐创作辅助:大模型可以帮助音乐家和作曲家生成旋律、和声…

利用微信开放标签<wx-open-launch-weapp>在H5中跳转微信小程序报错完美的解决方案

一、报错&#xff1a; [WXTAG] [JSCORE] The slot <template> or <script type"text/wxtag-template"> of <wx-open-launch-weapp> is missing 二、源码 官方源代码如下&#xff0c;<script type"text/wxtag-template"></sc…

02.Linux下安装FFmpeg

目录 一、下载FFmpeg的编译源码 二、编译源码 三、ffmpeg工具结构解析 1、bin目录 2、include库 3、lib库 四、注意事项 五、可能出现的一些问题 1、某些工具未安装/版本过久 2、缺少pkg-config工具 3、缺少ffmplay FFmpeg 是一个开源的跨平台音视频处理工具集&…

快速修复mfc100u.dll丢失解决方案

相连文章&#xff1a;SecureCRT的安装破解 [详细过程2024] 有小伙伴向我反馈在打开SecureFX注册机之后显示【mfc100u.dll找不到】重装之后也没有用&#xff0c;这个是因为Microsoft Visual C的运行时组件和库出现了错误&#xff0c;直接选择重新安装就可以 出现这种情况的原因…

基于51单片机的密码锁Proteus仿真

文章目录 一、密码锁1.题目要求2.思路3.仿真图3.1 未仿真时3.2 初始界面3.3 输入密码界面3.4 开锁成功界面3.5 修改密码界面3.6 输入密码错误界面 4.仿真程序4.1 矩阵按键4.2 液晶显示16024.3 存储模块2402 二、总结 一、密码锁 1.题目要求 以51单片机为核心&#xff0c;设计…

OFDM的基本原理

OFDM技术使用相互正交的子载波组成多载波传输数据&#xff0c;此时不存在子载波间干扰和符号间干扰。设采样间隔为 &#xff0c;正交子载波可以表示为 基带信号a(n)采用矩形脉冲&#xff0c;则OFDM信号用公式可以表示 OFDM信号的N个采样点数据 可以用IFFT简化上述计算&#xf…

01:PCB板的介绍

PCB板的介绍 1、PCB的层叠结构1.1&#xff1a;单层板1.2&#xff1a;2层板1.3&#xff1a;4层板 2、封装简介 在1936年&#xff0c;奥地利人&#xff08;保罗爱斯勒&#xff09;使用箔膜技术&#xff0c;发明了第一个印刷电路板&#xff08;PCB板&#xff09;。使用减去法实现的…

Qt之饼图(Pie Graph)

[TOC](Qt之饼图(Pie Graph)) 饼图名为Pie Graph&#xff0c;用于显示一个数据系列中各项的大小与各项总和的比例。本文基于QtCharts实现饼图的显示。 1.实现过程 1.1环境配置 &#xff08;1&#xff09;首先想要使用QtCharts模块&#xff0c;需要在安装qt时选择勾选安装QtCha…

MySQL高级-SQL优化-insert优化-批量插入-手动提交事务-主键顺序插入

文章目录 1、批量插入1.1、大批量插入数据1.2、启动Linux中的mysql服务1.3、客户端连接到mysql数据库&#xff0c;加上参数 --local-infile1.4、查询当前会话中 local_infile 系统变量的值。1.5、开启从本地文件加载数据到服务器的功能1.6、创建表 tb_user 结构1.7、上传文件到…

华为RH2288H V2服务器,远程端口安装Linux操作系统

1、管理口 每台服务器的管理口不一样的&#xff0c;假如我的管理IP地址为&#xff1a;192.168.111.201 使用网线&#xff0c;将管理口和自己电脑连接起来&#xff0c;自己ip地址设置成和管理ip同一网段。 使用 ie 浏览器&#xff0c;如果是Edge&#xff0c;必须在Internet Exp…

Java教程之IO模式精讲,NIO+BIO

第一章 BIO、NIO、AIO介绍 背景 在java的软件设计开发中&#xff0c;通信架构是不可避免的&#xff0c;我们在进行不同系统或者不同进程之间的数据交互&#xff0c;或 者在高并发下的通信场景下都需要用到网络通信相关的技术&#xff0c;对于一些经验丰富的程序员来说&#x…

岗位实习最终篇(汇总)——人力资源管理系统(包含DDL,DML,视图,简单/复杂查询,触发器语句和存储过程语句)

DDL CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 员工ID,username VARCHAR(50) NOT NULL UNIQUE COMMENT 用户名,password VARCHAR(255) NOT NULL COMMENT 密码,first_name VARCHAR(50) NOT NULL COMMENT 名,last_name VARCHAR(50) NOT NULL COMMENT…

【数据结构|C语言版】四大排序(算法)

前言1. 插入排序1.1 直接插入排序1.2 希尔排序 2. 选择排序2.1 选择排序2.2 堆排序 3. 交换排序3.1 冒泡排序冒泡排序的步骤 3.2 快速排序快速排序的步骤 4. 归并排序归并排序的步骤&#xff1a;代码解释&#xff1a;归并排序的性能&#xff1a; 上期回顾: 【数据结构|C语言版】…

【后端面试题】【中间件】【NoSQL】ElasticSearch面试基本思路和高可用方案(限流、消息队列、协调节点、双集群)

基本思路 业务开发面试Elasticsearch的时候基本问的是基础知识以及倒排索引。 Elasticsearch最基本的可用性保障就是分片&#xff0c;而且是主从分片&#xff0c;所以遇到Elasticsearch如何做到高可用这个问题的时候&#xff0c;首先要提到这一点。 Elasticsearch高可用的核心…

【理解】关于正点原子i.MX6ULL LCD计算式的理解

文章目录 1 描述2 疑问3 理解 1 描述 在《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81.pdf》&#xff0c;P560页&#xff0c;第二十四章 RGBLCD显示实验中提到&#xff0c;LCD屏幕显示一行所需要的时间&#xff1a; t H S P W H B P H O Z V A L H F P ① t HSPW …

结构体 -------- 函数-------传参

在函数题中 return 只能传一个值 如果函数体&#xff08;struct fs a&#xff0c;struct fs b&#xff09;传来了两个值&#xff0c;怎么才能只输出一个值呢&#xff1f; 同样要定义一个struct fs 类型的变量 result&#xff1b; 这样不仅可以访问到结构体中的变量a&#…

【动态规划】2306. 公司命名

本文涉及知识点 动态规划汇总 LeetCode 2306. 公司命名 给你一个字符串数组 ideas 表示在公司命名过程中使用的名字列表。公司命名流程如下&#xff1a; 从 ideas 中选择 2 个 不同 名字&#xff0c;称为 ideaA 和 ideaB 。 交换 ideaA 和 ideaB 的首字母。 如果得到的两个新…

如何利用react框架快速创建一个electron项目

1、搭建electron项目 创建一个electron入门项目还是很容易的&#xff0c;基体方法可以参考&#xff1a;eletron入门教程 -- 快速写一个electron demo程序 但是如果要利用react框架搭建一个electron项目&#xff0c;但是有一点麻烦&#xff0c;不过可以利用工具包来进行创建&am…

寄存器相关知识点

文章目录 寄存器是什么&#xff1f;举例子—如何去看手册来配置寄存器寄存器地址知识点输出功能具体实现&#xff0c;在linux编写代码的话 其他 相关视频 寄存器是什么&#xff1f; 本质就是一个存储器&#xff0c;写内存和写指针都是一样的 寄存器里的值和RAM的值&#xff0c…