打印
[技术问答]

QSPI读写的问题

[复制链接]
1097|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pq113_6|  楼主 | 2019-11-1 15:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ddllxxrr| | 2019-11-1 21:44 | 只看该作者
是不是设置 问题

使用特权

评论回复
板凳
pq113_6|  楼主 | 2019-11-4 08:12 | 只看该作者
ddllxxrr 发表于 2019-11-1 21:44
是不是设置 问题

目前读已经可以了,改了官方库,写还有问题。

使用特权

评论回复
地板
JasonLee27| | 2019-11-4 16:28 | 只看该作者
pq113_6 发表于 2019-11-4 08:12
目前读已经可以了,改了官方库,写还有问题。

有问题的地方可以标出来,我们会确认一下。

使用特权

评论回复
5
pq113_6|  楼主 | 2019-11-4 17:54 | 只看该作者
JasonLee27 发表于 2019-11-4 16:28
有问题的地方可以标出来,我们会确认一下。

SFLASH->REG_SF_DUAL = 0x04;
库设置的是0x06,我改成0x04读的数据就对了。

使用特权

评论回复
6
pq113_6|  楼主 | 2019-11-6 15:02 | 只看该作者
JasonLee27 发表于 2019-11-4 16:28
有问题的地方可以标出来,我们会确认一下。

请教一下,是不是没有测试过Winbond的SFLASH?库里面明显是只测试过MXIC的
    qspiConfig = SFLASH_GetQSPIReg();
    SFLASH_SetQSPIReg(0x06);
    SFLASH_SetCFG2Reg(0x11);//MXIC
    SFLASH_SetProgramData0Reg(0x38);//MXIC(25L1280)
MXIC的4IO写命令是0x38,而Winbond的是0x32,2个的命令方式也不一样,MXIC的24bit地址也是用的4IO的方式,而winbond的24bit地址是1IO的方式。

使用特权

评论回复
7
pq113_6|  楼主 | 2019-11-18 16:58 | 只看该作者
采用非缓存的方式碰到同样的问题,SPI写是对的,QSPI写还是出错。
SPI写的代码:
uint16_t i;
    for(i = 0; i < len; i++)
    {
        SFLASH->REG_SF_RADR2 = (uint8_t)((flashAddr + i) >> 16);
        SFLASH->REG_SF_RADR1 = (uint8_t)((flashAddr + i) >> 8);
        SFLASH->REG_SF_RADR0 = (uint8_t)((flashAddr + i) >> 0);
        SFLASH->REG_SF_WDATA = buf[i];
        SFLASH->REG_SF_CMD = (1 << 4); // bit4 : WR
        ac78xxSFlashWaitDone((uint32_t)(&(SFLASH->REG_SF_CMD)), (1 << 4), 0);
    }
QSPI写的代码:
uint8_t qspiConfig = SFLASH->REG_QSPI_CFG;
    uint16_t i;
    if(sflashManufactor == SFLASH_MXIC)
    {
        SFLASH->REG_QSPI_CFG = 0x06;
        SFLASH->REG_SF_PRGDATA0 = 0x38;  //MXIC is special
    }
    else
    {
        SFLASH->REG_QSPI_CFG = 0x04;
        SFLASH->REG_SF_PRGDATA0 = 0x32; //QSPI page program command
    }
    SFLASH->REG_SF_CFG2 = 0x10;  //use PRGDATA0 as write command
    while((SFLASH->REG_SF_CFG2 & 0x10) != 0x10);
    for(i = 0; i < len; i++)
    {
        SFLASH->REG_SF_RADR2 = (uint8_t)((flashAddr + i) >> 16);
        SFLASH->REG_SF_RADR1 = (uint8_t)((flashAddr + i) >> 8);
        SFLASH->REG_SF_RADR0 = (uint8_t)((flashAddr + i) >> 0);
        SFLASH->REG_SF_WDATA = buf[i];
        SFLASH->REG_SF_CMD = (1 << 4); // bit4 : WR
        ac78xxSFlashWaitDone((uint32_t)(&(SFLASH->REG_SF_CMD)), (1 << 4), 0);
    }
    SFLASH->REG_QSPI_CFG = qspiConfig;
    SFLASH->REG_SF_CFG2 = 0x00;
    while((SFLASH->REG_SF_CFG2 & 0x01) == 0x01);

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

284

帖子

2

粉丝