APP QSPI驱动
宏定义
APP_QSPI_PIN_ENABLE
| 描述 | 值 |
|---|---|
| QSPI 引脚使能 |
1 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
APP_QSPI_PIN_DISABLE
| 描述 | 值 |
|---|---|
| 引脚不使能 |
0 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
QSPI_MAX_XFER_SIZE_ONCE
| 描述 | 值 |
|---|---|
| QSPI每次最大传输节拍数 | 0xFFFCu |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
DMA_MAX_XFER_SIZE_ONCE
| 描述 | 值 |
|---|---|
| DMA通道每个block最大传输字节数 |
4095u |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
APP_STORAGE_RAM_ID
| 描述 | 值 |
|---|---|
| 存放在RAM上资源的特殊ID | 0xf |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
QSPI_ASYNC_SCROLL_DRAW_SCREEN_SUPPORT
| 描述 | 值 |
|---|---|
| 支持/不支持在异步模式下用两个独立帧缓冲区绘制整个屏幕 | 0u:不支持 1u:支持 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi_user_config.h。
QSPI_ASYNC_VERI_LINK_DRAW_SCREEN_SUPPORT
| 描述 | 值 |
|---|---|
| 支持/不支持在异步模式下使用链表方式绘制整个屏幕 | 0u:不支持 1u:支持 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi_user_config.h。
QSPI_BLIT_RECT_IMAGE_SUPPORT
| 描述 | 值 |
|---|---|
| 支持/不支持以DMA LLP/SG方式Blit矩形区域 | 0u:不支持 1u:支持 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi_user_config.h。
QSPI_DMA_LLP_FEATUTE_SUPPORT
| 描述 | 值 |
|---|---|
| 是否启用DMA LLP特征 | 由QSPI_SYNC_SCROLL_DRAW_SCREEN_SUPPORT || QSPI_ASYNC_SCROLL_DRAW_SCREEN_SUPPORT || QSPI_ASYNC_VERI_LINK_DRAW_SCREEN_SUPPORT确定 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi_user_config.h。
DMA_LLP_BLOCKS_FOR_WRITE
| 描述 | 值 |
|---|---|
| app_qspi_async_draw_screen每次使用DMA LLP方式写的最大块数量,越大获得更高的速度但花费更多的RAM空间 | 取值范围16 ~ 64,且是4的倍数 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi_user_config.h。
DMA_LLP_BLOCKS_FOR_BLIT
| 描述 | 值 |
|---|---|
| app_qspi_mmap_blit_image每次使用DMA LLP方式传输的最大块数量,越大获得更高的速度但花费更多的RAM空间 | 取值范围16 ~ 64,且是4的倍数 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi_user_config.h。
结构体
app_qspi_params_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_qspi_id_t id |
设置使用的QSPI模块ID |
该参数的取值可以是下列值中的任意一个:
|
| app_qspi_pin_cfg_t pin_cfg |
引脚配置 |
参考app_qspi_pin_cfg_t结构体 |
| app_qspi_dma_cfg_t dma_cfg |
DMA参数设置 |
参考app_qspi_dma_cfg_t结构体 |
| qspi_init_t init |
初始化结构体 |
参考qspi_init_t结构体 |
| qspi_env_t qspi_env |
仅用于记录初始化设备的句柄、相关参数和信号量等,不需要配置 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
app_qspi_pin_cfg_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_qspi_pin_t cs |
片选引脚配置 |
参考app_qspi_pin_t结构体 |
| app_qspi_pin_t clk |
时钟引脚配置 |
参考app_qspi_pin_t结构体 |
| app_qspi_pin_t io_0 |
IO0引脚 |
参考app_qspi_pin_t结构体 |
| app_qspi_pin_t io_1 |
IO1引脚 |
参考app_qspi_pin_t结构体 |
| app_qspi_pin_t io_2 |
IO2引脚 |
参考app_qspi_pin_t结构体 |
| app_qspi_pin_t io_3 |
IO3引脚 |
参考app_qspi_pin_t结构体 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
app_qspi_pin_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_io_type_t type |
IO类型 |
同app_io_evt_t定义 |
| app_io_mux_t mux |
设置IO映射功能 |
查看app_io_init_t结构体定义,具体取值参考Datasheet中的Pin Mux |
| uint32_t pin |
选择IO引脚 |
查看app_io_init_t结构体定义,具体取值参考Datasheet中的Pin Mux |
| app_io_mode_t mode |
IO模式配置 |
APP_IO_MODE_MUX |
| app_io_pull_t pull |
设置IO上拉/下拉/浮空 |
同app_io_init_t结构体中的描述 |
| uint8_t enable |
使能/不使能引脚 |
|
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
app_qspi_dma_cfg_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| dma_regs_t * dma_instance |
DMA实例 |
参考app_dma_params_t章节中,DMA实例描述 |
| dma_channel_t dma_channel |
DMA通道 |
参考app_dma_params_t中通道描述 |
| uint32_t wait_timeout_ms |
轮询和死机等待的超时时间,仅适用于GR5526 |
|
| uint32_t extend |
扩展段,仅适用于GR5526 |
暂未使用 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
app_qspi_command_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| uint32_t instruction |
访问从设备指令 |
具体根据从设备访问时序确定 |
| uint32_t address |
访问从设备地址 |
具体根据从设备访问时序确定 |
| uint32_t instruction_size |
访问指令宽度 |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t address_size |
访问地址宽度 |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t dummy_cycles |
等待时钟周期数 |
0 ~ 31,具体根据从设备时序决定 |
| uint32_t data_size |
数据传输宽度 |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t instruction_address_mode |
指令地址发送采用的时序模式 |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t data_mode |
数据传输采用的时序模式 |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t length |
传输数据长度,单位字节,需为data_size的整数倍 |
最大65535字节 |
| uint32_t clock_stretch_en |
是否启用钟摆功能,只对Dual SPI和Quad SPI模式有效 |
|
qspi_init_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| uint32_t clock_prescaler |
基于总线时钟生成QSPI SCLK时钟的分频系数 |
支持2 ~ 65535之间的偶数 |
| uint32_t clock_mode |
时钟极性及相位模式 |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t rx_sample_delay |
RX输入端口的采样延时,以QSPI SCLK时钟周期为单位,防止频率过高,数据传输错误 |
0 ~ 0x7 |
详细信息请参考文件:SDK_Folder\drivers\inc\hal\gr55xx_hal_qspi.h。
app_qspi_mmap_device_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_qspi_device_e dev_type |
设备类型 |
该参数的取值可以是下列值中的任意一个:
|
| app_qspi_psram_mmap_wr_cmd_e psram_wr |
内存映射模式下,PSRAM的写命令 |
该参数的取值可以是下列值中的任意一个:
|
| union { app_qspi_flash_mmap_rd_cmd_e flash_rd; app_qspi_psram_mmap_rd_cmd_e psram_rd; } rd; |
|
Flash读命令支持:
PSRAM读命令支持:
|
| void * set |
保留位 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
app_qspi_screen_command_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| uint32_t instruction |
刷屏控制命令 |
0x00 ~ 0xff的8 bits数据 |
| uint32_t leading_address |
刷屏前导地址,如0x002C00 |
0x00000000 ~ 0xffffffff的32 bits地址数据 |
| uint32_t ongoing_address |
刷屏跟续地址,如0x003C00 |
0x00000000 ~ 0xffffffff的32 bits地址数据 |
| uint32_t instruction_size |
指定指令的size |
根据具体屏幕芯片手册决定,可选值参考QSPI_Instruction_Size |
| uint32_t address_size |
刷屏地址Size |
根据具体屏幕芯片手册决定,可选值参考QSPI_Address_Size |
| uint32_t dummy_cycles |
Dummy(Wait) cycles |
根据屏幕芯片手册决定,可选值0 ~ 31 |
| uint32_t data_size |
数据传输宽度 |
参考QSPI_Data_Size,支持8/16/32 bits宽度传输 |
| uint32_t instruction_address_mode |
指令地址发送的时序模式 |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t data_mode |
数据发送模式 |
该参数的取值可以是下列值中的任意一个:
|
| bool is_one_take_cs |
是否启用一次性片选发送完所有数据,需要屏幕支持;如果启用,本次所有数据会在一个CS周期内发送完成 |
|
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
app_qspi_evt_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_qspi_evt_type_t type |
QSPI事件类型 |
该参数的取值可以是下列值中的任意一个:
|
| union { uint32_t error_code; uint16_t size; }data; |
uint32_t error_code:发送事件返回的错误号 uint16_t size:QSPI已发送的数据长度 说明: 若事件类型为传输错误,此处返回错误码;若事件类型为发送完成,此处显示已发送的数据长度 |
QSPI错误码:
|
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
app_qspi_screen_info_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| unsigned int scrn_pixel_width |
水平像素,单位:pixel |
根据屏幕分辨率决定 |
| unsigned int scrn_pixel_height |
垂直像素,单位:pixel |
根据屏幕分辨率决定 |
| unsigned int scrn_pixel_depth |
像素深度,单位:Byte |
根据采用的像素色深决定 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
blit_image_config_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| uint32_t src_img_address |
源对象总线地址,需要4字节对齐 |
|
| uint32_t src_img_w |
源对象像素宽度 |
|
| uint32_t src_img_h |
源对象像素高度 |
|
| uint32_t src_img_x |
源对象拟截取x起始坐标 |
源对象的左上角为源对象坐标系原点(0,0) |
| uint32_t src_img_x_delta |
源对象拟截取的像素宽度 |
注意x加x_delta不能超过源对象宽度 |
| uint32_t src_img_y |
源对象拟截取y起始坐标 |
源对象的左上角为源对象坐标系原点(0,0) |
| uint32_t src_img_y_delta |
源对象拟截取的像素高度 |
注意y加y_delta不能超过源对象高度 |
| uint32_t dst_buff_address |
目标对象总线地址,需要4字节对齐 |
|
| uint32_t dst_buff_width |
目标对象像素宽度 |
|
| uint32_t dst_buff_height |
目标对象像素高度 |
|
| uint32_t dst_buff_x |
目标对象待写入x起始坐标 |
目标对象的左上角为源对象坐标系原点(0,0) |
| uint32_t dst_buff_y |
目标对象待写入y起始坐标 |
目标对象的左上角为源对象坐标系原点(0,0) |
| uint32_t pixel_depth |
像素深度,以Byte为单位 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
app_qspi_screen_scroll_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| uint32_t first_frame_start_address |
第一帧起始总线地址
|
第一帧缓存地址 |
| uint32_t second_frame_start_address |
第二帧起始总线地址
|
第二帧缓存地址 |
| uint32_t scroll_coordinate |
滚动点坐标
|
|
| bool is_horizontal_scroll |
是否水平滚动 |
|
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
app_qspi_screen_veri_link_scroll_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| uint32_tframe_ahb_start_address |
此节点帧的起始地址 |
存放节点的总线地址 |
| uint32_t frame_offset_lines |
此节点帧位于全帧的偏移行数 |
|
| uint32_t frame_draw_lines |
此节点帧的总行数 |
总行数根据LLP size决定,一般不超过50行 |
| struct _screen_veri_link_scroll_t * next |
指向下一个节点帧地址 |
最后一个设置为NULL |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
app_qspi_screen_block_t
| 成员 | 描述 | 取值 |
|---|---|---|
| uint32_t frame_ahb_start_address |
待刷新屏幕区域的图像块起始地址 |
|
|
uint32_t frame_offset_lines |
待刷新屏幕区域的图像块行偏移 |
|
| uint32_t frame_draw_lines | 待刷新屏幕区域的图像块行数量 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
枚举
app_qspi_id_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_QSPI_ID_0 |
QSPI模块0 |
| APP_QSPI_ID_1 |
QSPI模块1 |
| APP_QSPI_ID_2 |
QSPI模块2 |
| APP_QSPI_ID_MAX |
QSPI模块ID总数,用于参数检查 |
app_qspi_evt_type_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_QSPI_EVT_ERROR |
QSPI传输错误 |
| APP_QSPI_EVT_TX_CPLT |
QSPI发送完成 |
| APP_QSPI_EVT_RX_DATA |
QSPI接收完成 |
| APP_QSPI_EVT_ABORT |
QSPI中断发送 |
| APP_QSPI_EVT_ASYNC_WR_SCRN_CPLT |
QSPI异步传输Quad屏幕数据完成 |
| APP_QSPI_EVT_ASYNC_WR_SCRN_FAIL |
QSPI异步传输Quad屏幕数据失败 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
app_qspi_mmap_endian_mode_e
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_QSPI_MMAP_ENDIAN_MODE_0 = 0 |
QSPI内存映射字节存储次序模式0 |
| APP_QSPI_MMAP_ENDIAN_MODE_1 |
QSPI内存映射字节存储次序模式1 |
| APP_QSPI_MMAP_ENDIAN_MODE_2 |
QSPI内存映射字节存储次序模式2 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
该枚举仅适用于GR5526,每个模式对应的字节存储次序请参考GR5526 GPU开发者指南
app_qspi_device_e
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_QSPI_DEVICE_UNSET = 0 |
QSPI设备类型未设置 |
| APP_QSPI_DEVICE_FLASH = 1 |
Flash设备 |
| APP_QSPI_DEVICE_PSRAM = 2 |
PSRAM设备 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
app_qspi_psram_mmap_wr_cmd_e
枚举定义如下:
| 成员 | 描述 |
|---|---|
| PSRAM_MMAP_CMD_QWRITE_02H = 0x00 |
Quad模式写0x02H指令 |
| PSRAM_MMAP_CMD_QWRITE_38H = 0x01 |
Quad模式写0x38H指令 |
| PSRAM_MMAP_CMD_WRITE_MAX |
Quad模式写指令个数,仅用于参数检查 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
app_qspi_psram_mmap_rd_cmd_e
枚举定义如下:
| 成员 | 描述 |
|---|---|
| PSRAM_MMAP_CMD_QREAD_0BH = 0x00 |
Quad读0x0B指令 |
| PSRAM_MMAP_CMD_QREAD_EBH = 0x01 |
Quad读0xEB指令 |
| PSRAM_MMAP_CMD_READ_MAX |
Quad模式读指令个数,仅用于参数检查 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
app_qspi_flash_mmap_rd_cmd_e
枚举定义如下:
| 成员 | 描述 |
|---|---|
| FLASH_MMAP_CMD_DREAD_3BH = 0x00 |
Flash Dual读0x3B指令 |
| FLASH_MMAP_CMD_2READ_BBH = 0x01 |
Flash Dual读0xBB指令 |
| FLASH_MMAP_CMD_2READ_BBH_SIOO = 0x02 |
Flash Dual读0xBB指令,以SIO0模式 |
| FLASH_MMAP_CMD_QREAD_6BH = 0x03 |
Flash Quad读0x6B指令 |
| FLASH_MMAP_CMD_4READ_EBH = 0x04 |
Flash Quad读0xEB指令 |
| FLASH_MMAP_CMD_4READ_EBH_SIOO = 0x05 |
Flash Quad读0xEB指令,以SIO0模式 |
| FLASH_MMAP_CMD_READ_MAX |
Flash读命令总数,用于参数检查 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
qspi_pins_group_e
枚举定义如下:
| 成员 | 描述 |
|---|---|
| QSPI0_PIN_GROUP_0 = 0x00 |
指定使用QSPI0的Pin引脚组 |
| QSPI1_PIN_GROUP_0 = 0x01 |
指定使用QSPI1的Pin引脚组 |
| QSPI2_PIN_GROUP_0 = 0x02 |
指定使用QSPI2的Pin引脚组 |
| QSPIx_PIN_GROUP_MAX |
Pin引脚总数,用于参数检查 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
app_qspi_dma_state_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_QSPI_DMA_INVALID | QSPI DMA不可用 |
| APP_QSPI_DMA_ACTIVITY | QSPI DMA激活 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
app_qspi_state_t
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_QSPI_INVALID = 0 |
QSPI不可用 |
| APP_QSPI_ACTIVITY = 1 |
QSPI激活 |
| APP_QSPI_SLEEP = 2 |
QSPI睡眠 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
blit_xfer_type_e
枚举定义如下:
| 成员 | 描述 |
|---|---|
| BLIT_BY_DMA_SG = 0 |
使用Scatter&Gather方式 |
| BLIT_BY_DMA_LLP = 1 |
使用LLP方式 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_qspi.h。
接口函数
| API | 芯片 | ||||
|---|---|---|---|---|---|
| GR551x | GR5526 | GR5x25 | GR533x | GR5405 | |
| app_qspi_init |
Y |
Y |
Y | N | N |
| app_qspi_deinit |
Y |
Y |
Y | N | N |
| app_qspi_abort |
Y |
Y |
Y | N | N |
| app_qspi_config_memory_mappped |
N |
Y |
Y | N | N |
| app_qspi_active_memory_mappped |
N |
Y |
Y | N | N |
| app_qspi_command_receive_sync |
Y |
Y |
Y | N | N |
| app_qspi_command_receive_async |
Y |
Y |
Y | N | N |
| app_qspi_command_transmit_sync |
Y |
Y |
Y | N | N |
| app_qspi_command_transmit_async |
Y |
Y |
Y | N | N |
| app_qspi_command_sync |
Y |
Y |
Y | N | N |
| app_qspi_command_async |
Y |
Y |
Y | N | N |
| app_qspi_transmit_sync |
Y |
N |
N | N | N |
| app_qspi_transmit_async |
Y |
N |
N | N | N |
| app_qspi_receive_sync |
Y |
N |
N |
N | N |
| app_qspi_receive_async |
Y |
N |
N | N | N |
| app_qspi_transmit_sync_ex |
Y |
Y |
Y | N | N |
| app_qspi_transmit_async_ex |
Y |
Y |
Y | N | N |
| app_qspi_receive_sync_ex |
Y |
Y |
Y | N | N |
| app_qspi_receive_async_ex |
Y |
Y |
Y | N | N |
| app_qspi_mmap_set_endian_mode |
N |
Y |
Y | N | N |
| app_qspi_mmap_read_u8 |
N |
Y |
Y | N | N |
| app_qspi_mmap_read_u16 |
N |
Y |
Y | N | N |
| app_qspi_mmap_read_u32 |
N |
Y |
Y | N | N |
| app_qspi_mmap_read_block |
N |
Y |
Y | N | N |
| app_qspi_get_xip_base_address | N | Y | Y | N | N |
| app_qspi_transmit_in_qpi_async |
Y |
N |
N | N | N |
| app_qspi_get_handle |
Y |
Y |
Y | N | N |
app_qspi_init
| 函数原型 | uint16_t app_qspi_init(app_qspi_params_t *p_params, app_qspi_evt_handler_t evt_handler) |
|---|---|
| 功能说明 | 初始化QSPI |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 回调函数形式参照typedef void (*app_qspi_evt_handler_t)(app_qspi_evt_t *p_evt); HAL层已经实现中断标志位的清理,用户无需关心中断标志的清理,回调函数根据返回事件类型进行相应的处理即可 |
app_qspi_deinit
| 函数原型 | uint16_t app_qspi_deinit(app_qspi_id_t id) |
|---|---|
| 功能说明 | 反初始化QSPI |
| 输入参数 | id:QSPI模块ID(详见app_qspi_params_t中描述) |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_qspi_abort
| 函数原型 | uint16_t app_qspi_abort(app_qspi_id_t id) |
|---|---|
| 功能说明 | 中止QSPI传输 |
| 输入参数 | id:QSPI模块ID(详见app_qspi_params_t中描述) |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_qspi_config_memory_mappped
| 函数原型 | bool app_qspi_config_memory_mappped(app_qspi_id_t id, app_qspi_mmap_device_t dev); |
|---|---|
| 功能说明 | 主要用于块数据的发送 |
| 输入参数 |
|
| 返回值 | true/false |
| 备注 |
app_qspi_active_memory_mappped
| 函数原型 | bool app_qspi_active_memory_mappped(app_qspi_id_t id, bool is_active) |
|---|---|
| 功能说明 | 使能/不使能内存映射模式 |
| 输入参数 |
|
| 返回值 |
|
| 备注 |
app_qspi_command_receive_sync
| 函数原型 | uint16_t app_qspi_command_receive_sync(app_qspi_id_t id, app_qspi_command_t *p_cmd, uint8_t *p_data, uint32_t timeout) |
|---|---|
| 功能说明 | QSPI轮询方式(同步)读取数据,带控制命令封装 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_qspi_command_receive_async
| 函数原型 | uint16_t app_qspi_command_receive_async(app_qspi_id_t id, app_qspi_command_t *p_cmd, uint8_t *p_data) |
|---|---|
| 功能说明 | QSPI中断方式(异步)读取数据,带控制命令封装 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_qspi_command_transmit_sync
| 函数原型 | uint16_t app_qspi_command_transmit_sync(app_qspi_id_t id, app_qspi_command_t *p_cmd, uint8_t *p_data, uint32_t timeout) |
|---|---|
| 功能说明 | QSPI轮询方式(同步)发送数据,带控制命令封装 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_qspi_command_transmit_async
| 函数原型 | uint16_t app_qspi_command_transmit_async(app_qspi_id_t id, app_qspi_command_t *p_cmd, uint8_t *p_data) |
|---|---|
| 功能说明 | QSPI中断方式(异步)发送数据,带控制命令封装 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_qspi_command_sync
| 函数原型 | uint16_t app_qspi_command_sync(app_qspi_id_t id, app_qspi_command_t *p_cmd, uint32_t timeout) |
|---|---|
| 功能说明 | QSPI轮询方式(同步)发送命令 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_qspi_command_async
| 函数原型 | uint16_t app_qspi_command_async(app_qspi_id_t id, app_qspi_command_t *p_cmd) |
|---|---|
| 功能说明 | QSPI中断方式(异步)发送命令 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_qspi_transmit_sync
| 函数原型 | uint16_t app_qspi_transmit_sync(app_qspi_id_t id, uint8_t *p_data, uint32_t length, uint32_t timeout) |
|---|---|
| 功能说明 | QSPI轮询方式(同步)发送数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 该函数仅适用于GR551x |
app_qspi_transmit_async
| 函数原型 | uint16_t app_qspi_transmit_async(app_qspi_id_t id, uint8_t *p_data, uint32_t length) |
|---|---|
| 功能说明 | QSPI中断方式(异步)发送数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 该函数仅适用于GR551x |
app_qspi_receive_sync
| 函数原型 | uint16_t app_qspi_receive_sync(app_qspi_id_t id, uint8_t *p_data, uint32_t length, uint32_t timeout) |
|---|---|
| 功能说明 | QSPI轮询方式(同步)接收数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 该函数仅适用于GR551x |
app_qspi_receive_async
| 函数原型 | uint16_t app_qspi_receive_async(app_qspi_id_t id, uint8_t *p_data, uint32_t length) |
|---|---|
| 功能说明 | QSPI中断方式(异步)接收数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 该函数仅适用于GR551x |
app_qspi_transmit_sync_ex
| 函数原型 | uint16_t app_qspi_transmit_sync_ex(app_qspi_id_t id, uint32_t qspi_mode, uint32_t data_width, uint8_t *p_data, uint32_t length, uint32_t timeout) |
|---|---|
| 功能说明 | QSPI轮询方式(同步)发送数据,可设置时序模式和传输数据位宽 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | GR551x使用该函数时,qspi_mode和data_width无意义 |
app_qspi_transmit_async_ex
| 函数原型 | uint16_t app_qspi_transmit_async_ex(app_qspi_id_t id, uint32_t qspi_mode, uint32_t data_width, uint8_t *p_data, uint32_t length) |
|---|---|
| 功能说明 | QSPI中断方式(异步)发送数据,可设置时序模式和传输数据位宽 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 当GR551x使用该函数时,qspi_mode和data_width无意义 |
app_qspi_receive_sync_ex
| 函数原型 | uint16_t app_qspi_receive_sync_ex(app_qspi_id_t id, uint32_t qspi_mode, uint32_t data_width, uint8_t *p_data, uint32_t length , uint32_t timeout, uint32_t timeout) |
|---|---|
| 功能说明 | QSPI轮询方式(同步)接收数据,可设置时序模式和传输数据位宽 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 当GR551x使用该函数时,qspi_mode和data_width无意义 |
app_qspi_receive_async_ex
| 函数原型 | uint16_t app_qspi_receive_async_ex(app_qspi_id_t id, uint32_t qspi_mode, uint32_t data_width, uint8_t *p_data, uint32_t length) |
|---|---|
| 功能说明 | QSPI中断方式(异步)接收数据,可设置时序模式和传输数据位宽 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 当GR551x使用该函数时,qspi_mode和data_width无意义 |
app_qspi_mmap_set_endian_mode
| 函数原型 | bool app_qspi_mmap_set_endian_mode(app_qspi_id_t id, app_qspi_mmap_endian_mode_e mode) |
|---|---|
| 功能说明 | 设置内存映射模式下的端序模式 |
| 输入参数 |
|
| 返回值 |
|
| 备注 |
app_qspi_mmap_read_u8
| 函数原型 | uint8_t app_qspi_mmap_read_u8(app_qspi_id_t id, uint32_t address) |
|---|---|
| 功能说明 | 内存映射模式下,读取U8数据,用于Flash/PSRAM设备 |
| 输入参数 |
|
| 返回值 | 读取的数据 |
| 备注 |
app_qspi_mmap_read_u16
| 函数原型 | uint16_t app_qspi_mmap_read_u16(app_qspi_id_t id, uint32_t address) |
|---|---|
| 功能说明 | 内存映射模式下,读取U16数据,用于Flash/PSRAM设备 |
| 输入参数 |
|
| 返回值 | 读取的数据 |
| 备注 |
app_qspi_mmap_read_u32
| 函数原型 | uint32_t app_qspi_mmap_read_u32(app_qspi_id_t id, uint32_t address) |
|---|---|
| 功能说明 | 内存映射模式下,读取U32数据,用于Flash/PSRAM设备 |
| 输入参数 |
|
| 返回值 | 读取的数据 |
| 备注 |
app_qspi_mmap_read_block
| 函数原型 | bool app_qspi_mmap_read_block(app_qspi_id_t id, uint32_t address, uint8_t * buffer, uint32_t length) |
|---|---|
| 功能说明 | 内存映射模式下读取一个数据块 |
| 输入参数 |
|
| 返回值 |
|
| 备注 |
app_qspi_get_xip_base_address
| 函数原型 | uint32_t app_qspi_get_xip_base_address(app_qspi_id_t id) |
|---|---|
| 功能说明 | 获取QSPI内存映射在系统总线的基地址 |
| 输入参数 | id:QSPI模块ID |
| 返回值 | QSPI内存映射在系统总线的基地址 |
| 备注 |
app_qspi_transmit_in_qpi_async
| 函数原型 | uint16_t app_qspi_transmit_in_qpi_async(app_qspi_id_t id, uint32_t data_width, uint8_t *p_data, uint32_t length) |
|---|---|
| 功能说明 | QSPI在QPI模式下中断方式(异步)发送数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 仅适用于GR551x |
app_qspi_get_handle
| 函数原型 | qspi_handle_t *app_qspi_get_handle(app_qspi_id_t id) |
|---|---|
| 功能说明 | 获取QSPI句柄 |
| 输入参数 | id:QSPI模块ID |
| 返回值 | QSPI句柄:参考SDK_Folder\drivers\inc\gr55xx_hal_qspi.h |
| 备注 |
DMA接口函数
| API | 芯片 | ||||
|---|---|---|---|---|---|
| GR551x | GR5526 | GR5x25 | GR533x | GR5405 | |
| app_qspi_dma_init |
Y |
Y |
Y | N | N |
| app_qspi_dma_deinit |
Y |
Y |
Y | N | N |
| app_qspi_dma_command_receive_async |
Y |
Y |
Y | N | N |
| app_qspi_dma_command_transmit_async |
Y |
Y |
Y | N | N |
| app_qspi_dma_command_async |
Y |
Y |
Y | N | N |
| app_qspi_dma_transmit_async |
Y |
N |
N | N | N |
| app_qspi_dma_receive_async |
Y |
N |
N | N | N |
| app_qspi_dma_transmit_in_qpi_async |
Y |
N |
N | N | N |
| app_qspi_dma_transmit_async_ex |
Y |
Y |
Y | N | N |
| app_qspi_dma_receive_async_ex |
Y |
Y |
Y | N | N |
| app_qspi_dma_mmap_read_block |
N |
Y |
Y | N | N |
| app_qspi_async_draw_screen |
N |
Y |
Y | N | N |
| app_qspi_async_veri_draw_screen |
N |
Y |
Y | N | N |
| app_qspi_mmap_blit_image |
N |
Y |
Y | N | N |
| app_qspi_async_llp_draw_block | N | Y | Y | N | N |
app_qspi_dma_init
| 函数原型 | uint16_t app_qspi_dma_init(app_qspi_params_t *p_params) |
|---|---|
| 功能说明 | 初始化QSPI DMA模式 |
| 输入参数 | p_params:初始化参数的结构体指针 |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_qspi_dma_deinit
| 函数原型 | uint16_t app_qspi_dma_deinit(app_qspi_id_t id) |
|---|---|
| 功能说明 | 反初始化QSPI DMA模式 |
| 输入参数 | id:QSPI模块ID(详见app_qspi_params_t中描述) |
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_qspi_dma_command_receive_async
| 函数原型 | uint16_t app_qspi_dma_command_receive_async(app_qspi_id_t id, app_qspi_command_t *p_cmd, uint8_t *p_data) |
|---|---|
| 功能说明 | QSPI以DMA方式(异步)读取数据,带控制命令封装 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_qspi_dma_command_transmit_async
| 函数原型 | uint16_t app_qspi_dma_command_transmit_async(app_qspi_id_t id, app_qspi_command_t *p_cmd, uint8_t *p_data) |
|---|---|
| 功能说明 | QSPI以DMA方式(异步)发送数据,带控制命令封装 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_qspi_dma_command_async
| 函数原型 | uint16_t app_qspi_dma_command_async(app_qspi_id_t id, app_qspi_command_t *p_cmd) |
|---|---|
| 功能说明 | QSPI以DMA方式(异步)发送命令 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_qspi_dma_transmit_async
| 函数原型 | uint16_t app_qspi_dma_transmit_async(app_qspi_id_t id, uint8_t *p_data, uint32_t length) |
|---|---|
| 功能说明 | QSPI以DMA方式(异步)发送数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 仅适用于GR551x |
app_qspi_dma_receive_async
| 函数原型 | uint16_t app_qspi_dma_receive_async(app_qspi_id_t id, uint8_t *p_data, uint32_t length) |
|---|---|
| 功能说明 | QSPI以DMA方式(异步)接收数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 仅适用于GR551x |
app_qspi_dma_transmit_in_qpi_async
| 函数原型 | uint16_t app_qspi_dma_transmit_in_qpi_async(app_qspi_id_t id, uint32_t data_width, uint8_t *p_data, uint32_t length) |
|---|---|
| 功能说明 | QSPI在QPI模式下以DMA方式(异步)发送数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 仅适用于GR551x |
app_qspi_dma_receive_async_ex
| 函数原型 | uint16_t app_qspi_dma_receive_async_ex(app_qspi_id_t id, uint32_t qspi_mode, uint32_t data_width, uint8_t *p_data, uint32_t length) |
|---|---|
| 功能说明 | QSPI以DMA方式(异步)接收数据,可设置时序模式和数据位宽 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 当GR551x使用该函数时,qspi_mode和data_width无意义 |
app_qspi_dma_transmit_async_ex
| 函数原型 | uint16_t app_qspi_dma_transmit_async_ex(app_qspi_id_t id, uint32_t qspi_mode, uint32_t data_width, uint8_t *p_data, uint32_t length) |
|---|---|
| 功能说明 | QSPI以DMA方式(异步)发送数据,可设置时序模式和数据位宽 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 当GR551x使用该函数时,qspi_mode和data_width无意义 |
app_qspi_dma_mmap_read_block
| 函数原型 | bool app_qspi_dma_mmap_read_block(app_qspi_id_t id, uint32_t address, uint8_t * buffer, uint32_t length) |
|---|---|
| 功能说明 | 内存映射模式下DMA方式(异步)读取一个数据块,数据按Flash/PSRAM设备的顺序排序 |
| 输入参数 |
|
| 返回值 |
|
| 备注 | 驱屏接口单独抽离在SDK_Folder\drivers\inc\app_graphics_qspi.h中 |
app_qspi_async_draw_screen
| 函数原型 | bool app_qspi_async_draw_screen(app_qspi_id_t screen_id, app_qspi_id_t storage_id, const app_qspi_screen_command_t * const p_screen_cmd, const app_qspi_screen_info_t * const p_screen_info, app_qspi_screen_scroll_t * p_scroll_config, bool is_first_call) |
|---|---|
| 功能说明 | 异步刷屏专用接口 |
| 输入参数 |
|
| 返回值 |
|
| 备注 |
|
app_qspi_async_veri_draw_screen
| 函数原型 | bool app_qspi_async_veri_draw_screen(app_qspi_id_t screen_id, app_qspi_id_t storage_id, const app_qspi_screen_command_t * const p_screen_cmd, const app_qspi_screen_info_t * const p_screen_info, app_qspi_screen_veri_link_scroll_t * p_link_scroll, bool is_first_call) |
|---|---|
| 功能说明 | 异步链式刷屏专用接口(垂直链) |
| 输入参数 |
|
| 返回值 |
|
| 备注 |
|
app_qspi_mmap_blit_image
| 函数原型 | bool app_qspi_mmap_blit_image(app_qspi_id_t storage_id, blit_image_config_t * p_blit_config, blit_xfer_type_e xfer_type) |
|---|---|
| 功能说明 | 使用DMA进行二维数据搬运接口 |
| 输入参数 |
|
| 返回值 |
|
| 备注 |
|
app_qspi_async_llp_draw_block
| 函数原型 | bool app_qspi_async_llp_draw_block(app_qspi_id_t screen_id, app_qspi_id_t storage_id, const app_qspi_screen_command_t *const p_screen_cmd, const app_qspi_screen_info_t *const p_screen_info, app_qspi_screen_block_t *p_block_info, bool is_first_call) |
|---|---|
| 功能说明 | 使用DMA-LLP(DMA链式)方式刷新屏幕的块区域,链表的节点为待刷新图像数据块的每行数据 |
| 输入参数 |
|
| 返回值 |
|
| 备注 |
|
示例工程
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 SCLK时钟周期为单位
重要函数
-
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.