1. 项目概述与xSPI技术背景
在嵌入式系统开发中,尤其是涉及高速数据存储或大容量配置存储的场景,传统的单线SPI接口在带宽上常常捉襟见肘。为了解决这个问题,行业演进出了xSPI(扩展SPI)标准,而其中的Octal SPI(OSPI)更是将数据线扩展到了8根,实现了吞吐量的飞跃。瑞萨电子的RA8M2微控制器集成了一个功能强大的OSPI接口模块,它不仅仅是一个简单的8线SPI控制器,更是一个高度可配置、支持多种xSPI协议模式、具备精细时序调整和自动校准能力的复杂外设。理解并掌握这个接口,对于需要在RA8M2上挂接高速QSPI Flash、HyperRAM或者其他兼容xSPI协议存储器的开发者来说,是释放系统性能潜力的关键。
我在最近一个车载信息娱乐系统的项目中,就深度使用了RA8M2的OSPI接口来连接一颗1GB的Octal SPI NOR Flash,用于存储系统固件和图形资源。起初,我只是按照最简单的1S-1S-1S模式配置,发现读取速度远未达到芯片标称的200MB/s。经过一番折腾,才真正摸清了从协议模式选择、时序参数微调到自动校准使能的完整配置链条。这篇文章,我就结合RA8M2的用户手册和实际调试经验,为你彻底拆解OSPI接口的核心机制,特别是那些手册里一笔带过、但在实际应用中至关重要的细节。
2. OSPI接口整体架构与连接设计
RA8M2的OSPI模块是一个高度集成的xSPI主控制器,它扮演着系统总线(通常是AXI)与外部xSPI从设备(如Flash或RAM)之间的桥梁。其核心价值在于,它将复杂的xSPI协议时序、帧格式转换和总线仲裁对CPU透明化,开发者可以通过配置寄存器来定义通信行为,而无需直接操控底层信号波形。
2.1 硬件连接与信号定义
OSPI接口的信号线远比传统SPI丰富,正确的硬件连接是第一步。根据手册中的连接示例,我们可以清晰地看到其信号拓扑:
时钟与片选:
OM_n_SCLK:串行时钟输出,是所有数据传输的基准。OM_n_CS0/OM_n_CS1:片选信号,用于选择连接在总线上的不同从设备。例如,CS0接Flash,CS1接RAM,实现多设备共享总线。
数据与数据选通:
OM_n_SIO[7:0]:8位双向数据输入/输出线。这是Octal SPI带宽优势的物理基础。OM_n_DQS:数据选通(Data Strobe)信号。在DDR(双倍数据速率)模式或高速SDR模式下,该信号由从设备发出(读操作时)或由主设备发出(写操作时),用于在数据窗口中央精确采样数据,极大提升了时序裕度。
控制与状态:
OM_n_RESET:复位输出,可用于复位从设备。OM_n_ECSINT1:错误校正中断输入。当连接的从设备(如带有ECC功能的Flash)检测到错误时,可通过此信号通知MCU。OM_n_RSTO1/OM_n_WP1:这些是复用引脚,可能作为从设备的复位输出或写保护信号。
关键硬件设计经验: 手册中特别强调了上拉电阻的使用。对于
OM_n_SIO[7:0]和OM_n_DQS这类双向信号,当它们作为输入时,其输入使能是在软件设置引脚功能后才生效的。在这之前,引脚处于高阻态。如果从设备输出能力较弱或总线负载较重,高阻态可能导致信号线浮空,引入噪声。因此,强烈建议在OM_n_SIO[7:0]和OM_n_DQS信号线上添加弱上拉电阻(例如4.7kΩ到10kΩ)。这能确保在引脚切换方向或空闲时,信号处于确定的逻辑高电平,避免误触发。这是很多硬件设计容易忽略,但会导致通信不稳定的关键点。
2.2 核心工作模式解析
OSPI模块主要提供三种高层次的操作模式,以适应不同的应用场景:
存储器映射模式(Memory-Mapping Mode):这是最高效、最常用的模式。开发者可以将外部Flash或RAM的地址空间映射到MCU的系统总线地址上(例如,映射到0x6000_0000开始的地址)。之后,CPU或DMA通过Load/Store指令或总线访问该地址区域时,OSPI模块会自动将访问转换为对应的xSPI读写事务。这对于XIP(就地执行)应用至关重要,代码可以直接在外部Flash中运行。
手动命令模式(Manual-Command Mode):此模式提供更底层的控制。开发者需要显式地配置命令码、地址、数据到特定寄存器,然后触发传输。它又分为:
- 直接模式:用于一次性发送一个或多个(最多4个)自定义命令序列,常用于初始化设备、读取状态寄存器、写使能等操作。
- 周期模式:定期发送一个读命令并比较返回数据,可用于轮询设备状态(如等待Flash擦写完成)。
模式控制(Pattern Control):用于发送一些非标准xSPI帧的特殊序列,例如:
- XiP禁用模式:发送特定模式退出XiP状态。
- 复位模式:发送JEDEC标准定义的串行Flash复位序列。
- 仅CS模式:仅控制CS信号线拉低一段时间,可用于唤醒处于深度掉电状态的设备。
3. xSPI协议模式深度解析与选型指南
RA8M2的OSPI支持丰富的xSPI协议模式,通过配置LIOCFGCSn.PRTMD[9:0]寄存器来选择。这些模式定义了命令、地址、数据三个字段分别在多少根数据线上、以何种时钟速率(SDR或DDR)进行传输。选对模式是发挥硬件性能的第一步。
3.1 协议模式详解
下表是手册中支持的部分关键协议模式及其解读:
| 协议模式 (PRTMD) | 命令字段 | 地址字段 | 数据字段 | 数据采样时钟 | 适用场景与说明 |
|---|---|---|---|---|---|
| 1S-1S-1S (0x000) | SDR, 1线 | SDR, 1线 | SDR, 1线 | OM_SCLK | 兼容传统SPI模式,速度最慢,但兼容性最好。常用于初始化或与只支持标准SPI的设备通信。 |
| 1S-2S-2S (0x048) | SDR, 1线 | SDR, 2线 | SDR, 2线 | OM_SCLK | 命令用单线,地址和数据用双线。一些QSPI Flash在“扩展SPI”模式下使用,性能优于全单线。 |
| 4S-4S-4S (0x092) | SDR, 4线 | SDR, 4线 | SDR, 4线 | OM_SCLK | 标准的QSPI(Quad SPI)模式,命令、地址、数据都在4根线上传输,是许多QSPI Flash的主要工作模式。 |
| 4S-4D-4D (0x3B2) | SDR, 4线 | DDR, 4线 | DDR, 4线 | OM_DQS | 高性能QSPI DDR模式。命令用SDR发送(确保可靠),地址和数据用DDR传输,并利用DQS信号采样。这是许多高速Octal Flash在“8D-8D-8D”模式前的常见高性能模式。 |
| 8D-8D-8D (0x3FF) | DDR, 8线 | DDR, 8线 | DDR, 8线 | OM_DQS | 顶级的Octal SPI DDR模式。所有字段都在8根数据线上以DDR速率传输,提供最大带宽。通常需要存储器支持JEDEC xSPI协议(Profile 1.0或2.0)。 |
关于“S”和“D”的进一步解释:
- S (Single Data Rate):数据在时钟的一个边沿(通常是上升沿)被采样或输出。
- D (Double Data Rate):数据在时钟的上升沿和下降沿都被采样或输出,理论上将数据速率翻倍。
- 采样时钟:在SDR模式下,通常用主时钟
OM_SCLK采样。在高速DDR模式下,为了确保采样点位于数据眼图的中心,必须使用由从设备或主设备产生的OM_DQS(数据选通)信号来采样,它能跟随数据和时钟的偏移。
3.2 协议模式选型实战建议
选择哪种模式,不单单是看手册支持列表,更要看你的存储器件支持什么。
确认器件能力:首先查阅你的Flash或RAM数据手册,找到其支持的最高性能模式。例如,一颗Flash可能支持:标准SPI (1-1-1), Fast Read (1-1-1), Dual Output (1-1-2), Quad Output (1-1-4), Quad I/O (1-4-4), 以及 QPI (4-4-4) 和 Octal DDR (8-8-8) 模式。RA8M2的“4S-4S-4S”对应QPI,“8D-8D-8D”对应Octal DDR。
初始化序列:绝大多数高性能存储器默认上电处于传统的1-1-1模式。你需要先通过手动命令模式,发送一系列特定的命令(如写使能、写状态寄存器、进入QPI/Octal模式命令)将其切换到目标高性能模式。切换模式后,OSPI控制器的
PRTMD配置必须与器件当前模式严格匹配,否则通信会完全失败。性能与稳定性权衡:
- 追求极致带宽:如果硬件布线良好(等长、阻抗控制),且器件支持,首选
8D-8D-8D模式。 - 平衡性能与可靠性:
4S-4D-4D是一个很好的折中选择。命令用SDR保证可靠性,核心的数据传输用DDR提升速度。在许多实际项目中,这种模式的稳定性最高。 - 兼容性与调试:在驱动开发初期,可以先用
1S-1S-1S或4S-4S-4S模式让通信先跑起来,完成基本的读写验证后,再尝试切换到更快的DDR模式。
- 追求极致带宽:如果硬件布线良好(等长、阻抗控制),且器件支持,首选
关于XiP模式:手册中提到,在存储器映射模式下,可以启用XiP模式。此模式下,OSPI会在Latency周期字段中插入特定的XiP代码,而从设备会“记住”上一次的命令。这样,后续的读事务可以省略命令阶段,直接发送地址就开始读数据,减少了协议开销,降低了读取延迟。这对于需要随机读取代码执行的XIP应用性能提升明显。但需注意,XiP模式通常只支持单向访问(例如,仅用于读操作,写操作需要先退出XiP模式)。
4. 时序控制机制:确保高速信号完整性的关键
当通信速率达到几十甚至几百MHz时,PCB走线延迟、器件输入输出延迟等都会变得不可忽视。RA8M2的OSPI提供了非常精细的时序控制寄存器,允许开发者对关键信号的驱动和采样时刻进行微调,这是实现稳定高速通信的“法宝”。
4.1 核心时序参数寄存器
时序控制主要通过对LIOCFGCSn和WRAPCFG等寄存器的配置实现。下表总结了主要的可调参数:
| 控制信号 | 工作模式 | 默认时序 | 可调参数与寄存器位 | 调整目的与场景 |
|---|---|---|---|---|
| OM_CSn | 所有模式 | 断言:在第一个SCLK上升沿前1个周期。 取消断言:在最后一个SCLK下降沿后1.5个周期。 | CSAEXT: 断言扩展周期。CSNEGEX: 取消断言扩展周期。 | 调整CS信号的有效宽度,以满足不同从设备对CS建立/保持时间的要求。 |
| OM_SIO输出 | SDR (无DS) | 在内部时钟clk_spi的下降沿驱动数据。 | SDRDRV: 0或0.5个周期的驱动偏移。 | 微调数据输出的时刻,让数据在SCLK边沿时达到稳定。如果发现从设备采样数据有误,可尝试调整此值。 |
| OM_SIO输入 | SDR (无DS) | 在预期的数据大小的最后一个OM_SCLK下降沿采样。 | SDRSMPSFT[3:0]: 0-7个周期的采样偏移。SDRSMPMD: 0或0.5个周期的精细偏移。 | 这是调试SDR模式读数据错误最常用的参数。通过延迟采样点,可以避开数据建立/保持时间的违规区域。 |
| OM_SIO输入 | SDR/DDR (有DS) | 在OM_DQS信号的边沿采样。 | DSSFTCSn[4:0]: 0-1个周期的DQS相位偏移。DDRSMPEX[3:0]: 0-7个周期的DDR采样扩展。 | DDR模式的核心调整参数。DSSFTCSn用于微调DQS与数据的相对相位(理想是90度偏移)。DDRSMPEX用于扩展采样窗口。 |
4.2 时序调整实战:以SDR无DS模式为例
假设我们使用4S-4S-4S模式,SCLK频率为50MHz。在调试时发现读回的数据偶尔出错。
分析:在SDR无DQS模式下,数据依靠SCLK采样。问题可能源于数据相对于SCLK的建立时间(
tSU)或保持时间(tH)不足。这可能是由于PCB走线长度差异导致数据信号比时钟信号晚到(或早到)从设备引脚。调整策略:RA8M2作为主设备,可以调整它采样输入数据的时刻。如果数据来得晚,我们就晚点采。
- 查看
LIOCFGCSn.SDRSMPSFT寄存器。默认是0,即在最后一个SCLK下降沿采样。 - 尝试递增此值。将其设置为1,意味着采样点推迟1个完整的
clk_spi周期(注意,clk_spi频率可能与SCLK不同,需查时钟树)。这相当于将采样窗口向右移动。 - 如果设置为1后问题依旧或更糟,可以尝试设置
SDRSMPMD位进行0.5个周期的微调。
- 查看
操作方法:在初始化OSPI、设置好协议模式后,通过一个简单的循环,读取Flash的ID或某个固定地址的数据,同时逐步调整
SDRSMPSFT的值(从0到7),观察哪个值下读数据100%正确。这个值就是当前硬件环境下最优的采样偏移。
重要心得:时序调整是一个“寻找最佳窗口”的过程。在调整一个参数时,最好保持其他参数为默认值。每次调整后,进行大量的重复读写测试(比如连续读取1MB数据并校验)。有时候,一个参数调好了,但温度变化或电源波动又可能导致问题,因此最优值需要一定的裕量。
4.3 DDR模式与DQS相位调整
在4S-4D-4D或8D-8D-8D模式下,OM_DQS信号至关重要。理想情况下,DQS的边沿应该对准数据眼图的中心,这样在DQS触发时,数据是最稳定的。
手册指出:“在xSPI协议的DDR模式下,DS(即DQS)应与数据的中心对齐。这意味着需要偏移0.25个周期(90度)的相位。” RA8M2通过WRAPCFG.DSSFTCSn寄存器支持这个相位调整,调整粒度是1/32个周期。
调试步骤:
- 使能自动校准功能(后文详述),让硬件自动找到一个初始的
DSSFTCSn值。 - 如果自动校准后通信仍不稳定,可以围绕校准得到的值,手动微调
DSSFTCSn。例如,校准值是20(十进制),你可以尝试设置为18、19、21、22进行测试。 - 使用逻辑分析仪或示波器观察
OM_DQS和OM_SIO的信号波形,是最直接的调试方法。你可以看到DQS边沿是否确实位于数据信号的有效窗口中央。
5. 自动校准功能:让高速通信“自适应”硬件
手动调整时序参数固然强大,但对开发者要求高,且一旦硬件(如PCB、器件批次)发生变化,可能需要重新调试。RA8M2 OSPI的自动校准功能就是为了解决这个问题而生的,它能动态地寻找最佳的DQS采样相位。
5.1 自动校准工作原理
自动校准的核心思想是:OSPI主设备向从设备写入一个已知的数据模式,然后再读回来,通过比较写入和读出的数据,来判断当前DQS采样相位是否正确。
- 使能校准:设置
CCCTL0CSn.CAEN = 1,并为该通道使能自动校准。 - 校准序列:使能后,OSPI主设备会周期性地发起校准序列。这个序列包含一个写事务和一个读事务。
- 相位扫描与比较:在每次校准序列中,主设备会尝试不同的
WRAPCFG.DSSFTCSn值(即DQS相位偏移),并读取数据与预期值比较。 - 结果判定与更新:
- 校准成功:如果至少一次读比较匹配,则
INTS.CASUCCSn标志置1,并且DSSFTCSn寄存器会被更新为找到的有效值。 - 校准失败:如果所有相位尝试下的读数据都不匹配,则
INTS.CAFAILCSn标志置1,DSSFTCSn值保持不变。
- 校准成功:如果至少一次读比较匹配,则
- 状态监控:可以通过
CASTTCSn寄存器监控每个DQS移位值的校准结果状态。
5.2 自动校准配置与使用指南
何时使用:强烈建议在系统初始化阶段,在切换到高速DDR模式(如
8D-8D-8D)后,立即执行一次自动校准。也可以在系统运行时定期校准,以应对温度漂移。配置前提:
- 必须使用支持DQS信号的协议模式(如
4S-4D-4D,8D-8D-8D)。 - OSPI与存储器之间的基本通信必须已经建立(例如,在SDR模式下能正常读写ID)。
- 校准过程中,不能有其他总线访问干扰。
- 必须使用支持DQS信号的协议模式(如
操作流程:
// 伪代码示例 void ospi_auto_calibrate(uint8_t channel) { // 1. 停止所有对该OSPI通道的访问(CPU、DMA等) // 2. 配置为支持DQS的模式,例如 8D-8D-8D LIOCFGCSn[channel].PRTMD = 0x3FF; // 3. 使能自动校准 CCCTL0CSn[channel].CAEN = 1; // 4. 等待校准完成中断或轮询状态位 while(!(INTS.CASUCCSn & (1<<channel)) && !(INTS.CAFAILCSn & (1<<channel))) { // 等待 } // 5. 处理结果 if (INTS.CASUCCSn & (1<<channel)) { printf("通道%d 自动校准成功,DSSFTCSn值: %d\n", channel, WRAPCFG.DSSFTCSn[channel]); INTS.CASUCCSnC = (1<<channel); // 清除成功标志 } else { printf("通道%d 自动校准失败!\n", channel); // 可能需要检查硬件连接或降低时钟频率重试 INTS.CAFAILCSnC = (1<<channel); // 清除失败标志 } // 6. 关闭自动校准(可选,也可保持开启用于周期校准) CCCTL0CSn[channel].CAEN = 0; }常见问题与排查:
- 校准始终失败:首先检查
OM_DQS信号线是否连接正确,上拉电阻是否已安装。其次,尝试降低OSPI的时钟频率(clk_spi)后重试。过高的频率可能导致信号质量太差,无法找到有效的采样窗口。 - 校准成功后通信仍不稳定:自动校准找到的是一个“能工作”的相位,但不一定是最优的、裕量最大的相位。可以尝试在校准得到的值附近,进行手动微调,并进行压力测试(高低温、电压波动)。
- 注意中断冲突:校准完成会产生中断。确保中断服务程序能正确区分
CASUCCSn和CAFAILCSn,并及时清除标志位。
- 校准始终失败:首先检查
6. 存储器映射模式的高级功能与优化
存储器映射模式是将OSPI性能发挥到极致的关键。除了基本的地址映射,RA8M2还提供了几项高级功能来优化系统性能。
6.1 组合写入功能
当系统总线主设备(如CPU或DMA)执行一系列地址连续的写操作时,默认每个AXI写事务都会触发一个独立的xSPI帧。这会产生大量的命令、地址开销,降低有效数据吞吐量。
组合写入功能通过设置BMCFGCHn.MWRCOMB = 1来启用。启用后,OSPI模块会缓存连续的写数据,直到满足预设的数据块大小(BMCFGCHn.MWRSIZE),或者遇到以下情况之一,才一次性发起一个大的xSPI写事务:
- 检测到非递增的地址。
- 检测到不同的突发类型(如从INCR变为WRAP)。
- 检测到读事务。
- 访问了不同的从设备(CS切换)。
- 软件主动设置了
BMCTL1.MWRPUSHCHn位。
实战价值:许多Flash芯片以“页”为单位进行编程。例如,一颗Flash的页大小是256字节。如果你需要写入300字节的数据,没有组合功能时,会触发多个写事务。有了组合功能,OSPI可以先将前256字节组合成一个页编程命令发出,大大提升了写入效率。你需要根据Flash的页大小来合理设置MWRSIZE。
6.2 预取功能
对于读操作,尤其是CPU执行XIP代码时,访问模式通常是顺序的。预取功能通过设置BMCFGCHn.PREEN = 1启用。
工作原理:当CPU读取某个地址时,OSPI不仅读取请求的数据,还会预取后续地址的数据到内部的预取缓冲区。当CPU接下来访问的地址正好在预取缓冲区中时,数据可以直接从缓冲区返回,无需再次访问较慢的外部Flash,从而显著降低读取延迟。
使用注意事项:
- 数据一致性:预取缓冲区可能导致数据一致性问题。如果多个主设备(如两个CPU核心)访问同一地址,或者主设备在写后立即读,预取缓冲区可能持有旧数据。手册明确指出,OSPI不保证能读到从设备的最新数据。解决方案是:在需要确保读取最新数据时(例如,写操作后),通过设置
BMCTL1.PBUFCLRCHn位来清空预取缓冲区。 - 访问模式:预取功能对于顺序读取(如执行代码)效果极佳。但对于完全随机的读访问,预取反而会造成总线带宽浪费(预取了用不到的数据),并可能清空有用的缓存数据。在这种情况下,可以考虑关闭预取功能。
6.3 XiP模式的配置与陷阱
XiP模式通过省略命令阶段来减少读延迟。配置流程如下:
- 通过手动命令模式,发送特定命令使外部Flash进入XiP模式(具体命令需查Flash手册)。
- 设置OSPI的
CMCTLCHn.XIPEN = 1,并配置XIPENCODE(进入代码)和XIPEXCODE(退出代码)。这些代码会被插入到xSPI帧的Latency周期字段中。 - 在存储器映射模式下进行读操作时,OSPI会自动使用XiP帧格式(无命令阶段)。
关键陷阱:
- 延迟周期必须足够:手册警告,如果配置的Latency周期数不足以容纳XiP代码,则代码无法插入,XiP模式可能失效。需要确保
CMCFG1CSn.RDLATE[4:0]等寄存器设置的延迟周期数大于等于XiP代码的传输所需周期。 - 单向访问限制:XiP模式通常只适用于读操作。如果需要写操作,必须先通过配置
XIPEN = 0让OSPI发送包含退出代码的帧,使Flash退出XiP模式,然后进行写操作,写完再重新进入XiP模式。这个过程需要仔细管理。 - 通道独立性:手册特别指出,发送XiP禁用模式会同时禁用两个通道(CS0和CS1)的XiP模式。不能仅针对一个通道禁用。如果你的系统两个CS连接了不同的设备,且只有一个支持XiP,需要特别注意这个全局性影响。
7. 错误处理与中断管理
可靠的系统需要能处理异常。RA8M2 OSPI提供了多种错误检测机制。
7.1 错误类型列表
| 错误类型 | 触发条件 | 状态标志位 | 严重性与处理建议 |
|---|---|---|---|
| 校准失败 | 自动校准过程中,所有相位尝试均未读到预期数据。 | INTS.CAFAILCSn | 高。校准失败意味着无法找到可靠的DQS采样点,继续DDR通信极可能出错。应检查硬件连接、降低频率或切换至SDR模式。 |
| 系统总线错误 | 在存储器映射模式下,AXI从接口接收到错误响应。 | INTS.BUSERRCHn | 致命。通常意味着访问了未配置或非法的地址空间。应复位OSPI模块并检查地址映射配置。 |
| ECC错误检测 | OM_ECSINT1引脚上检测到下降沿(需从设备支持并触发)。 | INTS.ECSCS1 | 通知性。仅表示从设备内部检测到ECC错误。应由软件决定如何处理(如重读、使用备份扇区)。 |
| DS超时 | 在需要使用DQS的读事务中,DQS信号没有切换。 | INTS.DSTOCSn | 高/致命。如果在校准中发生,清除标志即可。在其他情况下发生,表明从设备无响应或DQS线故障,需复位主从设备。 |
| 周期事务超时 | 在周期手动命令模式下,读回的值与预期值不匹配。 | INTS.PERTO | 应用相关。取决于你用它来轮询什么状态。例如,轮询Flash忙标志超时,可能意味着Flash损坏或命令错误。 |
7.2 中断配置与处理流程
OSPI中断分为两类:OSPI0_CMP(完成)和OSPI0_ERR(错误)。错误中断涵盖了上述大部分错误类型。
中断服务程序编写要点:
- 读取状态寄存器:首先读取
INTS寄存器,确定中断源。 - 分情况处理:
- 对于
CASUCCSn(校准成功),通常只需清除标志,并记录下新的DSSFTCSn值。 - 对于
CAFAILCSn(校准失败),需要记录错误,并考虑降级到安全模式(如SDR)或尝试重新初始化。 - 对于
DSTOCSn(DS超时),如果是非校准期间发生,应视为严重硬件或通信故障,进行系统错误处理或复位。 - 对于
BUSERRCHn,应检查软件是否有非法内存访问。
- 对于
- 清除中断标志:通过向对应的
xxxC位写1来清除中断标志。务必在中断处理结束前完成,否则会导致中断持续触发。 - 中断使能:在初始化时,通过
INTE寄存器使能你需要关注的中断源。例如,在启用自动校准前,务必使能CASUCCSnE和CAFAILCSnE。
8. 配置与操作流程全览
最后,我们以一个典型的OSPI初始化流程来串联所有知识点:
引脚与时钟配置:
- 将相关引脚复用为OSPI功能(
OM_SIO,OM_SCLK,OM_CS,OM_DQS等)。 - 配置
clk_spi时钟源和分频,得到目标SCLK频率。初期调试建议从低频开始(如10-20MHz)。
- 将相关引脚复用为OSPI功能(
基本协议模式设置:
- 停止所有OSPI通信(确保无访问)。
- 配置
LIOCFGCSn.PRTMD为1S-1S-1S或4S-4S-4S等基础SDR模式。 - 配置
CMCFGxCSn寄存器,设置读写命令码、地址长度等(根据Flash手册)。
器件初始化与模式切换:
- 使用手动命令模式(直接模式),发送一系列命令初始化外部存储器(如写使能、设置状态寄存器)。
- 发送命令切换到目标高性能模式(如QPI模式、Octal DDR模式)。
切换OSPI到高性能模式并调整时序:
- 将
LIOCFGCSn.PRTMD改为目标模式(如8D-8D-8D)。 - 如果使用DDR模式,运行自动校准,获取初始
DSSFTCSn值。 - 根据实际情况,手动微调
DSSFTCSn、SDRSMPSFT等时序参数。
- 将
配置存储器映射与高级功能:
- 配置
CMCFGxCSn寄存器,定义存储器映射区域的读写命令。 - 根据应用需求,使能组合写入(
MWRCOMB)和预取(PREEN)功能,并设置合适的大小。 - 如果需要XiP,配置XiP相关寄存器并使能。
- 配置
使能访问与测试:
- 完成所有配置后,系统总线主设备即可访问映射的内存地址。
- 进行全面的读写测试,包括边界测试、压力测试(大数据量连续读写),确保稳定性。
在整个过程中,逻辑分析仪是必不可少的调试工具。用它来抓取OM_SCLK、OM_CS、OM_SIO、OM_DQS的实际波形,对照数据手册的时序图,是排查通信问题最直接有效的方法。记住,OSPI的配置虽然复杂,但遵循“先慢后快,先简后繁”的原则,逐步验证每一步,就能最终驾驭这个强大的高速接口。