野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11353|回复: 1

关于1052 FlexSPI B1端口使用的灵异事件

[复制链接]
发表于 2020-7-9 16:14:07 | 显示全部楼层 |阅读模式
100火花
测试代码.png 原理图截图2.png 原理图截图1.png 读取ID结果.png
FlexSPI挂载了两片FLASH,kFLEXSPI_PortA1端口挂载了nor flash,kFLEXSPI_PortB1端口挂载了nand flash,参考了FLEXSPI读写W25Q256的例程代码来读取kFLEXSPI_PortB1的NAND FLASH设备ID,结果返回的是的是W24Q256的设备ID,用示波器测试发现访问kFLEXSPI_PortB1的时候片选信号没有任何电平变化(片选信号不生效,片选信号不生效,片选信号不生效),反而是kFLEXSPI_PortA1的片选有变化,简言而知,我要读取NAND FLASH的设备ID,结果却返回的是NOR FLASH的社设备ID,关于FlexSPI B1端口使用的灵异事件已经塞车了好几天,劳烦各位大神一起探讨一下,留下宝贵建议


uint32_t WB_NAND_Read_JEDEC_ID(void)
{
        uint32_t temp,vendorID;
        flexspi_transfer_t FlashTransfer;
       
        FlashTransfer.deviceAddress=0;                              //地址
    FlashTransfer.port=kFLEXSPI_PortB1;                         //端口
    FlashTransfer.cmdType=kFLEXSPI_Read;                        //操作类型:读数据
    FlashTransfer.SeqNumber=1;                                  //序号     
    FlashTransfer.seqIndex=NOR_CMD_LUT_SEQ_IDX_READ_JEDEC_ID;   //LUT表中命令索引
    FlashTransfer.data=&temp;                                   //读到的数据
    FlashTransfer.dataSize=3;                                   //读的数据长度
       
        /* 开始阻塞传输 */
    status_t status = FLEXSPI_TransferBlocking(FLEXSPI,&FlashTransfer);
       
        /* 调整高低字节,结果赋值到 vendorId */
        vendorID = ((temp&0xFF)<<16) | (temp&0xFF00) | ((temp&0xFF0000)>>16);

        PRINTF("status:%d temp=0x%x vendorID=0x%x\r\n",status,temp,vendorID);
       
        return vendorID;
}

//初始化FlexSPI Nand Flash
void FlexSPI_FlashInit(void)
{   
        //W25N01GVZEIG最高104MHz       
    //初始化FlexSPI时钟,W25Q128JV最高可以到133MHz
    CLOCK_InitUsb1Pfd(kCLOCK_Pfd0,24);      //设置PLL3的PFD0为480Mhz*18/24=360MHz
    CLOCK_SetMux(kCLOCK_FlexspiMux,0x3);    //FlexSPI时钟源选择PLL3 PFD0
    CLOCK_SetDiv(kCLOCK_FlexspiDiv,3);      //FlexSPI时钟设置为360/(3+1)=90Mhz


    //配置FlexSPI所使用的IO的复用功能
    IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_00_FLEXSPIB_DATA03,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_01_FLEXSPIB_DATA02,0);            
    IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_02_FLEXSPIB_DATA01,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_03_FLEXSPIB_DATA00,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_04_FLEXSPIB_SCLK,0);
    IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_05_FLEXSPIB_SS0_B,0);   

    //高转换速度,驱动能力为R0/6,速度为200Mhz,关闭开路功能,使能pull/keepr
        //选择keeper功能,下拉100K Ohm,关闭Hyst
    IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_00_FLEXSPIB_DATA03,0x10F1);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_01_FLEXSPIB_DATA02,0x10F1);      
    IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_02_FLEXSPIB_DATA01,0x10F1);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_03_FLEXSPIB_DATA00,0x10F1);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_04_FLEXSPIB_SCLK,0x10F1);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_05_FLEXSPIB_SS0_B,0x10F1);   


    SCB_DisableDCache();                                                                           
        /*Get FLEXSPI default settings and configure the flexspi. */
    FLEXSPI_GetDefaultConfig(&flexspi_norflash_config);         
       
        /*Set AHB buffer size for reading data through AHB bus. */
    flexspi_norflash_config.ahbConfig.enableAHBPrefetch=true;                  
    FLEXSPI_Init(FLEXSPI,&flexspi_norflash_config);      
       
        /* Configure flash settings according to serial flash feature. */
    FLEXSPI_SetFlashConfig(FLEXSPI,&NandFlash_config,kFLEXSPI_PortB1);  
       
         /* Update LUT table. */
    FLEXSPI_UpdateLUT(FLEXSPI, 0, FlexSPI_LUT, CUSTOM_LUT_LENGTH);   

        WB_NAND_Read_JEDEC_ID();

}

回复

使用道具 举报

 楼主| 发表于 2020-8-5 10:30:28 | 显示全部楼层
本帖最后由 我在路上110592 于 2020-8-5 10:31 编辑

问题已解决,是关于FLASH memory map的偏移问题 0.png
方法1:在端口B1发送的时候加上端口A1的FLASH大小
2.png

方法2:在初始化的时候直接将A1端口的内存大小设置为0,后面发送的时候不需要加上偏移量了
1.png


回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-24 10:03 , Processed in 0.031467 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表