OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7818|回复: 3

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

[复制链接]

2

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-2-21
在线时间
14 小时
发表于 2020-7-9 16:04:40 | 显示全部楼层 |阅读模式
50金钱
测试代码.png 原理图截图2.png 原理图截图1.png 读取ID结果.png
FlexSPI挂载了两片FLASH,kFLEXSPI_PortA1端口挂载了nor flash,kFLEXSPI_PortB1端口挂载了nand flash,参考了原子哥的FLEXSPI读写W25Q64的例程代码来读取kFLEXSPI_PortB1的NAND FLASH设备ID,结果返回的是的是W24Q64的设备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();

}

最佳答案

查看完整内容[请看2#楼]

问题已解决,是关于FLASH memory map的偏移问题方法1:在端口B1发送的时候加上端口A1的FLASH大小 方法2:在初始化的时候直接将A1端口的内存大小设置为0,后面发送的时候不需要加上偏移量了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2017-2-21
在线时间
14 小时
 楼主| 发表于 2020-7-9 16:04:41 | 显示全部楼层
本帖最后由 欲速不达 于 2020-8-5 10:28 编辑

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

使用B1端口发送的时候,在地址的成员变量加上端口A1的大小

使用B1端口发送的时候,在地址的成员变量加上端口A1的大小

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

或者初始化的时候直接将端口A1的大小设置为0

或者初始化的时候直接将端口A1的大小设置为0

关于端口的内存映射

关于端口的内存映射



回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2020-7-10 01:53:27 | 显示全部楼层
帮顶
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2020-8-6 01:30:55 | 显示全部楼层
欲速不达 发表于 2020-8-5 10:23
问题已解决,是关于FLASH memory map的偏移问题方法1:在端口B1发送的时候加上端口A1的FLASH大小
方法2:在 ...

谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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