qspi(spi四线模式)

文章详细介绍了如何通过QSPI的四线模式提升CPU读取BIOSROM数据的速度,从而加快开机过程。涉及QSPI与SPI的区别,四线模式的配置,包括命令设置、时钟频率调整和数据读取时机。此外,还阐述了修改和验证QE寄存器状态的步骤,以及使用专用烧录器进行验证的流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目标:使用spi的四线模式,可以加快cpu读取bios rom里面的数据,从而更快的开机

一、基础参考资料CPU手册,ROM手册,硬件连接

用到的参考资料:主要是软件编程手册中qspi寄存器部分和对应的spi rom手册(如GD25LQ128D)

注意是QSPI寄存器,不是SPi寄存器,因为现在硬件是连在QSPI线上的。

SPI主要是CE#,SCK,SI以及SO四根信号线

QSPI会把除了VCC,GND之外的线,全部变成数据线。也就是SI,SO,HOLD#,WP# 4根数据传输线

然后我们目前用的只是读取数据的时候使用4根线。对应的命令在GD25LQ128D手册

目前使用的是0x6B命令,

BIOS读取数据前要把这个命令填在D2000 qspi RD_CFG(0x4)寄存器中。

(0x6B<<24) | (0x2<<20) | (0x4<<16) |(0x7<<4) | (0x1<<3) | 0x4

其中:6B对应spi手册上的Quad Output Fast Read命令,

0x2<< 20,代表使用010---->1-1-4模式,就是读取数据使用4根线,其余使用1根线传输

0x4代表sck为pclk的16分频,也就是37.5MHZ

0x7<< 4代表 数据要在命令之后8个cycle才读取(这个可以对应spi 手册 0x6b命令的要求)

a dummy byte对应 8个cycle

二、要修打开这个值,还必须要打开QE寄存器;

上图是spi对应的手册,要把这一位置1.有些spi rom出厂就是置1并且不可修改。

要修改QE,要先进入进入spi write enable

三、要通过qspi寄存器0x****10 0x****1c来操作上面这几个寄存器

对应的流程在手册中有说明,我们使用的是寄存器端口访问,也就是先往0x****10写指令,然后往0x****1c写1发送

这个write寄存器和上面那个read寄存器比较相似

so,我们先做个实验,将时序中所需要的CS#,SCLK,SI,SO找硬件连出来到示波器

然后在uefi shell中

mm 0x****10 0x6400000 -w 4(意思是往0x2****10写0x6400000,对应0x6这个命令write enable指令)

此时没有信号

然后mm 0x****1c 1 -w 4

示波器触发模式下信号如图:

从上到下分别是clk,cs,si对应时序:

可以看到后面四位是粉色那条线,对应110,也就是0x6

说明操作正确。

四、通过硕飞烧录器来读取修改寄存器来验证操作流程是否正确

可以看到QE处于Status register2上,查手册对应的修改命令为0x1或者0x31

查看status2的命令为0x35

五、完整验证流程

1.通过硕飞烧录器将QE置0

2.在shell下通过命令将QE置1

3.通过硕飞烧录器查看QE是否需要被置1

2步骤具体流程:

2.1通过0x35命令查看QE是否置0

mm 0x****10 0x35402000 -w 4

mm 0x****1c -w 4

可以看到0x2对应的就是QE,现在是置1的

2.2先将QE置1后,通过0x6进入write enable

mm 0x****10 0x6400000 -w 4

mm 0x****1c 1 -w 4

2.3,通过命令0x1置位QE

mm 0x****10 0x1402008 -w 4

mm 0x****1c 0x200 -w 4

这个0x1命令是同时修改status1 &&status2 .有些芯片支持只修改status2的命令

2.4通过硕飞烧录器看是否烧录正确

六、代码

修改的代码路径

这段代码的意思是往x0写0x****10,往w1写0x35402000,然后把w1写到x0对应的地址上

也就是往0x****10 写0x35402000

这个b.ne意思是如果w9不等w0(0x1828a1 这个是一个区别号),就跳转3f,3f意思是后面那个3:,如果是3b,是指前面那个3

具体操作流程参考五、完整验证流程

### 4线QSPI与单线SPI的工作原理 #### 单线SPI (Standard SPI) 标准SPI是一种同步串行通信接口,通常使用四根信号线:MOSI(Master Out Slave In)、MISO(Master In Slave Out)、SCK(Serial Clock)以及SS/CS(Slave Select)。在单线SPI模式下,数据传输是通过单一的数据线路完成的,在每个时钟周期内可以传送一位数据[^2]。 ```python # Standard SPI Data Transfer Example def spi_transfer_single_bit(data, clock_line, data_out_line, data_in_line): for bit in range(8): # Assuming an 8-bit transfer if data & (1 << bit): set_high(data_out_line) else: set_low(data_out_line) toggle(clock_line) # Toggle the clock line to initiate a bit transfer received_data = read_state(data_in_line) ``` #### 四线QSPI (QUAD SPI) 相比之下,四线QSPI扩展了传统的SPI架构,引入了额外的数据线(IO0到IO3),使得在同一时刻能够并行地发送四位数据。这意味着在一个完整的时钟周期里,理论上最多能传递四个比特的信息给目标设备或从其接收相同数量的数据。 ```python # Quad SPI Data Transfer Example def qspi_transfer_four_bits(data_quad, clock_line, io_lines): for quad_bit in range(2): # Two iterations since we're sending/receiving four bits at once for i in range(4): if data_quad & (1 << (quad_bit * 4 + i)): set_high(io_lines[i]) else: set_low(io_lines[i]) toggle(clock_line) # Toggle the clock line to initiate a quad bit transfer received_data_quad = sum([read_state(line) << i for i, line in enumerate(io_lines)]) ``` ### 主要区别 - **数据宽度**: QSPI允许每时钟周期处理更多位数的数据——通常是4位对比于SPI的一位。 - **性能提升**: 使用更多的物理连接来实现更高的带宽和更快的速度;对于读取密集型操作尤其有利。 - **复杂度增加**: 需要考虑更复杂的硬件设计和支持多路输入输出逻辑控制。 ### 应用场景 - **单线SPI适用场合** 当系统资源有限或者成本敏感的应用环境中,比如简单的传感器网络或是低功耗微控制器项目中,单线SPI因其简单性和较低的成本成为理想的选择。 - **四线QSPI适用场合** 对于需要快速访问大量存储空间的情况,如嵌入式系统的固件更新、实时操作系统加载等,四线QSPI提供了显著的优势。此外,在图形显示驱动程序和其他涉及频繁内存交换的任务中也表现出色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值