Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

W25Q64BV Write Enable Failed #34

Open
suibin0127 opened this issue Apr 2, 2020 · 12 comments
Open

W25Q64BV Write Enable Failed #34

suibin0127 opened this issue Apr 2, 2020 · 12 comments

Comments

@suibin0127
Copy link

你好,你的工具设计很不错,我尝试了下,修改def为winbod W25Q64BV,运行后发现在
“sfud_erase”中执行write enable报错,但我用其它驱动读写都没问题,说明板子是可以write enable的,看你的代码中有lock spi 然后unlock spi这个动作,不太明白为什么需要,也不清楚为什么Status Register的WEL位没有置1,请问可以帮我看看么,谢谢!

*SFUD](......\sfud\src\sfud.c:861) The flash device manufacturer ID is 0xEF, memory type ID is
0x40, capacity ID is 0x17.
SFUD Error: Check SFDP signature error. It's must be 50444653h('S' 'F' 'D' 'P').
[SFUD]Warning: Read SFDP parameter header information failed. The W25Q64BV is not support JEDEC SFDP.
[SFUD]Find a Winbond W25Q64BV flash chip. Size is 8388608 bytes.
SFUD Flash device reset success.
[SFUD]W25Q64BV flash device is initialize success.
[SFUD]Error: Can't enable write status.
Erase the W25Q64BV flash data failed.

@SXW101320
Copy link

您好这个我测试了,没有问题。可能代码移植有问题,建议用逻辑分析仪查一下波形

@llinjupt
Copy link

很可能是CS脚没有配置对!

@ousugo
Copy link

ousugo commented Aug 22, 2022

不需要在 CubeMX 中配置片选引脚,片选引脚会在后面使用 rt_hw_spi_device_attach 函数添加 SPI 设备时配置,如果在 CubeMX 中配置了可能反而会导致报错。

@ThinkCodeStudio
Copy link

我也遇到同样的问题,我的是W25Q16DV

#include "drv_spi.h"
#include <rtdevice.h>
#include "spi_flash_sfud.h"

#define SPI_NAME        "spi1"          //spi 接口名
#define CS_GPIO         GPIOB           //片选GPIO组 stn32
#define CS_PIN          GPIO_PIN_14     //片选GPIO脚 stm32

#define SPI_DEV_NAME    "spi10"        //挂在在spi总线上的设备名
#define FLASE_NAME      "W25Q16"        //flash设备名

#define FS_NAME         "elm"           //文件系统
#define ROOT_PATH       "/flash1"       //文件系统的根目录

int w25q_init(void){
    rt_hw_spi_device_attach(SPI_NAME, SPI_DEV_NAME, CS_GPIO, CS_PIN);
    rt_hw_us_delay(100);
    if(rt_sfud_flash_probe(FLASE_NAME, SPI_DEV_NAME)){
        rt_kprintf("sfud flash probe success\n");
        return RT_EOK;
    }
    else{
        rt_kprintf("sfud flash probe fail\n");
        return RT_ERROR;
    }
}

INIT_COMPONENT_EXPORT(w25q_init);

int dfs_mount_init(void){
    dfs_mkfs(FS_NAME, FLASE_NAME);
    if(dfs_mount(FLASE_NAME, ROOT_PATH, FS_NAME, 0, 0) == 0){
        rt_kprintf("dfs_mount success\n");
        return RT_EOK;
    }
    else{
        rt_kprintf("dfs_mount fail\n");
        return RT_ERROR;
    }
}

INIT_COMPONENT_EXPORT(dfs_mount_init);
 \ | /
- RT -     Thread Operating System
 / | \     4.1.0 build Sep 22 2022 10:51:26
 2006 - 2022 Copyright by RT-Thread team
[I/SFUD] Warning: Read SFDP parameter header information failed. The W25Q16 is not support JEDEC SFDP.
[I/SFUD] Find a Winbond W25Q16BV flash chip. Size is 2097152 bytes.
[I/SFUD] W25Q16 flash device is initialize success.
[I/SFUD] Probe SPI flash W25Q16 by SPI device spi10 success.
sfud flash probe success
[I/SFUD] Error: Can't enable write status.
format error, result=1
dfs_mount fail

