W25Q64BV Write Enable Failed
你好,你的工具设计很不错,我尝试了下,修改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.
您好这个我测试了,没有问题。可能代码移植有问题,建议用逻辑分析仪查一下波形
很可能是CS脚没有配置对!
不需要在 CubeMX 中配置片选引脚,片选引脚会在后面使用 rt_hw_spi_device_attach 函数添加 SPI 设备时配置,如果在 CubeMX 中配置了可能反而会导致报错。
我也遇到同样的问题,我的是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
这个可能与spi的驱动有关系,我也遇到过类似的,但后来发现是多个SPI读写切换引起,切换后需要重新重新初始化SPI发自我的手机-------- 原始邮件 --------发件人: ThinkCode @.>日期: 2022年9月22日周四 11:15收件人: armink/SFUD @.>抄送: Subscribed @.***>主 题: Re: [armink/SFUD] W25Q64BV Write Enable Failed (#34)
我也遇到同样的问题,我的是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
—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you are subscribed to this thread.Message ID: @.***>
那我要把flash挂载文件系统,这个怎么重新初始化。我测试过确实有的时候好,有的时候不能用。用sf工具读没有问题,但写和擦除时好时坏。
我测试过,好像写状态试能的问题
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 是支持的吧
我又尝试了战舰V3上的W25Q128JV 没有出现这个问题,使用正常,能成功挂载为文件系统。
我给我F407的板子也换上了W25Q128JV,依然有问题
/**
-
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, ®ister_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中屏蔽掉读写状态位判断就能正常读写了
借用https://blog.csdn.net/p1279030826/article/details/107334427,这个作者的方法做如下两点修改:
1、在sfud_port.c文件中第1处按实际修改CS管脚的配置,我的如下
2、在sfud_port.c文件中第2处按实际修改CS管脚的配置,我的如下
最终串口打印结果为:
[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.
使用其他的F407测试, 没有出现这个问题, 果然便宜没好货, 这个单片机可能是翻新的或是拆机的, 现在已经坏了写不进去程序了.