做教育导航的网站,网站平台建设的实训报告,石化建设分会网站,婚纱摄影网站毕业设计phpSPI 是英语 Serial Peripheral interface 的缩写#xff0c;顾名思义就是串行外围设备接口#xff0c;一种高速的#xff0c;全双工#xff0c;同步的通信总线#xff0c;并且在芯片的管脚上只占用四根线#xff0c;节约了芯片的管脚#xff0c;为 PCB 的布局上节省空间…SPI 是英语 Serial Peripheral interface 的缩写顾名思义就是串行外围设备接口一种高速的全双工同步的通信总线并且在芯片的管脚上只占用四根线节约了芯片的管脚为 PCB 的布局上节省空间提供方便主要应用在 EEPROMFlashRTCAD转换传感器等设备上。 SPI 的四根信号线 CS 片选信号线每个设备都占用一个片选信号线当 CS 信号线显低电平时表示该设备被选中则 SCKMOSI 和 MISO 信号有效。每个设备都拥有属于自己的 CS 信号线主机选中设备时会拉低指定设备的 CS 线电平。使用 CS 信号线可以使多个设备共同使用同一份 SCKMOSI 和 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发送第二个比特在不增加信号线的基础上一个时钟发送两个比特数据相当于传输速率提升了一倍这就叫做 DSPID 是 Dual 的意思。如图 2 所示。 但 DSPI 的速度好像还是有些慢如果再增加两条数据线D3 和 D4让传输速度提升到 DSPI 的两倍那么 DSPI 就变成了 QSPIQ 是 Quad 的缩写。 相比较于 SPIQSPI 在数据传输的时候一个 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 bit16 bit24 bit 和 32 bit。 交替字节阶段 传输方向为 Host 发送给 QSPI Flash具体用法需参考所使用的 QSPI Flash 手册传输方向由 Host 发送给 QSPI Flash其长度可能为 8 bit16 bit24 bit 和 32 bit。 空指令周期阶段 给 QSPI Flash 缓冲时间准备数据等待 n 个 SCK 周期n 取值范围 0 ~ 31具体值需参考所使用 QSPI Flash 手册。这段时间 Host 只产生特定数量的 SCK 时钟不从数据信号线中读取或发送任何内容。 数据阶段 读数据或写数据长度不定由主机决定发送或接收多少数据。 在与 QSPI Flash 通信时其通信过程如图 4 所示 CSNSS信号线拉低表示 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 FlashQSPI 无需再次发起指令和地址阶段所以其访问速度会比地址不连续的访问速度要快。 计算机程序有一个特点叫做时间局限性和空间局限性 时间局限性 最近被访问的单元很可能在不久的将来还要被访问。 空间局限性 最近被访问的单元很可能它附近的单元也即将被访问。 基于上述的特点一般支持 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。 总结 在本章中介绍了 SPIDSPIQSPI的区别访问 QSPI Flash 的过程以及微控制器如何通过 QSPI 的直接读模式访问 QSPI Flash。 微控制器通过 QSPI 的直接读模式访问 QSPI Flash为直接执行存储在 QSPI Flash 中的应用程序提供了可能这也是 2nd Bootloader 的目的所在。