当前页面为 开发中 版本,查看特定版本的文档,请在页面左下角的下拉菜单中进行选择。

Serial Flash Universal Driver

1 功能概述

本例程演示如何使用 SPI Flash 通用驱动库(SFUD)组件,对外部 SPI Flash 进行读写擦等操作的方法。

重要

出于安全考虑,请勿在中断服务程序(ISR)中调用 SFUD 相关接口。

2 环境准备

  • 硬件设备与线材:

    • PAN107X EVB 核心板底板各一块

    • JLink 仿真器(用于烧录例程程序)

    • USB-TypeC 线一条(用于底板供电和查看串口打印 Log)

    • 杜邦线数根或跳线帽数个(用于连接各个硬件设备)

  • 硬件接线:

    • 将 EVB 核心板插到底板上

    • 使用 USB-TypeC 线,将 PC USB 插口与 EVB 底板 USB->UART 插口相连

    • 使用杜邦线将 EVB 底板上的 TX 引脚接至核心板 P16,RX 引脚接至核心板 P17

    • 使用杜邦线将 JLink 仿真器的:

      • SWD_CLK 引脚与 EVB 底板的 P00 排针相连

      • SWD_DAT 引脚与 EVB 底板的 P01 排针相连

      • SWD_GND 引脚与 EVB 底板的 GND 排针相连

    • 使用跳线帽将 EVB 底板上的外部 SPI Flash 的通信口与芯片 IO 相连:

      • FLASH MISO <–> P05

      • FLASH CS <–> P03

      • FLASH SCK <–> P04

      • FLASH MOSI <–> P11

  • PC 软件:

    • 串口调试助手(UartAssist)或终端工具(SecureCRT),波特率 921600(用于接收串口打印 Log)

3 编译和烧录

例程位置:<PAN10XX-NDK>\01_SDK\nimble\samples\component\sfud\keil_107x

双击 Keil Project 文件打开工程进行编译烧录。

4 例程演示说明

  1. 烧录完成后,芯片会通过串口打印例程 Log:

    Try to load HW calibration data.. DONE.
    - Chip Info         : 0x61
    - Chip CP Version   : 255
    - Chip FT Version   : 7
    - Chip MAC Address  : E11000014DE5
    - Chip UID          : B90801465454455354
    - Chip Flash UID    : 4250315A3538380B01FD8B435603EF78
    - Chip Flash Size   : 512 KB (Inc. 4KB Panchip Info Area)
    
    - Current Flash Map :
      +-------------------------+ <- Addr: 0x00000
      |      App Partition      |
      |        (480 KB)         |
      +-------------------------+ <- Addr: 0x78000
      |    KVStore Partition    |
      |        ( 16 KB)         |
      +-------------------------+ <- Addr: 0x7C000
      |  User Custom Partition  |
      |        ( 12 KB)         |
      +-------------------------+ <- Addr: 0x7F000
      |    Panchip Info Area    |
      |     (4 KB, Hidden)      |
      +-------------------------+ <- End : 0x80000 (512 KB)
    
    [I] App started..
    
    [SFUD][INF] Found a Winbond W25Q128BV flash chip. Size is 16384 KBytes.
    [SFUD][INF] Flash0 flash device initialized successfully.
    [I] Erase the Flash0 flash data finish. Start from 0x00000000, size is 1024.
    [I] Write the Flash0 flash data finish. Start from 0x00000000, size is 1024.
    [I] Read the Flash0 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
    
    [I] DP cmd sent done, W25Q128JV flash would enter sleep mode.
    [SFUD][INF] Error: Flash wait busy has an error.
    [E] Read leading 4 bytes of the W25Q128JV flash data failed.
    [I] OK! The W25Q128JV flash has been successfully entered sleep mode, thus we cannot read data from it.
    
    [I] RDP cmd sent done, W25Q128JV flash would wake up from sleep mode.
    [I] Read leading 4 bytes of the W25Q128JV flash data: 0x00 0x01 0x02 0x03.
    [I] OK! The W25Q128JV flash has been successfully waked up from sleep mode, thus we can again read data from it.
    
    [I] Try to erase the W25Q128JV flash whole chip. Note that it may take very long time (30s+) for Winbond flash on EVB..
    [I] Erase the W25Q128JV flash whole chip finish.
    
  2. 由上述 Log 可知,本例程成功初始化外部 SPI Flash 后,做了如下操作:

    • 成功执行了对 Flash 的擦、写、读等操作,并将读出的数据打印出来,观察可知符合预期

    • 向 Flash 发送 DP 命令,使 Flash 进入睡眠模式,此时再读取 Flash 数据会失败(现象是等待 Flash 内部 busy 状态超时失败、或者 Flash 直接返回全0数据)

    • 向 Flash 发送 RDP 命令,将 Flash 从睡眠模式下唤醒,此时又可以成功读取到正确的 Flash 数据

    • 尝试擦除全部 Flash 成功,符合预期(需注意不同的 Flash 品牌和型号,擦除所需时间可能相差较大,具体需查阅 Flash Datasheet)

5 开发者说明

SFUD(Serial Flash Universal Driver)是一个开源的 SPI Flash 驱动框架,其具有较为完备功能、易用的接口和较好的可移植性,我们对其做了一些修改后,使其成为 PAN10xx NDK 的组件提供给开发者使用。

开发者可通过如下步骤使能 SFUD 组件:

  1. 将 SFUD 源码和头文件目录加入 Keil 工程:

    • sfud.c(位于 <PAN10xx-NDK>/nimble/component/SFUD/sfud/src/ 目录)

    • sfud_port.c(位于 <PAN10xx-NDK>/nimble/component/SFUD/port/ 目录)

    • 头文件目录<PAN10xx-NDK>/nimble/component/SFUD/inc/

  2. 在 Keil 工程中配置 SFUD 组件:

    • 打开工程配置 sdk_config.h 文件

    • 勾选 Component Config : SFUD Enable 以使能 SFUD 组件

    • 根据需要修改 SFUD 相关配置子项,包括 SPI 配置、SPI Flash 的型号和 JDID 等

当前例程的 SFUD 组件 config 配置如下:

image

SFUD component config

关于 SFUD config 配置的详细介绍请参考 NDK Configuration 配置指南 文档中的相关章节。

6 RAM/Flash资源使用情况

PAN107x:

Flash Size:  29.18k
RAM Size:  15.88 k