查看: 4761|回复: 0

[原创] 【野火i.MX RT1052】5.i.Maxrt1052之外部Norflash

[复制链接]
  • TA的每日心情
    擦汗
    2019-6-26 20:59
  • 签到天数: 235 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2018-6-6 21:28:00 | 显示全部楼层 |阅读模式
    分享到:
    i.MX RT1052 Mini核心板板载了32MB的NorFlash存储芯片,QSPI接口,走的flexspi总线。本帖子主要测试下通过qspi想 norflash芯片中写入256个数据,在读出来,验证qspi的读写操作,通过串口打印相关信息。
    先看下串口打印信息:


    QQ截图20180606224136.jpg

    原理图如下图所示:

    QQ截图20180606211840.jpg
    对应1052引脚
    QQ截图20180606212730.jpg

    QQ截图20180606215755.jpg
    其中:
    FlexSPI_SS0   --->  GPIO_SD_B1_06 --->  FLEXSPI_A_SS0_B
    FlexSPI_CLK   --->  GPIO_SD_B1_07 --->  FLEXSPI_A_SCLK
    FlexSPI_D0_A --->  GPIO_SD_B1_08 --->  FLEXSPI_A_DATA0
    FlexSPI_D1_A --->  GPIO_SD_B1_09 --->  FLEXSPI_A_DATA1
    FlexSPI_D2_A --->  GPIO_SD_B1_10 --->  FLEXSPI_A_DATA2
    FlexSPI_D3_A --->  GPIO_SD_B1_11 --->  FLEXSPI_A_DATA3


    FlexSPI是一个灵活的SPI(串行外围接口)主机控制器,它支持两个SPI通道和多达4个外部设备。每个通道支持单/双/四/八进制数据传输(1/2/4/8双向数据线)。


    时序图:


    QQ截图20180606220712.jpg


    FlexSPI控制器的iniitialization序列如下:

    •在系统级启用控制器时钟(AHB时钟/IP总线时钟/串行根时钟)。

    •将MCR0[MDIS]设置为0x1(确保控制器配置为模块停止模式)

    •配置模块控制寄存器:MCR0、MCR1、MCR2。(不改变MCR0(MDIS))

    •配置AHB总线控制寄存器(AHBCR)和AHB RX缓冲区控制寄存器(AHBRXBUFxCR)如果使用AHB命令,则可以选择。

    •配置Flash控制寄存器(FLSHxCR0、FLSHxCR1、FLSHxCR2)外部设备类型

    •根据样本时钟源配置DLL控制寄存器(DLLxCR)选择

    •将MCR0[MDIS]设为0x0(退出模块停止模式)

    •根据需要配置LUT(用于AHB命令或IP命令)

    •可选重置控制器(通过将MCR0[SWRESET]设置为0x1)外部设备在控制器之后通常需要通过IP命令进行配置初始化。例如,设备配置是通过写入状态完成的大多数串行或Flash的命令。


    1. void NorFlashInit(void)
    2. {
    3.     flexspi_config_t config;

    4.     const clock_usb_pll_config_t g_ccmConfigUsbPll = {.loopDivider = 0U};

    5.     CLOCK_InitUsb1Pll(&g_ccmConfigUsbPll);
    6.     CLOCK_InitUsb1Pfd(kCLOCK_Pfd0, 24);   /* Set PLL3 PFD0 clock 360MHZ. */
    7.     CLOCK_SetMux(kCLOCK_FlexspiMux, 0x3); /* Choose PLL3 PFD0 clock as flexspi source clock. */
    8.     CLOCK_SetDiv(kCLOCK_FlexspiDiv, 2);   /* flexspi clock 120M. */
    9.     SCB_DisableDCache();

    10.     PRINTF("\r\nNorFlash初始化\r\n");

    11.     /*获取 FLEXSPI 默认设置并配置 FLEXSPI */
    12.     FLEXSPI_GetDefaultConfig(&config);

    13.     /*设置通过 AHB 总线读取数据的 AHB 缓冲区大小. */
    14.     config.ahbConfig.enableAHBPrefetch = true;
    15.     FLEXSPI_Init(FLEXSPI, &config);

    16.     /* 根据串行闪存功能配置闪存设置. */
    17.     FLEXSPI_SetFlashConfig(FLEXSPI, &deviceconfig, kFLEXSPI_PortA1);

    18.     /* 更新查找表. */
    19.     FLEXSPI_UpdateLUT(FLEXSPI, 0, customLUT, CUSTOM_LUT_LENGTH);
    20. }
    复制代码



    1. void FLEXSPI_GetDefaultConfig(flexspi_config_t *config)
    2. {
    3.     config->rxSampleClock = kFLEXSPI_ReadSampleClkLoopbackInternally;
    4.     config->enableSckFreeRunning = false;
    5.     config->enableCombination = false;
    6.     config->enableDoze = true;
    7.     config->enableHalfSpeedAccess = false;
    8.     config->enableSckBDiffOpt = false;
    9.     config->enableSameConfigForAll = false;
    10.     config->seqTimeoutCycle = 0xFFFFU;
    11.     config->ipGrantTimeoutCycle = 0xFFU;
    12.     config->txWatermark = 8;
    13.     config->rxWatermark = 8;
    14.     config->ahbConfig.enableAHBWriteIpTxFifo = false;
    15.     config->ahbConfig.enableAHBWriteIpRxFifo = false;
    16.     config->ahbConfig.ahbGrantTimeoutCycle = 0xFFU;
    17.     config->ahbConfig.ahbBusTimeoutCycle = 0xFFFFU;
    18.     config->ahbConfig.resumeWaitCycle = 0x20U;
    19.     memset(config->ahbConfig.buffer, 0, sizeof(config->ahbConfig.buffer));
    20.     config->ahbConfig.enableClearAHBBufferOpt = false;
    21.     config->ahbConfig.enableAHBPrefetch = false;
    22.     config->ahbConfig.enableAHBBufferable = false;
    23.     config->ahbConfig.enableAHBCachable = false;
    24. }
    复制代码
    根据串行闪存功能配置闪存设置,设置qspi的时序和引脚绑定。
    FLEXSPI_SetFlashConfig(FLEXSPI, &deviceconfig, kFLEXSPI_PortA1);(疑问:这里为什么是kFLEXSPI_PortA1 没看明白?
    1. /*! @brief FLEXSPI operation port select.*/
    2. typedef enum _flexspi_port
    3. {
    4.     kFLEXSPI_PortA1 = 0x0U, /*!< Access flash on A1 port. */
    5.     kFLEXSPI_PortA2 = 0x1U, /*!< Access flash on A2 port. */
    6.     kFLEXSPI_PortB1 = 0x2U, /*!< Access flash on B1 port. */
    7.     kFLEXSPI_PortB2 = 0x3U, /*!< Access flash on B2 port. */
    8. } flexspi_port_t;
    复制代码

    时序
    1. flexspi_device_config_t deviceconfig = {
    2.     .flexspiRootClk = 100000000,
    3.     .flashSize = FLASH_SIZE,
    4.     .CSIntervalUnit = kFLEXSPI_CsIntervalUnit1SckCycle,
    5.     .CSInterval = 2,
    6.     .CSHoldTime = 3,
    7.     .CSSetupTime = 3,
    8.     .dataValidTime = 0,
    9.     .columnspace = 0,
    10.     .enableWordAddress = 0,
    11.     .AWRSeqIndex = 0,
    12.     .AWRSeqNumber = 0,
    13.     .ARDSeqIndex = NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD,
    14.     .ARDSeqNumber = 1,
    15.     .AHBWriteWaitUnit = kFLEXSPI_AhbWriteWaitUnit2AhbCycle,
    16.     .AHBWriteWaitInterval = 0,
    17. };
    复制代码

    在测试代码中先读取flash的id
    1.     /* 获取vendor ID. */
    2.     status = flexspi_nor_get_vendor_id(FLEXSPI, &vendorID);
    3.     if (status != kStatus_Success)
    4.     {
    5.         return status;
    6.     }
    7.     PRINTF("Vendor ID: 0x%x\r\n", vendorID);
    复制代码

    然后进入quad模式

    1.     /* 进入quad模式. */
    2.     status = flexspi_nor_enable_quad_mode(FLEXSPI);
    3.     if (status != kStatus_Success)
    4.     {
    5.         return status;
    6.     }
    复制代码

    然后先擦除扇区,flash擦除扇区就是写1操作,所以读出来的数据都是oxff

    1.     status = flexspi_nor_flash_erase_sector(FLEXSPI, EXAMPLE_SECTOR * SECTOR_SIZE);
    2.     if (status != kStatus_Success)
    3.     {
    4.         PRINTF("擦除flash扇区失败 !\r\n");
    5.         return -1;
    6.     }
    复制代码

    QQ截图20180606224812.jpg


    然后写入数据
    1.     status =
    2.         flexspi_nor_flash_page_program(FLEXSPI, EXAMPLE_SECTOR * SECTOR_SIZE, (void *)s_nor_program_buffer);
    3.     if (status != kStatus_Success)
    4.     {
    5.         PRINTF("页写入失败 !\r\n");
    6.         return -1;
    7.     }
    复制代码

    QQ截图20180606224824.jpg




    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-24 17:20 , Processed in 0.121666 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.