166|0

11

帖子

0

TA的资源

一粒金砂(中级)

【Follow me第二季第3期】基础任务+quad-spi flash和octo-spi flash配置及读写速度 [复制链接]

本帖最后由 聪聪哥哥 于 2025-1-11 10:55 编辑

今天和大家分享一下,基本任务:quad-spi flash和octo-spi flash配置及读写速度测试过程;

前言:通过查看本次活动的开发板RA6M5开发板,我们可以看到该款开发板上面提供了多种外设模块,为了测试不同的SPI模块的性能,搭建了Quand-SPI flash-MX25L25645G和Octo-SPI Flash-MX25LM51245GM两种不同的存储芯片。

依靠着瑞萨提供的FSP(Flexiable Software Package)工具,我们不仅仅可以配置本次任务中所使用的SPI接口引脚部分,也可以通过图形化配置工具,对底层的驱动函数进行自动生成,我们可以在生成底层驱动代码下,开发相对应的功能。

本次任务中所使用的模块资料如下:

1:quad spi 芯片flash-MX25L25645G   2:octo spi芯片: Flash-MX25LM51245GM

一:我们先简单了解一下 quad spi

基本的概念:Quad-SPI是一种串行接口,它通过四条数据线(I0、I1、I2、I3)实现数据的读取、写入和擦除操作。

设计的目的:Quad-SPI设计的主要目的是与支持此接口的闪存芯片进行通信,解决一些应用存储空间不足的问题,尤其是当使用大量多媒体数据时。

传输速度:与传统SPI接口相比,Quad-SPI提供了更高的数据传输速率和更大的带宽。传统SPI通常只有两根数据线(MOSI和MISO),而Quad-SPI则有四根数据线,可以同时传输四路数据,从而大大提升传输速率。

二:quad spi的工作原理:

2.1 双向数据线:Quad-SPI接口的数据线是双向的,可以根据需要动态配置为输入或输出。在数据传输过程中,Quad-SPI接口通过时钟信号控制数据的同步传输。

2.2通讯过程:Quad-SPI的通信过程通常包括指令阶段、地址阶段、交替字节阶段、空指令周期阶段和数据阶段。在指令阶段,Quad-SPI接口发送一个8位指令到闪存芯片,指定要执行的操作类型;在地址阶段,发送1~4字节的地址信息,指示操作的目标位置;交替字节阶段用于发送控制操作模式的字节;空指令周期阶段则用于准备数据线的传输方向;最后,在数据阶段,Quad-SPI接口可以从闪存芯片接收或向其发送任意数量的字节。

2.3 通讯数据效率模式:Quad-SPI支持双倍数据速率模式,即在每个时钟周期的上升沿和下降沿都传输数据,从而实现了数据传输速率的加倍。但需要注意的是,这个功能需要微控制器和闪存芯片都支持才能实现。

三:Quad-SPI的优势和未来的存在的发展的可能性

随着技术的不断发展,Quad-SPI接口的性能和功能也将不断提升。例如,一些最新的Quad-SPI接口支持更高的时钟频率和更大的数据传输量,同时还提供了更多的配置选项和更强大的错误检测与纠正功能。这些改进使得Quad-SPI接口在高性能嵌入式系统中的应用更加广泛和深入。此外,Octo-SPI作为Quad-SPI的升级版,通过增加数据线的数量来进一步提高数据传输速率和带宽,为嵌入式系统提供了更多的选择和可能性。

综上所述,Quad-SPI是一种功能强大、灵活高效的串行接口,它通过四条数据线实现了与外部闪存芯片的高速通信。在嵌入式系统中发挥着至关重要的作用,并随着技术的不断进步而持续发展。

原理图如下所示:

1.png

在和大家分享一下octo-spi 的相关知识

基本概念:Octo-SPI是一种高速串行接口技术,它通过使用八条数据线(而不是Quad-SPI的四条)来进一步提高数据传输速率和带宽。这种接口技术适用于需要处理大量数据的现代嵌入式系统,如智能手机、平板电脑、数码相机等消费电子产品。

Octo-SPI的主要特点如下:

1:高效的数据传输:Octo-SPI通过增加数据线的数量,实现了更高的数据传输速率。每个时钟周期可以传输多达8个比特的数据,从而大大提高了通信效率。

2:并行通信:与Quad-SPI类似,Octo-SPI也采用并行通信方式。但由于其数据线数量加倍,因此通信效率更高。

3:向下兼容:Octo-SPI接口通常也支持Single-SPI、Dual-SPI和Quad-SPI模式,这意味着它可以与这些较低版本的SPI接口设备兼容。

4:内存映射模式:在Octo-SPI接口中,外部存储器可以像内部内存一样被访问。这提高了系统的总线主控器(如DMA)在CPU停机的低功耗模式下自动访问外部内存的能力。

5:多种操作模式:Octo-SPI支持多种操作模式,包括直接模式、自动状态转移模式和内存映射模式等。这些模式可以根据具体的应用需求进行选择。

基本工作原理:

Octo-SPI的工作原理与Quad-SPI相似,但数据传输能力更强。它通常包括指令阶段、地址阶段、数据阶段等。在指令阶段,Octo-SPI接口发送一个指令到外部存储器,指定要执行的操作类型。在地址阶段,发送地址信息,指示操作的目标位置。最后,在数据阶段,Octo-SPI接口可以从外部存储器接收或向其发送数据。

基本的配置和使用

在配置和使用Octo-SPI接口时,通常需要进行以下步骤:

1:初始化IO口:首先需要将Octo-SPI接口的硬件引脚和时钟初始化到合适的参数。这包括设置数据线的方向、配置时钟频率等。

2:配置工作模式:根据具体的应用需求,选择合适的Octo-SPI工作模式。这包括设置指令阶段、地址阶段和数据阶段的长度和格式等。

3:执行读写操作:在配置完成后,就可以通过Octo-SPI接口执行读写操作了。这通常涉及到发送指令、地址和数据等步骤,并根据返回的数据进行相应的处理。

综上所述,Octo-SPI是一种高速、高效的串行接口技术,它适用于需要处理大量数据的现代嵌入式系统。通过合理配置和使用Octo-SPI接口,可以大大提高系统的数据传输速率和存储性能。

2.png

三:软件编译

软件编写流程如下:

3.1 板载IO口初始化

3.2 USB初始化(用来虚拟串口与PC端通讯) 

3.3 LED初始化,用来指示程序工作状态

3.4 初始化定时器等状态

3.5开始任务调度

FSP库配置截图如下:

2.png

3.1 OSPI代码写测试写入和读写测试代码

void ospi_performance_test(uint32_t data_size,
                            uint32_t *ospi_performance_write_result,
                            uint32_t *ospi_performance_read_result)
{
    fsp_err_t err;
    uint32_t i =  1;

    if (R_CGC_Open (g_cgc.p_ctrl, g_cgc.p_cfg) != FSP_SUCCESS)
    {
        __asm("bkpt");
    }
    
    while (i)
    {

        err = R_OSPI_Open(g_ospi.p_ctrl, g_ospi.p_cfg);
        if (FSP_SUCCESS != err)
        {
            __asm("bkpt");
        }


#if HIGH_SPEED_MODE
        configure_dopi_ospi();
        ospi_test_wait_until_wip();
#endif

        *ospi_performance_write_result = write_dopi_ospi(data_size);
        ospi_test_wait_until_wip();

        *ospi_performance_read_result = read_dopi_ospi(data_size);
        ospi_test_wait_until_wip();

        erase_dopi_ospi();
        ospi_test_wait_until_wip();

#if HIGH_SPEED_MODE
        configure_spi_ospi();
        ospi_test_wait_until_wip();
#endif
        err = R_OSPI_Close(g_ospi.p_ctrl);
        if (FSP_SUCCESS != err)
        {
            __asm("bkpt");
        }

        i--;
    }
    
}

3.2 写入数据代码如下

static uint32_t write_dopi_ospi(uint32_t data_size)
{

    fsp_err_t err;
    uint32_t test_var;

    /* Cast to req type */
    uint8_t * p_dest = (uint8_t *)OSPI_DMA_ADDRESS;
    timer_status_t status = {};
    uint32_t number_of_pages;

    R_GPT_Open(g_memory_performance.p_ctrl, g_memory_performance.p_cfg);

    /* Cast, as compiler will assume result of calc to be int */
    number_of_pages = (uint32_t)(data_size * (1024 / OSPI_TEST_PAGE_SIZE));

    /* Write 32 blocks worth of data starting at Block 0
     * Block size = 64K, i.e. 2 blocks = 128K of data
     * check this comment....... */


    for (test_var = 0; test_var < number_of_pages; test_var++ )
    {
    /* Performance measured around this loop will be slightly lower due to branches and test write-in-progress
         * The actual throughput should be measured with direct debugger downloads (not supported by SEGGER yet)*/

        R_GPT_Start(g_memory_performance.p_ctrl);
        err = R_OSPI_Write(g_ospi.p_ctrl, s_page, p_dest, OSPI_TEST_PAGE_SIZE);
        if (FSP_SUCCESS != err)
        {
            __asm("bkpt");
        }
        ospi_test_wait_until_wip();
        p_dest += OSPI_TEST_PAGE_SIZE;
        R_GPT_Stop(g_memory_performance.p_ctrl);
        vTaskDelay(1U);
    }

    R_GPT_StatusGet(g_memory_performance.p_ctrl, &status);
    R_GPT_Reset(g_memory_performance.p_ctrl);
    R_GPT_Close(g_memory_performance.p_ctrl);

    return (status.counter);
}

测试图片如下所示:

代码运行图片如下所示:

3.png
使用串口工具对开发板输出信息进行监控,监控界面如下所示:
 
5.png
输入数字:4 对 SPI写入和读写数据的速度进行测试。
6.png
按下:64后,可以看到测试结果如下所示:
7.png
实物测试图如下所示:
1.jpg
1.jpg

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表