移植需要以下文件
需要修改的文件
sfud_cfg.hsfud_port.c1.使用调试模式
#define SFUD_DEBUG_MODE2.使用 SFDP
#define SFUD_USING_SFDP3.使用 FLASH 以支持芯片信息库
#define SFUD_USING_FLASH_INFO_TABLE一共使用以上三个宏开关
4.枚举结构,主要是为了兼容多芯片
enum { SFUD_W25Q256_DEVICE_INDEX = 0, };5.该结构在下面宏初始化结构中使用
#define SFUD_FLASH_DEVICE_TABLE \ { \ [SFUD_W25Q256_DEVICE_INDEX] = {.name = "W25Q256", .spi.name = "SPI5"}, \ }上述语句[SFUD_W25Q256_DEVICE_INDEX]用于初始化结构体数组[0]的成员内容,可以理解为省略了数组名
1.定义片选引脚结构体
typedef struct { SPI_HandleTypeDef *spix; GPIO_TypeDef *cs_gpiox; uint16_t cs_gpio_pin; } spi_user_data, *spi_user_data_t;2.添加三个必要函数
static void spi_lock(const sfud_spi *spi) { __disable_irq(); } static void spi_unlock(const sfud_spi *spi) { __enable_irq(); } /* about 100 microsecond delay */ static void retry_delay_100us(void) { uint32_t delay = 120; while(delay--); }尤其是延时函数!省略后会导致因等待错误引发的擦除失败。 延时函数可要可不要,问题出现在延时变量,次数太少导致等待出错。 3.完善spi读写函数
static sfud_err spi_write_read(const sfud_spi *spi, const uint8_t *write_buf, size_t write_size, uint8_t *read_buf, size_t read_size) { sfud_err result = SFUD_SUCCESS; result = SFUD_SUCCESS; spi_user_data_t spi_dev = (spi_user_data_t) spi->user_data; if (write_size) { SFUD_ASSERT(write_buf); } if (read_size) { SFUD_ASSERT(read_buf); } if(spi_dev->cs_gpiox != NULL) { spi_dev->cs_gpiox->BSRR = (uint32_t)spi_dev->cs_gpio_pin << 16U; } /* 开始读写数据 */ if(HAL_OK != HAL_SPI_Transmit(spi_dev->spix, (uint8_t*)write_buf, write_size, 1000)) { goto exit; } /* 接收数据 */ if(HAL_OK != HAL_SPI_Receive(spi_dev->spix, (uint8_t*)read_buf, read_size, 1000)) { goto exit; } exit: spi_dev->cs_gpiox->BSRR = spi_dev->cs_gpio_pin; return result; }4.初始化片选引脚,用于将片选信息加入sfud结构
extern SPI_HandleTypeDef hspi5; static spi_user_data spi5 = { .spix = &hspi5, .cs_gpiox = F_CS_GPIO_Port, .cs_gpio_pin = F_CS_Pin };5.初始化接口信息
sfud_err sfud_spi_port_init(sfud_flash *flash) { sfud_err result = SFUD_SUCCESS; switch (flash->index) { case SFUD_W25Q256_DEVICE_INDEX: { flash->spi.wr = spi_write_read; flash->spi.lock = spi_lock; flash->spi.unlock = spi_unlock; flash->spi.user_data = &spi5; flash->retry.times = 10*10000; break; } } return result; }其中case变量对应头文件中枚举设备变量; flash指向前面修改/添加的三/四个函数;(flash->retry.delay = retry_delay_100us;可要可不要 ) flash->spi.user_data指向片选引脚结构体spi_user_data spi5 ; 最重要:flash->retry.times 该次数是个坑,如果在测试sfud_demo时遇到擦除失败,记得增大该值!
1.关闭调试宏
[SFUD]Find a Winbond flash chip. Size is 33554432 bytes. [SFUD]W25Q256 flash device is initialize success.2.打开调试宏
[SFUD](..\sfud\src\sfud.c:116) Start initialize Serial Flash Universal Driver(SFUD) V1.1.0. [SFUD](..\sfud\src\sfud.c:117) You can get the latest version on https://github.com/armink/SFUD . [SFUD](..\sfud\src\sfud.c:861) The flash device manufacturer ID is 0xEF, memory type ID is 0x40, capacity ID is 0x19. [SFUD](..\sfud\src\sfud_sfdp.c:131) Check SFDP header is OK. The reversion is V1.0, NPN is 0. [SFUD](..\sfud\src\sfud_sfdp.c:173) Check JEDEC basic flash parameter header is OK. The table id is 0, reversion is V1.0, length is 9, parameter table pointer is 0x000080. [SFUD](..\sfud\src\sfud_sfdp.c:203) JEDEC basic flash parameter table info: [SFUD](..\sfud\src\sfud_sfdp.c:204) MSB-LSB 3 2 1 0 [SFUD](..\sfud\src\sfud_sfdp.c:206) [0001] 0xFF 0xF3 0x20 0xE5 [SFUD](..\sfud\src\sfud_sfdp.c:206) [0002] 0x0F 0xFF 0xFF 0xFF [SFUD](..\sfud\src\sfud_sfdp.c:206) [0003] 0x6B 0x08 0xEB 0x44 [SFUD](..\sfud\src\sfud_sfdp.c:206) [0004] 0xBB 0x42 0x3B 0x08 [SFUD](..\sfud\src\sfud_sfdp.c:206) [0005] 0xFF 0xFF 0xFF 0xFE [SFUD](..\sfud\src\sfud_sfdp.c:206) [0006] 0x00 0x00 0xFF 0xFF [SFUD](..\sfud\src\sfud_sfdp.c:206) [0007] 0xEB 0x21 0xFF 0xFF [SFUD](..\sfud\src\sfud_sfdp.c:206) [0008] 0x52 0x0F 0x20 0x0C [SFUD](..\sfud\src\sfud_sfdp.c:206) [0009] 0x00 0x00 0xD8 0x10 [SFUD](..\sfud\src\sfud_sfdp.c:215) 4 KB Erase is supported throughout the device. Command is 0x20. [SFUD](..\sfud\src\sfud_sfdp.c:234) Write granularity is 64 bytes or larger. [SFUD](..\sfud\src\sfud_sfdp.c:245) Target flash status register is non-volatile. [SFUD](..\sfud\src\sfud_sfdp.c:276) 3- or 4-Byte addressing. [SFUD](..\sfud\src\sfud_sfdp.c:305) Capacity is 33554432 Bytes. [SFUD](..\sfud\src\sfud_sfdp.c:311) Flash device supports 4KB block erase. Command is 0x20. [SFUD](..\sfud\src\sfud_sfdp.c:311) Flash device supports 32KB block erase. Command is 0x52. [SFUD](..\sfud\src\sfud_sfdp.c:311) Flash device supports 64KB block erase. Command is 0xD8. [SFUD]Find a Winbond flash chip. Size is 33554432 bytes. [SFUD](..\sfud\src\sfud.c:840) Flash device reset success. [SFUD](..\sfud\src\sfud.c:941) Enter 4-Byte addressing mode success. [SFUD]W25Q256 flash device is initialize success.3.打印 sfud_demo
Erase the W25Q256 flash data finish. Start from 0x00000000, size is 1024. Write the W25Q256 flash data finish. Start from 0x00000000, size is 1024. Read the W25Q256 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 [00000090] 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 AF [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 W25Q256 flash test is success.简单的接口对接,陆陆续续地调试了一天,萌发了一些移植的思路。
2020年10月6日: 完善移植读写判断如下:
static sfud_err spi_write_read(const sfud_spi *spi, const uint8_t *write_buf, size_t write_size, uint8_t *read_buf, size_t read_size) { sfud_err result = SFUD_SUCCESS; result = SFUD_SUCCESS; spi_user_data_t spi_dev = (spi_user_data_t) spi->user_data; if (write_size) { SFUD_ASSERT(write_buf); } if (read_size) { SFUD_ASSERT(read_buf); } if(spi_dev->cs_gpiox != NULL) { spi_dev->cs_gpiox->BSRR = (uint32_t)spi_dev->cs_gpio_pin << 16U; } if(write_size > 0) { /* 开始读写数据 */ if(HAL_OK != HAL_SPI_Transmit(spi_dev->spix, (uint8_t*)write_buf, write_size, 1000)) { result = SFUD_ERR_WRITE; goto exit; } } if(read_buf > 0) { /* 接收数据 */ if(HAL_OK != HAL_SPI_Receive(spi_dev->spix, (uint8_t*)read_buf, read_size, 1000)) { result = SFUD_ERR_READ; goto exit; } } exit: spi_dev->cs_gpiox->BSRR = spi_dev->cs_gpio_pin; return result; }添加了错误返回类型后出错,调试后发现时返回读错误结果,怀疑是应用中只用到写功能,导致误触发读判断错误,因此添加了读写判断,仅进入需要使用的功能中,避免错误误触发。