BV 和 DV 差不多所以没改,也是0x40 0x15, CS确定没问题,因为用示例程序读ID成功了
在终端也试了格式化和挂载也失败了

msh />mkfs -t elm W25Q16
[I/SFUD] Error: Can't disable write status.
[I/SFUD] Error: Can't disable write status.
[I/SFUD] Error: Can't disable write status.
[I/SFUD] Error: Can't enable write status.
format error, result=1
mkfs failed, result=-5

@tjrong
Copy link

tjrong commented Sep 22, 2022 via email

@ThinkCodeStudio
Copy link

那我要把flash挂载文件系统,这个怎么重新初始化。我测试过确实有的时候好,有的时候不能用。用sf工具读没有问题,但写和擦除时好时坏。

@ThinkCodeStudio
Copy link

我测试过,好像写状态试能的问题

msh />sf bench yes
Erasing the sf_cmd 2097152 bytes data, waiting...
[I/SFUD] Error: Can't disable write status.
Erase benchmark success, total time: 0.032S.
Writing the sf_cmd 2097152 bytes data, waiting...
[I/SFUD] Error: Can't disable write status.
[I/SFUD] Error: Can't disable write status.
[I/SFUD] Error: Can't disable write status.
[I/SFUD] Error: Can't disable write status.
[I/SFUD] Error: Can't disable write status.
[I/SFUD] Error: Can't disable write status.
[I/SFUD] Error: Can't disable write status.
[I/SFUD] Error: Can't disable write status.
[I/SFUD] Error: Can't disable write status.
[I/SFUD] Error: Can't disable write status.
[I/SFUD] Error: Can't disable write status.
[I/SFUD] Error: Can't disable write status.
[I/SFUD] Error: Can't enable write status.
[I/SFUD] Error: Can't disable write status.
Writing sf_cmd failed, already wr for 3072 bytes, write 256 each time
Write benchmark has an error. Error code: 2.
Reading the sf_cmd 2097152 bytes data, waiting...
Data check ERROR! Please check you flash by other command.
Read sf_cmd failed, already rd for 0 bytes, read 256 each time
Read benchmark has an error. Error code: 3.
This flash operate has an error. Error code: 3.

打不开关不上,然后挂载文件系统是报的是格式不正确,应该 W25Q16DVSIG 是支持的吧

@ThinkCodeStudio
Copy link

我又尝试了战舰V3上的W25Q128JV 没有出现这个问题,使用正常,能成功挂载为文件系统。

@ThinkCodeStudio
Copy link

我给我F407的板子也换上了W25Q128JV,依然有问题

@FollowTheWay
Copy link

/**

  • set the flash write enable or write disable

  • @param flash flash device

  • @param enabled true: enable false: disable

  • @return result
    */
    static sfud_err set_write_enabled(const sfud_flash *flash, bool enabled) {
    sfud_err result = SFUD_SUCCESS;
    uint8_t cmd, register_status;

    SFUD_ASSERT(flash);

    if (enabled) {
    cmd = SFUD_CMD_WRITE_ENABLE;
    } else {
    cmd = SFUD_CMD_WRITE_DISABLE;
    }

    result = flash->spi.wr(&flash->spi, &cmd, 1, NULL, 0);

    if (result == SFUD_SUCCESS) {
    result = sfud_read_status(flash, &register_status);
    }

// if (result == SFUD_SUCCESS) {
// if (enabled && (register_status & SFUD_STATUS_REGISTER_WEL) == 0) {
// SFUD_INFO("Error: Can't enable write status.");
// return SFUD_ERR_WRITE;
// } else if (!enabled && (register_status & SFUD_STATUS_REGISTER_WEL) != 0) {
// SFUD_INFO("Error: Can't disable write status.");
// return SFUD_ERR_WRITE;
// }
// }
return result;
}

如果实在找不到办法,可以在sfud.c中屏蔽掉读写状态位判断就能正常读写了

@biqi2
Copy link

biqi2 commented Jan 23, 2024

