Skip to content

QSPI

SPI: 标准SPI

Dual SPi: 双线SPI

Qual SPI: 四线SPI

image-20240101171723383

image-20240101171848711

image-20240101172006463

间接模式: 就是之前使用的模式

状态轮训模式: 读取状态, 在编程结束以后可以使用这一个

内存映射: 直接使用指针进行操作

优化操作: 加快速递, 单倍数据是单边沿检测, 双倍数据模式是双边沿检测

模式

  • 间接模式

相当于之前使用的普通模式

image-20240103141222725

  • 内存映射

image-20240103141254519

在进行写入或者命令操作的时候需要退出这一个模式, 读取的时候可以直接读取内存

c
static void norflash_ex_enter_mmap(void)
{
    uint32_t tempreg = 0;

    /* BY/W25QXX 写使能(0X06指令) */
    while (QUADSPI->SR & (1 << 5)); /* 等待BUSY位清零 */

    QUADSPI->CCR = 0X00000106;      /* 发送0X06指令,BY/W25QXX写使能 */

    while ((QUADSPI->SR & (1 << 1)) == 0);  /* 等待指令发送完成 */

    QUADSPI->FCR |= 1 << 1;

    if (qspi_wait_flag(1 << 5, 0, 0XFFFF) == 0) /* 等待BUSY空闲 */
    {
        tempreg = 0XEB;         /* INSTRUCTION[7:0]=0XEB,发送0XEB指令(Fast Read QUAD I/O) */
        tempreg |= 1 << 8;      /* IMODE[1:0]=1,单线传输指令 */
        tempreg |= 3 << 10;     /* ADDRESS[1:0]=3,四线传输地址 */ 
        tempreg |= (uint32_t)g_norflash_addrw << 12;    /* ADSIZE[1:0]=2,24/32位地址长度 */
        tempreg |= 3 << 14;     /* ABMODE[1:0]=3,四线传输交替字节 */
        tempreg |= 0 << 16;     /* ABSIZE[1:0]=0,8位交替字节(M0~M7) */
        tempreg |= 4 << 18;     /* DCYC[4:0]=4,4个dummy周期 */
        tempreg |= 3 << 24;     /* DMODE[1:0]=3,四线传输数据 */
        tempreg |= 3 << 26;     /* FMODE[1:0]=3,内存映射模式 */
        QUADSPI->CCR = tempreg; /* 设置CCR寄存器 */
    }

    sys_intx_enable();          /* 开启中断 */
}

使能的方式

  • 命令序列

image-20240103141601809

image-20240103141731802

image-20240103142028363

image-20240103142220120

image-20240103142402850

寄存器

image-20240103142743819

image-20240103143127466

image-20240103143153137

image-20240103144517076

image-20240103144752028

image-20240103144911005

image-20240103144957975

image-20240103145111275

image-20240103145950945

image-20240103150045343