查看: 4977|回复: 15

[已解决] LPC54608 SPIFI读写问题

[复制链接]

该用户从未签到

61

主题

233

帖子

7

高级会员

Rank: 4

积分
750
最后登录
2021-1-25
发表于 2017-12-29 17:13:49 | 显示全部楼层 |阅读模式
在看SDK_2.2_LPC54608J512\boards\lpcxpresso54608\driver_examples\spifi\polling_transfer,关于SPIFI读写的例子。有个问题想咨询一下
根据板子上的丝印以及原理图,板子上的QSPI Flash应该是MT25QL128ABA。
根据其手册以及代码
#define READ (0)
#define PROGRAM_PAGE (1)

spifi_command_t command[COMMAND_NUM] = {
    {PAGE_SIZE, false, kSPIFI_DataInput, 1, kSPIFI_CommandDataQuad, kSPIFI_CommandOpcodeAddrThreeBytes, 0x6B},
    {PAGE_SIZE, false, kSPIFI_DataOutput, 0, kSPIFI_CommandOpcodeSerial, kSPIFI_CommandOpcodeAddrThreeBytes, 0x38},

代码里 0x6B是read  0x38是PROGRAM_PAGE
对应手册上QUAD OUTPUT FAST READ  和EXTENDED QUAD INPUT FAST PROGRAM
但是,我把指令换成一般的读和写,比如:03h  和02h或者其他指令,不使能quad mode后就不成功了。好像只能是这两个指令才可以

最佳答案

我下面的也修改了,然后还是可以读的: [attach]440859[/attach] 我把我修改后的spifi_polling_transfter.c给你测试下,如果还有问题,欢迎继续交流。 [attach]440860[/attach] ...
flash read.png
flash write.png
回复

使用道具 举报

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20117
最后登录
2024-5-3
发表于 2018-1-2 10:44:39 | 显示全部楼层
楼主你好!
你说的使能quad mode指的是这个函数吗:
   enable_quad_mode();
你看下这个函数里面的代码:
void enable_quad_mode()
{
    /* Write enable */
    SPIFI_SetCommand(EXAMPLE_SPIFI, &command[WRITE_ENABLE]);
    /* Set write register command */
    SPIFI_SetCommand(EXAMPLE_SPIFI, &command[WRITE_REGISTER]);
    SPIFI_WriteData(EXAMPLE_SPIFI, 0x40);
    check_if_finish();
}
里面有write enable.
从SPIFI flash手册中可以知道:
61.jpg
也就是在做读写擦都需要这个命令的。

所以,我这边试了这样的命令:
spifi_command_t command[COMMAND_NUM] = {
    {PAGE_SIZE, false, kSPIFI_DataInput, 1, kSPIFI_CommandDataQuad, kSPIFI_CommandOpcodeAddrThreeBytes, 0x6B},
    {PAGE_SIZE, false, kSPIFI_DataOutput, 0, kSPIFI_CommandOpcodeSerial, kSPIFI_CommandOpcodeAddrThreeBytes, 0x38},
    {4, false, kSPIFI_DataInput, 0, kSPIFI_CommandAllSerial, kSPIFI_CommandOpcodeOnly, 0x05},
    {0, false, kSPIFI_DataOutput, 0, kSPIFI_CommandAllSerial, kSPIFI_CommandOpcodeAddrThreeBytes, 0x20},
    {0, false, kSPIFI_DataOutput, 0, kSPIFI_CommandAllSerial, kSPIFI_CommandOpcodeOnly, 0x06},
    {4, false, kSPIFI_DataOutput, 0, kSPIFI_CommandAllSerial, kSPIFI_CommandOpcodeOnly, 0x01},
    {PAGE_SIZE, false, kSPIFI_DataInput, 1, kSPIFI_CommandAllSerial, kSPIFI_CommandOpcodeAddrThreeBytes, 0x03}};

    /* Enable Quad mode */
    enable_quad_mode();
    /* Setup memory command */
    //SPIFI_SetMemoryCommand(EXAMPLE_SPIFI, &command[READ]);
    SPIFI_SetMemoryCommand(EXAMPLE_SPIFI, &command[6]);
测试下来,还是能够读的:
62.jpg


回复 支持 反对

使用道具 举报

该用户从未签到

61

主题

233

帖子

7

高级会员

Rank: 4

积分
750
最后登录
2021-1-25
 楼主| 发表于 2018-1-2 11:21:52 | 显示全部楼层
小恩GG 发表于 2018-1-2 10:44
楼主你好!
你说的使能quad mode指的是这个函数吗:
   enable_quad_mode();

你好,感谢您的回答。但是,你修改的地方并没有真正在进行读操作,读操作是在写完成后进行的,你可以看下后面的代码,有个read的地方,并没有改过来,你可以直接在前面那个spifi_command_t command[COMMAND_NUM] 这结构体定义里将最后一项的0x6B直接改为0x03.
真正read是在这里:
   
    /* Reset to memory command mode */
    SPIFI_ResetCommand(EXAMPLE_SPIFI);

    SPIFI_SetMemoryCommand(EXAMPLE_SPIFI, &command[READ]);
               

       
    for (i = 0; i < SECTOR_SIZE; i++)
    {
        val = (uint8_t *)(FSL_FEATURE_SPIFI_START_ADDR + i);

                        if (*val != g_buffer[i % PAGE_SIZE])
        {
            PRINTF("Data error in address 0x%x, the value in memory is 0x%x\r\n", i, *val);
            err++;
        }
    }

我将结构体里定义的0x6B直接换成0x03,这样保证每个地方的read指令都是0x03了,测试未成功,而且除了你所的那个enable_quad_mode函数中有进行write enable ,该代码中,所有写,擦除之前都有write enable。所以不存在你说的,没有写使能的缘故。
这是擦除操作前的写使能:
  /* Write enable */
    SPIFI_SetCommand(EXAMPLE_SPIFI, &command[WRITE_ENABLE]);
    /* Set address */
    SPIFI_SetCommandAddress(EXAMPLE_SPIFI, FSL_FEATURE_SPIFI_START_ADDR);
    /* Erase sector */
    SPIFI_SetCommand(EXAMPLE_SPIFI, &command[ERASE_SECTOR]);
这是写之前的写使能
while (page < (SECTOR_SIZE / PAGE_SIZE))
    {
        SPIFI_SetCommand(EXAMPLE_SPIFI, &command[WRITE_ENABLE]);
        SPIFI_SetCommandAddress(EXAMPLE_SPIFI, FSL_FEATURE_SPIFI_START_ADDR + page * PAGE_SIZE);
        SPIFI_SetCommand(EXAMPLE_SPIFI, &command[PROGRAM_PAGE]);

回复 支持 反对

使用道具 举报

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20117
最后登录
2024-5-3
发表于 2018-1-3 11:12:33 | 显示全部楼层
paulkiyt 发表于 2018-1-2 11:21
你好,感谢您的回答。但是,你修改的地方并没有真正在进行读操作,读操作是在写完成后进行的,你可以看下 ...

我的代码已经屏蔽了之前的读了,添加了这个代码:
SPIFI_SetMemoryCommand(EXAMPLE_SPIFI, &command[6]);
读的确是在flash代码被写过。我是上一次写过之后,重新复位,这个时候flash里面已经有数据,直接读的。
我的测试是添加断点测试的。
其实整个例程一共有两次读,这样我把后面的read也改掉试试,待会给你更新。
回复 支持 反对

使用道具 举报

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20117
最后登录
2024-5-3
发表于 2018-1-3 11:16:29 | 显示全部楼层
我下面的也修改了,然后还是可以读的:
65.jpg
我把我修改后的spifi_polling_transfter.c给你测试下,如果还有问题,欢迎继续交流。
spifi_polling_transfer.rar (2.48 KB, 下载次数: 13)
回复 支持 反对

使用道具 举报

该用户从未签到

61

主题

233

帖子

7

高级会员

Rank: 4

积分
750
最后登录
2021-1-25
 楼主| 发表于 2018-1-3 11:33:51 | 显示全部楼层
小恩GG 发表于 2018-1-3 11:16
我下面的也修改了,然后还是可以读的:

我把我修改后的spifi_polling_transfter.c给你测试下,如果还有问 ...

你好,我将你的C文件全部复制粘贴过去,编译下载后,串口助手上显示错误。
spifi error.png
回复 支持 反对

使用道具 举报

该用户从未签到

61

主题

233

帖子

7

高级会员

Rank: 4

积分
750
最后登录
2021-1-25
 楼主| 发表于 2018-1-3 11:37:24 | 显示全部楼层
这是复制后代码截图
code1.png
code2.png
code3.png

点评

Good  发表于 2018-1-4 14:53
回复 支持 反对

使用道具 举报

该用户从未签到

61

主题

233

帖子

7

高级会员

Rank: 4

积分
750
最后登录
2021-1-25
 楼主| 发表于 2018-1-4 14:16:18 | 显示全部楼层
小恩GG 发表于 2018-1-3 11:16
我下面的也修改了,然后还是可以读的:

我把我修改后的spifi_polling_transfter.c给你测试下,如果还有问 ...

还有一个问题,代码中READ  (0x6B)和PROGRAM( 0x38)已经是QUAD read和write了,为什么还需要一个enable_quad_mode()函数将状态寄存器中的QE位置1呢 ? (写0x40就是将quad enable 位置1)
void enable_quad_mode()
{
    /* Write enable */
    SPIFI_SetCommand(EXAMPLE_SPIFI, &command[WRITE_ENABLE]);
    /* Set write register command */
    SPIFI_SetCommand(EXAMPLE_SPIFI, &command[WRITE_REGISTER]);
    SPIFI_WriteData(EXAMPLE_SPIFI, 0x40);
    check_if_finish();
}
进入quad模式,需要同时将QE位置1和指令为quad read 和write 还是说上述两者取一种即可。即:
1. 将QE置1,read和write不需要quad指令,一般read write。
2. 指令为quad read 和write,QE位不需要置1
3.将QE置1同时指令为quad read 和write
回复 支持 反对

使用道具 举报

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20117
最后登录
2024-5-3
发表于 2018-1-5 16:56:09 | 显示全部楼层
paulkiyt 发表于 2018-1-3 11:33
你好,我将你的C文件全部复制粘贴过去,编译下载后,串口助手上显示错误。 ...

楼主你好!
刚刚试了下,的确读出来的数据错位了一个,有可能MT25Q的READ(03)命令控制的还有问题。
但是MT25Q毕竟不是我们的芯片,所以我也不熟悉第三方芯片的所有指令。
如果楼主要添加其余指令的代码,建议你可以询问下这个芯片厂家的支持,看看03指令还需要哪些控制。
回复 支持 反对

使用道具 举报

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20117
最后登录
2024-5-3
发表于 2018-1-5 16:57:16 | 显示全部楼层
paulkiyt 发表于 2018-1-4 14:16
还有一个问题,代码中READ  (0x6B)和PROGRAM( 0x38)已经是QUAD read和write了,为什么还需要一个enab ...

建议你直接问下这个SPIFI芯片厂家的支持,看看有没有相关的应用笔记可以参考,具体命令需要哪些控制步骤。
我们这边目前只能给出SDK里面的代码供你参考。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-5-4 03:48 , Processed in 0.160106 second(s), 35 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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