借用https://blog.csdn.net/p1279030826/article/details/107334427,这个作者的方法做如下两点修改:
1、在sfud_port.c文件中第1处按实际修改CS管脚的配置,我的如下
image
2、在sfud_port.c文件中第2处按实际修改CS管脚的配置,我的如下
image

最终串口打印结果为:

[11:29:41.307]收←◆繱FUD](......\sfud\src\sfud.c:116) Start initialize Serial Flash Universal Driver(SFUD) V1.1.0.
SFUD You can get the latest version on https://github.com/armink/SFUD .
SFUD The flash device manufacturer ID is 0xEF, memory type ID is 0x40, capacity ID is 0x15.
SFUD Check SFDP header is OK. The reversion is V1.5, NPN is 0.
SFUD Check JEDEC basic flash parameter header is OK. The table id is 0, reversion is V1.5, length is 16, parameter table pointer is 0x000080.
SFUD JEDEC basic flash parameter table info:
SFUD MSB-LSB 3 2 1 0
SFUD [0001] 0xFF 0xF9 0x20 0xE5
SFUD [0002] 0x00 0xFF 0xFF 0xFF
SFUD [0003] 0x6B 0x08 0xEB 0x44
SFUD [0004] 0xBB 0x42 0x3B 0x08
SFUD [0005] 0xFF 0xFF 0xFF 0xFE
SFUD [0006] 0x00 0x00 0xFF 0xFF
SFUD [0007] 0xEB 0x40 0xFF 0xFF
SFUD [0008] 0x52 0x0F 0x20 0x0C
SFUD [0009] 0x00 0x00 0xD8 0x10
SFUD 4 KB Erase is supported throughout the device. Command is 0x20.
SFUD Write granularity is 64 bytes or larger.
SFUD Target flash status register is non-volatile.
SFUD 3-Byte only addressing.
SFUD Capacity is 2097152 Bytes.
SFUD Flash device supports 4KB block erase. Command is 0x20.
SFUD Flash device supports 32KB block erase. Command is 0x52.
SFUD Flash device supports 64KB block erase. Command is 0xD8.
[SFUD]Found a Winbond flash chip. Size is 2097152 bytes.
SFUD Flash device reset success.
[SFUD]W25Q16BV flash device initialized successfully.

[11:29:41.574]收←◆Erase the W25Q16BV flash data finish. Start from 0x00000000, size is 1024.
Write the W25Q16BV flash data finish. Start from 0x00000000, size is 1024.
Read the W25Q16BV flash data success. Start from 0x00000000, size is 1024. The data is:
Offset (h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
[00000000] 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
[00000010] 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
[00000020] 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
[00000030] 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
[00000040] 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
[00000050] 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
[00000060] 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
[00000070] 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
[00000080] 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
[00000
[11:29:41.699]收←◆090] 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
[000000A0] A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
[000000B0] B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
[000000C0] C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
[000000D0] D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
[000000E0] E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
[000000F0] F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
[00000100] 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
[00000110] 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
[00000120] 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
[00000130] 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
[00000140] 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
[00000150] 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
[00000160] 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
[00000170] 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
[00000180] 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
[00000190] 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
[000001A0] A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
[000001B0] B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
[000001C0] C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
[000001D0] D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
[000001E0] E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
[000001F0] F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
[00000200] 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
[00000210] 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
[00000220] 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
[00000230] 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
[00000240] 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
[00000250] 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
[00000260] 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
[00000270] 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
[00000280] 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
[00000290] 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
[000002A0] A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF
[000002B0] B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
[000002C0] C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
[000002D0] D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
[000002E0] E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
[000002F0] F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF
[00000300] 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
[00000310] 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
[00000320] 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
[00000330] 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
[00000340] 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
[00000350] 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
[00000360] 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
[00000370] 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
[00000380] 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F
[00000390] 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
[000003A0] A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE A
[11:29:42.030]收←◆F
[000003B0] B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF
[000003C0] C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF
[000003D0] D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF
[000003E0] E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF
[000003F0] F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF

The W25Q16BV flash test is success.

@ThinkCodeStudio
Copy link

使用其他的F407测试, 没有出现这个问题, 果然便宜没好货, 这个单片机可能是翻新的或是拆机的, 现在已经坏了写不进去程序了.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

8 participants