示例代码
QSPI
示例工程实现了对外接Flash的擦除和读写,工程路径:SDK_Folder\projects\peripheral\qspi\app_qspi。
示例工程流程图
初始化参数
static app_qspi_params_t g_qspi_params = {
.id = QSPI_ID,
.pin_cfg = {
.cs = {
.type = APP_FLASH_CS_IO_TYPE,
.mux = APP_FLASH_GPIO_MUX,
.pin = APP_FLASH_CS_PIN,
.mode = APP_IO_MODE_MUX,
.pull = APP_IO_PULLUP,
.enable = APP_QSPI_PIN_ENABLE,
},
.clk = {
.type = APP_FLASH_CLK_IO_TYPE,
.mux = APP_FLASH_GPIO_MUX,
.pin = APP_FLASH_CLK_PIN,
.mode = APP_IO_MODE_MUX,
.pull = APP_IO_PULLUP,
.enable = APP_QSPI_PIN_ENABLE,
},
.io_0 = {
.type = APP_FLASH_IO0_IO_TYPE,
.mux = APP_FLASH_GPIO_MUX,
.pin = APP_FLASH_IO0_PIN,
.mode = APP_IO_MODE_MUX,
.pull = APP_IO_PULLUP,
.enable = APP_QSPI_PIN_ENABLE,
},
.io_1 = {
.type = APP_FLASH_IO1_IO_TYPE,
.mux = APP_FLASH_GPIO_MUX,
.pin = APP_FLASH_IO1_PIN,
.mode = APP_IO_MODE_MUX,
.pull = APP_IO_PULLUP,
.enable = APP_QSPI_PIN_ENABLE,
},
.io_2 = {
.type = APP_FLASH_IO2_IO_TYPE,
.mux = APP_FLASH_GPIO_MUX,
.pin = APP_FLASH_IO2_PIN,
.mode = APP_IO_MODE_MUX,
.pull = APP_IO_PULLUP,
.enable = APP_QSPI_PIN_ENABLE,
},
.io_3 = {
.type = APP_FLASH_IO3_IO_TYPE,
.mux = APP_FLASH_GPIO_MUX,
.pin = APP_FLASH_IO3_PIN,
.mode = APP_IO_MODE_MUX,
.pull = APP_IO_PULLUP,
.enable = APP_QSPI_PIN_ENABLE,
},
},
.dma_cfg = {
.dma_instance = QSPI_USED_DMA,
.dma_channel = DMA_Channel0,
},
.init = {
.clock_mode = QSPI_TIMING_MODE,
.clock_prescaler = QSPI_CLOCK_PRESCALER,
.rx_sample_delay = QSPI_RX_SAMPLE_DELAY,
},
};
- id:QSPI使用的ID选择QSPI_ID,选择的具体ID请参见board_SK.h。
- pin_cfg:QSPI引脚配置,包含时钟引脚clk、片选引脚cs、数据引脚io0 ~ io3,配置引脚IO类型,PIN脚,复用模式和上下拉模式,是否使能,具体引脚参数定义请参见board_SK.h。
- dma_cfg:DMA参数配置
dma_cfg.dma_instance:选择使用的DMA实例
dma_cfg.dma_channel:选择使用的DMA实例通道0
- init:QSPI传输参数配置
init.clock_mode:时钟模式选择QSPI_CLOCK_MODE_0,时钟模式0
init.clock_prescaler:分频系数,外设时钟等于外设总线时钟除以分频系数
init.rx_sample_delay:时钟延时,以QSPI SLCK时钟周期为单位
重要函数
-
Flash初始化
SPI_FLASH_init()
-
读取设备ID
device_id = SPI_FLASH_Read_Device_ID()
-
不使能Quad,Quad模式请参考Flash手册
SPI_FLASH_Disable_Quad()
-
读取Flash数据
SPI_FLASH_Read(FLASH_PROGRAM_START_ADDR, read_buffer, FLASH_OPERATION_LENGTH)
-
擦除Flash数据
SPI_FLASH_Sector_Erase(FLASH_PROGRAM_START_ADDR)
-
写入数据到Flash
SPI_FLASH_Page_Program(FLASH_PROGRAM_START_ADDR, write_buffer)
-
使能Quad,Quad模式请参考Flash手册
SPI_FLASH_Enable_Quad()
-
Quad模式读取Flash数据
SPI_FLASH_Dual_Output_Fast_Read(FLASH_PROGRAM_START_ADDR, read_buffer, FLASH_OPERATION_LENGTH)
测试验证
Flash已集成到开发板,连接开发板到PC端,打开串口调试助手查看打印日志,读取Flash的数据和写入一致,则测试成功。
This is SPI_flash example.
Read_Device_ID = 0x0B6017
Erase Sector...
Erase Sector Success.
Page_Program...
Page Program Success.
SPI_Read.
0x00040000: 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
0x00040008: 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F
0x00040010: 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17
0x00040018: 0x18 0x19 0x1A 0x1B 0x1C 0x1D 0x1E 0x1F
0x00040020: 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27
0x00040028: 0x28 0x29 0x2A 0x2B 0x2C 0x2D 0x2E 0x2F
0x00040030: 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37
0x00040038: 0x38 0x39 0x3A 0x3B 0x3C 0x3D 0x3E 0x3F
0x00040040: 0x40 0x41 0x42 0x43 0x44 0x45 0x46 0x47
0x00040048: 0x48 0x49 0x4A 0x4B 0x4C 0x4D 0x4E 0x4F
0x00040050: 0x50 0x51 0x52 0x53 0x54 0x55 0x56 0x57
0x00040058: 0x58 0x59 0x5A 0x5B 0x5C 0x5D 0x5E 0x5F
0x00040060: 0x60 0x61 0x62 0x63 0x64 0x65 0x66 0x67
0x00040068: 0x68 0x69 0x6A 0x6B 0x6C 0x6D 0x6E 0x6F
0x00040070: 0x70 0x71 0x72 0x73 0x74 0x75 0x76 0x77
0x00040078: 0x78 0x79 0x7A 0x7B 0x7C 0x7D 0x7E 0x7F
0x00040080: 0x80 0x81 0x82 0x83 0x84 0x85 0x86 0x87
0x00040088: 0x88 0x89 0x8A 0x8B 0x8C 0x8D 0x8E 0x8F
0x00040090: 0x90 0x91 0x92 0x93 0x94 0x95 0x96 0x97
0x00040098: 0x98 0x99 0x9A 0x9B 0x9C 0x9D 0x9E 0x9F
0x000400a0: 0xA0 0xA1 0xA2 0xA3 0xA4 0xA5 0xA6 0xA7
0x000400a8: 0xA8 0xA9 0xAA 0xAB 0xAC 0xAD 0xAE 0xAF
0x000400b0: 0xB0 0xB1 0xB2 0xB3 0xB4 0xB5 0xB6 0xB7
0x000400b8: 0xB8 0xB9 0xBA 0xBB 0xBC 0xBD 0xBE 0xBF
0x000400c0: 0xC0 0xC1 0xC2 0xC3 0xC4 0xC5 0xC6 0xC7
0x000400c8: 0xC8 0xC9 0xCA 0xCB 0xCC 0xCD 0xCE 0xCF
0x000400d0: 0xD0 0xD1 0xD2 0xD3 0xD4 0xD5 0xD6 0xD7
0x000400d8: 0xD8 0xD9 0xDA 0xDB 0xDC 0xDD 0xDE 0xDF
0x000400e0: 0xE0 0xE1 0xE2 0xE3 0xE4 0xE5 0xE6 0xE7
0x000400e8: 0xE8 0xE9 0xEA 0xEB 0xEC 0xED 0xEE 0xEF
0x000400f0: 0xF0 0xF1 0xF2 0xF3 0xF4 0xF5 0xF6 0xF7
0x000400f8: 0xF8 0xF9 0xFA 0xFB 0xFC 0xFD 0xFE 0xFF
QSPI DMA read data...
Dual_Output_Fast_Read.
0x00040000: 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
0x00040008: 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F
0x00040010: 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17
0x00040018: 0x18 0x19 0x1A 0x1B 0x1C 0x1D 0x1E 0x1F
0x00040020: 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27
0x00040028: 0x28 0x29 0x2A 0x2B 0x2C 0x2D 0x2E 0x2F
0x00040030: 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37
0x00040038: 0x38 0x39 0x3A 0x3B 0x3C 0x3D 0x3E 0x3F
0x00040040: 0x40 0x41 0x42 0x43 0x44 0x45 0x46 0x47
0x00040048: 0x48 0x49 0x4A 0x4B 0x4C 0x4D 0x4E 0x4F
0x00040050: 0x50 0x51 0x52 0x53 0x54 0x55 0x56 0x57
0x00040058: 0x58 0x59 0x5A 0x5B 0x5C 0x5D 0x5E 0x5F
0x00040060: 0x60 0x61 0x62 0x63 0x64 0x65 0x66 0x67
0x00040068: 0x68 0x69 0x6A 0x6B 0x6C 0x6D 0x6E 0x6F
0x00040070: 0x70 0x71 0x72 0x73 0x74 0x75 0x76 0x77
0x00040078: 0x78 0x79 0x7A 0x7B 0x7C 0x7D 0x7E 0x7F
0x00040080: 0x80 0x81 0x82 0x83 0x84 0x85 0x86 0x87
0x00040088: 0x88 0x89 0x8A 0x8B 0x8C 0x8D 0x8E 0x8F
0x00040090: 0x90 0x91 0x92 0x93 0x94 0x95 0x96 0x97
0x00040098: 0x98 0x99 0x9A 0x9B 0x9C 0x9D 0x9E 0x9F
0x000400a0: 0xA0 0xA1 0xA2 0xA3 0xA4 0xA5 0xA6 0xA7
0x000400a8: 0xA8 0xA9 0xAA 0xAB 0xAC 0xAD 0xAE 0xAF
0x000400b0: 0xB0 0xB1 0xB2 0xB3 0xB4 0xB5 0xB6 0xB7
0x000400b8: 0xB8 0xB9 0xBA 0xBB 0xBC 0xBD 0xBE 0xBF
0x000400c0: 0xC0 0xC1 0xC2 0xC3 0xC4 0xC5 0xC6 0xC7
0x000400c8: 0xC8 0xC9 0xCA 0xCB 0xCC 0xCD 0xCE 0xCF
0x000400d0: 0xD0 0xD1 0xD2 0xD3 0xD4 0xD5 0xD6 0xD7
0x000400d8: 0xD8 0xD9 0xDA 0xDB 0xDC 0xDD 0xDE 0xDF
0x000400e0: 0xE0 0xE1 0xE2 0xE3 0xE4 0xE5 0xE6 0xE7
0x000400e8: 0xE8 0xE9 0xEA 0xEB 0xEC 0xED 0xEE 0xEF
0x000400f0: 0xF0 0xF1 0xF2 0xF3 0xF4 0xF5 0xF6 0xF7
0x000400f8: 0xF8 0xF9 0xFA 0xFB 0xFC 0xFD 0xFE 0xFF
This example demo end.