CN / EN
文档反馈
感谢关注汇顶文档,期待您的宝贵建议!
感谢您的反馈,祝您愉快!

APP SPI驱动

宏定义

APP_SPI_PIN_ENABLE

表 210 APP_SPI_PIN_ENABLE宏定义
描述

SPI引脚使能

1

详细信息请参考文件:SDK_Folder\drivers\inc\app_spi.h

APP_SPI_PIN_DISABLE

表 211 APP_SPI_PIN_DISABLE宏定义
描述

SPI引脚不使能

0

详细信息请参考文件:SDK_Folder\drivers\inc\app_spi.h

结构体

app_spi_params_t

结构体定义如下:

表 212 app_spi_params_t结构体成员
成员 描述 取值

app_spi_id_t id

设备类型

该参数的取值可以是下列值中的任意一个:
  • APP_SPI_ID_SLAVE(从设备)
  • APP_SPI_ID_MASTER(主设备)

app_spi_pin_cfg_t pin_cfg

引脚配置

参考app_spi_pin_cfg_t结构体

app_spi_dma_cfg_t dma_cfg

模式设置

参考app_spi_dma_cfg_t结构体

spi_init_t init

初始化结构体

参考spi_init_t结构体

bool is_soft_cs

是否通过软件控制CS

  • 1:通过软件控制
  • 0:不通过软件控制(GR551x该配置项不生效,固定使用软件CS)

spi_env_t spi_env

仅用于记录初始化设备的句柄、相关参数和信号量等,不需要配置

详细信息请参考文件:SDK_Folder\drivers\inc\app_spi.h

说明:
  • 作为SPI Slave设备时,CS引脚需根据时钟极性配置上/下拉模式:当时钟极性为CS低电平有效时,CS引脚需配置为上拉模式;当时钟极性为CS高电平有效时,CS引脚需配置为下拉模式。
  • 建议在初始化SPI Slave设备之前,确保SPI Master设备已完成初始化且处于稳定状态,以防止Master设备初始化时产生的I/O信号变化对Slave设备造成干扰。

app_spi_pin_cfg_t

结构体定义如下:

表 213 app_spi_pin_cfg_t结构体成员
成员 描述 取值

app_spi_pin_t cs

片选引脚配置

参考app_spi_pin_t结构体

app_spi_pin_t clk

时钟引脚配置

参考app_spi_pin_t结构体

app_spi_pin_t mosi

主输出从输入引脚配置

参考app_spi_pin_t结构体

app_spi_pin_t miso

主输入从输出引脚配置

参考app_spi_pin_t结构体

详细信息请参考文件:SDK_Folder\drivers\inc\app_spi.h

app_spi_pin_t

结构体定义如下:

表 214 app_spi_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中SPI资源进行选择

app_io_mode_t mode

IO模式配置

APP_IO_MODE_MUX

app_io_pull_t pull

设置IO上拉/下拉/浮空

参考app_io_init_t结构体中描述

uint8_t enable

使能/不使能引脚

  • true:使能
  • false:不使能

详细信息请参考文件:SDK_Folder\drivers\inc\app_spi.h

app_spi_dma_cfg_t

结构体定义如下:

表 215 app_spi_dma_cfg_t结构体成员
成员 描述 取值

dma_regs_t * tx_dma_instance

SPI TX指定DMA模块配置

参考app_dma_params_t中DMA支持的外设

dma_regs_t * rx_dma_instance

SPI RX指定DMA模块配置

参考app_dma_params_t中DMA支持的外设

dma_channel_t

tx_dma_channel

SPI TX的DMA通道选择

参考app_dma_params_t中通道描述

dma_channel_t

rx_dma_channel

SPI RX的DMA通道选择

参考app_dma_params_t中通道描述

uint32_t wait_timeout_ms

轮询和死机等待的超时时间,以ms为单位

详细信息请参考文件:SDK_Folder\drivers\inc\app_spi.h

spi_init_t

结构体定义如下:

表 216 spi_init_t结构体成员
成员 描述 取值

uint32_t data_size

SPI数据长度

该参数的取值可以是下列值中的任意一个:
  • SPI_DATASIZE_4BIT(4 bits) ~ SPI_DATASIZE_32BIT(32 bits)

uint32_t clock_polarity

串行时钟有效极性

该参数的取值可以是下列值中的任意一个:
  • SPI_POLARITY_LOW(CLK非活动状态时为低电平)
  • SPI_POLARITY_HIGH(CLK非活动状态时为高电平)

uint32_t clock_phase

位捕获的时钟活动边沿

该参数的取值可以是下列值中的任意一个:
  • SPI_PHASE_1EDGE(在第一个时钟变化沿捕获数据)
  • SPI_PHASE_2EDGE(在第二个时钟变化沿捕获数据)

uint32_t baudrate_prescaler

发送和接收SCK时钟波特率的预分频器值

取值范围:0 ~ 65534之间的偶数,如果是0,表示关闭clk。

分频值与波特率关系:clock rate = baudrate= peripheral CLK / baudrate_prescaler。

uint32_t ti_mode

TI mode使能/不使能

该参数的取值可以是下列值中的任意一个:
  • SPI_TIMODE_DISABLE(不使能)
  • SPI_TIMODE_ENABLE(使能)

uint32_t slave_select

选择的从设备

该参数的取值可以是下列值中的任意一个:
  • SPI_SLAVE_SELECT_0
  • SPI_SLAVE_SELECT_1
  • SPI_SLAVE_SELECT_ALL

uint32_t rx_sample_delay

RX输入端口的采样延时,以系统外设时钟周期为单位(仅适用于GR5526)

0 ~ 0x7

详细信息请参考文件:
  • GR551x/GR5526/GR5x25:SDK_Folder\drivers\inc\hal\gr55xx_hal_spi.h_
  • GR533x:SDK_Folder\drivers\inc\hal\gr533x_hal_spi.h
  • GR5405:SDK_Folder\hal_drv\include\hal_spi.h

app_spi_evt_t

结构体定义如下:

表 217 app_spi_evt_t结构体成员
成员 描述 取值

app_spi_evt_type_t type

串口事件类型

该参数的取值可以是下列值中的任意一个:
  • APP_SPI_EVT_ERROR(SPI传输错误)
  • APP_SPI_EVT_TX_CPLT(SPI发送完成)
  • APP_SPI_EVT_RX_CPLT(SPI接收完成)
  • APP_SPI_EVT_TX_RX_CPLT(双工模式下,收发都完成)
  • APP_SPI_ABORT(SPI Master传输被中断)

union

{

uint32_t error_code;

uint16_t size;

}data;

  • uint32_t error_code:SPI事件返回的错误号
  • uint16_t size:SPI已接收/发送的数据长度

说明:

若事件类型为传输错误,此处返回错误号; 若事件类型为接收/发送完成,此处显示已接收/发送的数据长度

SPI错误号及对应含义如下:
  • HAL_SPI_ERROR_NONE(无错误)
  • HAL_SPI_ERROR_TIMEOUT(超时)
  • HAL_SPI_ERROR_TRANSFER(传输错误)
  • HAL_SPI_ERROR_DMA(DMA传输错误)
  • HAL_SPI_ERROR_INVALID_PARAM(无效参数)

详细信息请参考文件:SDK_Folder\drivers\inc\app_spi.h

枚举

app_spi_id_t

枚举定义如下:

表 218 app_spi_id_t枚举成员
成员 描述

APP_SPI_ID_SLAVE = 0

SPI作为Slave

APP_SPI_ID_MASTER = 1

SPI作为Master

APP_SPI_ID_MAX = 2

SPI Role总个数,用于参数检测

详细信息请参考文件:SDK_Folder\drivers\inc\app_spi.h

app_spi_evt_type_t

枚举定义如下:

表 219 app_spi_evt_type_t枚举成员
成员 描述

APP_SPI_EVT_ERROR

SPI传输错误事件

APP_SPI_EVT_TX_CPLT

SPI发送完成事件

APP_SPI_EVT_RX_CPLT

SPI接收完成事件

APP_SPI_EVT_TX_RX_CPLT 双工模式下,SPI发送/接收完成

APP_SPI_ABORT

SPI Master传输中止事件

详细信息请参考文件:SDK_Folder\drivers\inc\app_spi.h

app_spi_dma_state_t

枚举定义如下:

表 220 app_spi_dma_state_t枚举成员
成员 描述
APP_SPI_DMA_INVALID = 0 SPI DMA不可用
APP_SPI_DMA_ACTIVITY = 1 SPI DMA激活

详细信息请参考文件:SDK_Folder\drivers\inc\app_spi.h

app_spi_state_t

枚举定义如下:

表 221 app_spi_state_t枚举成员
成员 描述

APP_SPI_INVALID = 0

SPI不可用

APP_SPI_ACTIVITY = 1

SPI激活

APP_SPI_SLEEP = 2

SPI睡眠

详细信息请参考文件:SDK_Folder\drivers\inc\app_spi.h

接口函数

表 222 SPI驱动接口函数
API 芯片
GR551x GR5526 GR5x25 GR533x GR5405

app_spi_init

Y

Y

Y

Y

Y

app_spi_deinit

Y

Y

Y

Y

Y

app_spi_receive_async

Y

Y

Y

Y

Y

app_spi_receive_sync

Y

Y

Y

Y

Y

app_spim_transmit_with_ia

N

Y

Y

Y

Y

app_spim_receive_with_ia

N

Y

Y

Y

Y

app_spi_transmit_sync

Y

Y

Y

Y

Y

app_spi_transmit_async

Y

Y

Y

Y

Y

app_spi_transmit_receive_sync

Y

Y

Y

Y

Y

app_spi_transmit_receive_async

Y

Y

Y

Y

Y

app_spi_read_eeprom_sync

Y

Y

Y

Y

Y

app_spi_read_eeprom_async

Y

Y

Y

Y

Y

app_spi_write_memory_async

Y

N

N

N

N

app_spi_read_memory_async

Y

N

N

N

N

app_spi_get_handle

Y

Y

Y

Y

Y

app_spi_transmit_high_speed_sync

Y

N

N

N

N

app_spi_receive_high_speed_sync

Y

N

N

N

N

app_spi_abort

Y

Y

Y

Y

Y

app_spi_init

表 223 app_spi_init接口
函数原型

uint16_t app_spi_init(app_spi_params_t *p_params, app_spi_evt_handler_t evt_handler)

功能说明

初始化SPI

输入参数
  • p_params:初始化参数的结构体指针
  • evt_handler:用户自己实现的中断回调函数
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

回调函数形式参照typedef void (*app_spi_evt_handler_t)(app_spi_evt_t *p_evt);

HAL层已经实现中断标志位的清理,用户不用关心中断标志的清理。

app_spi_deinit

表 224 app_spi_deinit接口
函数原型

uint16_t app_spi_deinit(app_spi_id_t id)

功能说明

反初始化SPI

输入参数

id:SPI主设备/从设备

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_receive_sync

表 225 app_spi_receive_sync接口
函数原型

uint16_t app_spi_receive_sync(app_spi_id_t id, uint8_t *p_data, uint16_t size, uint32_t timeout)

功能说明

SPI轮询方式(同步)接收数据

输入参数
  • id:SPI主设备/从设备
  • p_data:接收数据的buffer
  • size:需要接收的数据长度,以Byte为单位
  • timeout:接收超时时间,以ms为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_receive_async

表 226 app_spi_receive_async接口
函数原型

uint16_t app_spi_receive_async(app_spi_id_t id, uint8_t *p_data, uint16_t size)

功能说明

SPI中断方式(异步)接收数据

输入参数
  • id:SPI主设备/从设备
  • p_data:接收数据的buffer
  • size:需要接收的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spim_receive_with_ia

表 227 app_spim_receive_with_ia接口
函数原型

uint16_t app_spim_receive_with_ia(app_spi_id_t id, uint8_t instruction, uint32_t address, uint8_t dummy_bytes, uint8_t * p_data, uint16_t data_length)

功能说明

SPI主设备带指令和地址的轮询方式(同步)数据读取接口,主要用于对Flash/EEPROM/Display设备的读取操作

输入参数
  • id:SPI主设备
  • instruction:读取数据的指令
  • address:待读取数据的地址
  • dummy_bytes:设置SPI主设备从发送完数据读取地址到开始读取的间隔时间,具体的间隔时间由从设备的指标来确定。取值范围:0 ~ 4,单位:Byte
  • p_data:需要接收的数据buffer
  • data_length:需要读取的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注 超时时间默认1s,定义请见DEFAULT_POLLING_WAIT_TIMEOUT_MS

app_spim_transmit_with_ia

表 228 app_spim_transmit_with_ia接口
函数原型

uint16_t app_spim_transmit_with_ia(app_spi_id_t id, uint8_t instruction, uint32_t address, uint8_t * p_data, uint16_t data_length)

功能说明

SPI master携带指令和地址的轮询方式(同步)数据发送接口,主要用于对Flash/EEPROM/Display设备进行数据写入操作

输入参数
  • id:SPI主设备
  • instruction:数据写入操作指令
  • address:数据写入从设备的地址
  • p_data:待写入数据的buffer
  • data_length:需要发送/写入的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_transmit_sync

表 229 app_spi_transmit_sync接口
函数原型

uint16_t app_spi_transmit_sync(app_spi_id_t id, uint8_t *p_data, uint16_t size, uint32_t timeout)

功能说明

SPI轮询方式(同步)发送数据

输入参数
  • id:SPI主设备/从设备
  • p_data:需要发送的数据buffer指针
  • size:需要发送的数据长度,以Byte为单位
  • timeout:发送超时时间
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_transmit_async

表 230 app_spi_transmit_async接口
函数原型

uint16_t app_spi_transmit_async(app_spi_id_t id, uint8_t *p_data, uint16_t size)

功能说明

SPI中断方式(异步)发送数据

输入参数
  • id:SPI主设备/从设备
  • p_data:需要发送的数据buffer指针
  • size:需要发送的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_transmit_receive_sync

表 231 app_spi_transmit_receive_sync接口
函数原型

uint16_t app_spi_transmit_receive_sync(app_spi_id_t id, uint8_t *p_tx_data, uint8_t *p_rx_data, uint32_t size, uint32_t timeout)

功能说明

SPI以轮询方式(同步)进行全双工数据发送和接收

输入参数
  • id:SPI主设备/从设备
  • p_tx_data:发送数据的buffer
  • p_rx_data:接收数据的buffer
  • size:双工发送/接收的数据长度,以Byte为单位
  • timeout:超时时间,以ms为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_transmit_receive_async

表 232 app_spi_transmit_receive_async接口
函数原型

uint16_t app_spi_transmit_receive_async(app_spi_id_t id, uint8_t *p_tx_data, uint8_t *p_rx_data, uint32_t size)

功能说明

SPI以中断方式(异步)进行双工数据发送和接收

输入参数
  • id:SPI主设备/从设备
  • p_tx_data:发送数据的buffer
  • p_rx_data:接收数据的buffer
  • size:双工发送/接收的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_read_eeprom_sync

表 233 app_spi_read_eeprom_sync接口
函数原型

uint16_t app_spi_read_eeprom_sync(app_spi_id_t id, uint8_t *p_tx_data, uint8_t *p_rx_data, uint32_t tx_size, uint32_t rx_size, uint32_t timeout)

功能说明

SPI轮询方式(同步)读取EEPROM特定内存地址数据,在读取之前按照EEPROM的协议格式把要读取的起始地址通过tx_data发送出去

输入参数
  • id:SPI主设备
  • p_tx_data:发送数据的buffer
  • p_rx_data:接收数据的buffer
  • tx_size:需要发送的数据长度,以Byte为单位
  • rx_size:需要接收的数据长度,以Byte为单位
  • timeout:读取超时时间
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_read_eeprom_async

表 234 app_spi_read_eeprom_async接口
函数原型

uint16_t app_spi_read_eeprom_async(app_spi_id_t id, uint8_t *p_tx_data, uint8_t *p_rx_data, uint32_t tx_size, uint32_t rx_size)

功能说明

SPI中断方式(异步)读取EEPROM特定内存地址数据,在读取之前按照EEPROM的协议格式把要读取的起始地址通过tx_data发送出去

输入参数
  • id:SPI 主设备
  • p_tx_data:发送数据的buffer
  • p_rx_data:接收数据的buffer
  • tx_size:需要发送的数据长度,以Byte为单位
  • rx_size:需要接收的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_write_memory_async

表 235 app_spi_write_memory_async接口
函数原型

uint16_t app_spi_write_memory_async(app_spi_id_t id, uint8_t *p_cmd_data, uint8_t *p_tx_data, uint32_t cmd_size, uint32_t tx_size)

功能说明

SPI中断方式(异步)写入数据到Memory,在写入之前先发送命令,主要用于读写存储设备,比如Flash等

输入参数
  • id:SPI主设备
  • p_cmd_data:命令数据的buffer
  • p_tx_data:待写入数据的buffer
  • cmd_size:命令的长度,以Byte为单位
  • size:需要写入的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_read_memory_async

表 236 app_spi_read_memory_async接口
函数原型

uint16_t app_spi_read_memory_async(app_spi_id_t id, uint8_t *p_cmd_data, uint8_t *p_rx_data, uint32_t cmd_size, uint32_t rx_size)

功能说明

SPI中断方式(异步)读取Memory数据,在读取之前先发送命令,主要用于读写存储设备,比如Flash等

输入参数
  • id:SPI主设备
  • p_cmd_data:命令数据的buffer指针
  • p_rx_data:读取数据的buffer指针
  • cmd_size:命令的长度,以Byte为单位
  • size:需要读取的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_get_handle

表 237 app_spi_get_handle接口
函数原型

spi_handle_t *app_spi_get_handle(app_spi_id_t id)

功能说明

获取SPI句柄

输入参数

id:SPI模块ID(见app_spi_id_t枚举)

返回值

SPI句柄指针

备注

app_spi_transmit_high_speed_sync

表 238 app_spi_transmit_high_speed_sync接口
函数原型

uint16_t app_spi_transmit_high_speed_sync(app_spi_id_t id, uint8_t *p_data, uint16_t size)

功能说明

SPI中断方式(同步)高速发送数据,此函数关闭全局中断,避免高优先级中断的干扰

输入参数
  • id:SPI 主设备/从设备
  • p_data:需要发送数据的buffer
  • size:需要发送的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_receive_high_speed_sync

表 239 app_spi_receive_high_speed_sync接口
函数原型

uint16_t app_spi_receive_high_speed_sync(app_spi_id_t id, uint8_t *p_data, uint16_t size)

功能说明

SPI中断方式(同步)高速接收数据,此函数关闭全局中断,避免高优先级中断的干扰

输入参数
  • id:SPI 主设备/从设备
  • p_data:接收数据的buffer
  • size:需要接收的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_abort

表 240 app_spi_abort接口
函数原型

uint16_t app_spi_abort(app_spi_id_t id)

功能说明

SPI中止传输(发送/接收)

输入参数

id:SPI主设备/从设备

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注 需要等到APP_SPI_EVT_ABORT事件,才表示中止传输完成

DMA接口函数

表 241 DMA接口函数
API 芯片
GR551x GR5526 GR5x25 GR533x GR5405

app_spi_dma_init

Y

Y

Y

Y

Y

app_spi_dma_deinit

Y

Y

Y

Y

Y

app_spim_dma_transmit_with_ia

N

Y

Y

Y

Y

app_spim_dma_receive_with_ia

N

Y

Y

Y

Y

app_spi_dma_receive_async

Y

Y

Y

Y

Y

app_spi_dma_transmit_async

Y

Y

Y

Y

Y

app_spi_dma_transmit_receive_async

Y

Y

Y

Y

Y

app_spi_dma_read_eeprom_async

Y

Y

Y

Y

Y

app_spi_dma_write_memory_async

Y

N

N N N

app_spi_dma_read_memory_async

Y

N

N N N

app_spi_dma_receive_high_speed_sync

Y

N

N N N

app_spi_dma_transmit_high_speed_sync

Y

N

N N N

app_spi_dma_init

表 242 app_spi_dma_init接口
函数原型

uint16_t app_spi_dma_init(app_spi_params_t *p_params)

功能说明

初始化SPI DMA模式

输入参数

p_params:初始化参数的结构体指针

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_dma_deinit

表 243 app_spi_dma_deinit接口
函数原型

uint16_t app_spi_dma_deinit(app_spi_id_t id)

功能说明

反初始化SPI DMA模式

输入参数

id:SPI主设备/从设备

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spim_dma_receive_with_ia

表 244 app_spim_dma_receive_with_ia接口
函数原型

uint16_t app_spim_dma_receive_with_ia(app_spi_id_t id, uint8_t instruction, uint32_t address, uint8_t dummy_bytes, uint8_t * p_data, uint16_t data_length)

功能说明

SPI主设备带指令和地址的数据读取接口,主要用于对Flash/EEPROM/Display设备的读取操作(DMA模式)

输入参数
  • id:SPI主设备
  • instruction:读取数据的指令
  • address:待读取数据的地址
  • dummy_bytes:设置SPI主设备从发送完数据读取地址到开始读取的间隔时间,给从设备进行数据就绪的时间。取值范围:0 ~ 4,单位:Byte
  • p_data:需要读取的数据buffer
  • data_length:需要读取的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spim_dma_transmit_with_ia

表 245 app_spim_dma_transmit_with_ia接口
函数原型

uint16_t app_spim_dma_transmit_with_ia(app_spi_id_t id, uint8_t instruction, uint32_t address, uint8_t * p_data, uint16_t data_length)

功能说明

SPI主设备带指令和地址的数据写入接口,主要用于对Flash/EEPROM/Display设备进行数据写入操作(DMA模式)

输入参数
  • id:SPI主设备
  • instruction:数据写入操作指令
  • address:数据写入从设备的地址
  • p_data:待写入数据的buffer
  • data_length:需要发送/写入的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_dma_receive_async

表 246 app_spi_dma_receive_async接口
函数原型

uint16_t app_spi_dma_receive_async(app_spi_id_t id, uint8_t *p_data, uint16_t size)

功能说明

SPI异步DMA方式接收数据

输入参数
  • id:SPI主设备/从设备
  • p_data:接收数据的buffer
  • size:需要接收的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_dma_transmit_async

表 247 app_spi_dma_transmit_async接口
函数原型

uint16_t app_spi_dma_transmit_async(app_spi_id_t id, uint8_t *p_data, uint16_t size)

功能说明

SPI异步DMA方式发送数据

输入参数
  • id:SPI 主设备/从设备
  • p_data:需要发送数据的buffer
  • size:需要发送的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_dma_transmit_receive_async

表 248 app_spi_dma_transmit_receive_async接口
函数原型

uint16_t app_spi_dma_transmit_receive_async(app_spi_id_t id, uint8_t *p_tx_data, uint8_t *p_rx_data, uint32_t size)

功能说明

SPI全双工异步收发数据(DMA方式)

输入参数
  • id:SPI主设备/从设备
  • p_tx_data:发送数据的buffer
  • p_rx_data:接收数据的buffer
  • size:双工发送/接收的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_dma_read_eeprom_async

表 249 app_spi_dma_read_eeprom_async接口
函数原型

uint16_t app_spi_dma_read_eeprom_async(app_spi_id_t id, uint8_t *p_tx_data, uint8_t *p_rx_data, uint32_t tx_size, uint32_t rx_size)

功能说明

SPI以DMA方式(异步)读取EEPROM特定内存地址数据,在读取之前按照EEPROM的协议格式把要读取的起始地址通过tx_data发送出去

输入参数
  • id:SPI主设备
  • p_tx_data:发送数据的buffer
  • p_rx_data:接收数据的buffer
  • tx_size:需要发送的数据长度,以Byte为单位
  • rx_size:需要接收的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_dma_write_memory_async

表 250 app_spi_dma_write_memory_async接口
函数原型

uint16_t app_spi_dma_write_memory_async(app_spi_id_t id, uint8_t *p_cmd_data, uint8_t *p_tx_data, uint32_t cmd_size, uint32_t tx_size)

功能说明

SPI以DMA方式(异步)向Memory写入数据,在写入之前先发送命令,主要用于读写存储设备,比如Flash等

输入参数
  • id:SPI主设备
  • p_cmd_data:命令数据的buffer
  • p_tx_data:待写入数据的buffer
  • cmd_size:命令的长度,以Byte为单位
  • size:需要写入的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_dma_read_memory_async

表 251 app_spi_dma_read_memory_async接口
函数原型

uint16_t app_spi_dma_read_memory_async(app_spi_id_t id, uint8_t *p_cmd_data, uint8_t *p_rx_data, uint32_t cmd_size, uint32_t rx_size)

功能说明

SPI异步DMA方式读取Memory数据,在读取之前先发送命令,主要用于读写存储设备,比如Flash等

输入参数
  • id:SPI主设备
  • p_cmd_data:命令数据的buffer
  • p_rx_data:读取数据的buffer
  • cmd_size:命令的长度,以Byte为单位
  • size:需要读取的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_dma_transmit_high_speed_sync

表 252 app_spi_dma_transmit_high_speed_sync接口
函数原型

uint16_t app_spi_dma_transmit_high_speed_sync(app_spi_id_t id, uint8_t *p_data, uint16_t size)

功能说明

SPI同步高速DMA方式发送数据,此函数关闭全局中断,避免高优先级中断的干扰

输入参数
  • id:SPI主设备/从设备
  • p_data:需要发送数据的buffer
  • size:需要发送的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_spi_dma_receive_high_speed_sync

表 253 app_spi_dma_receive_high_speed_sync接口
函数原型

uint16_t app_spi_dma_receive_high_speed_sync(app_spi_id_t id, uint8_t *p_data, uint16_t size)

功能说明

SPI同步高速DMA方式接收数据,此函数关闭全局中断,避免高优先级中断的干扰

输入参数
  • id:SPI主设备/从设备
  • p_data:接收数据的buffer
  • size:需要接收的数据长度,以Byte为单位
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

示例工程

SPI读写Flash

示例实现SPI作为主设备用DMA方式对Flash设备进行读写,工程路径:SDK_Folder\projects\peripheral\spi\app_spi

流程图

图 20 Flash读写示例流程图

文件调用关系

示例工程在APP_DRV层基础上实现spi_flash.h,面向对Flash的操作,test_demo_cfg.h基于spi_flash.h,实现示例设计。示例工程的文件调用关系如下图所示:

图 21 Flash读写示例文件调用流程

初始化参数

app_spi_params_t spi_params = {
    .id = APP_SPI_ID_MASTER,
    .pin_cfg = {
       .cs = {
           .type   = APP_SPIM_CS_IO_TYPE,
           .mux    = APP_SPIM_CS_PINMUX,
           .pin    = APP_SPIM_CS_PIN,
           .mode   = APP_IO_MODE_MUX,
           .pull   = APP_IO_PULLUP,
           .enable = APP_SPI_PIN_ENABLE,
       },
       .clk  = {
           .type   = APP_SPIM_CLK_IO_TYPE,
           .mux    = APP_SPIM_CLK_PINMUX,
           .pin    = APP_SPIM_CLK_PIN,
           .mode   = APP_IO_MODE_MUX,
           .pull   = APP_IO_PULLUP,
           .enable = APP_SPI_PIN_ENABLE,
       },
       .mosi = {
           .type   = APP_SPIM_MOSI_IO_TYPE,
           .mux    = APP_SPIM_MOSI_PINMUX,
           .pin    = APP_SPIM_MOSI_PIN,
           .mode   = APP_IO_MODE_MUX,
           .pull   = APP_IO_PULLUP,
           .enable = APP_SPI_PIN_ENABLE,
       },
       .miso = {
           .type   = APP_SPIM_MISO_IO_TYPE,
           .mux    = APP_SPIM_MISO_PINMUX,
           .pin    = APP_SPIM_MISO_PIN,
           .mode   = APP_IO_MODE_MUX,
           .pull   = APP_IO_PULLUP,
           .enable = APP_SPI_PIN_ENABLE,
       },
    },
    .dma_cfg = {
        .tx_dma_instance = DMA0,
        .rx_dma_instance = DMA0,
        .tx_dma_channel  = DMA_Channel0,
        .rx_dma_channel  = DMA_Channel1,
#if (APP_DRIVER_CHIP_TYPE == APP_DRIVER_GR5526X)
        .wait_timeout_ms = SPI_WAIT_TIMEOUT_MS,
        .extend = 0,
#endif
    },
    .init = {
        .data_size      = SPI_DATASIZE_8BIT,
        .clock_polarity = SPI_POLARITY_LOW,
        .clock_phase    = SPI_PHASE_1EDGE,
        .baudrate_prescaler = SPI_CLOCK_PRESCALER,
        .ti_mode        = SPI_TIMODE_DISABLE,
        .slave_select   = SPI_SLAVE_SELECT_0,
#if (APP_DRIVER_CHIP_TYPE == APP_DRIVER_GR5526X)
        .rx_sample_delay = RX_SAMPLE_DELAY,
#endif
    },
 
    .is_soft_cs = SPI_SOFT_CS_MODE_DISABLE,
};
  • id:SPI角色定义,APP_SPI_ID_MASTER主设备
  • pin_cfg:SPI引脚定义,包含CS、CLK、MOSI、MISO引脚配置,配置复用模式,上下拉模式和引脚,具体见board_SK.h

    以GR5526为例,定义如下:

    /*******SPI IO CONFIG***************************/
    #define APP_SPIM_CS_PIN                     APP_IO_PIN_10
    #define APP_SPIM_CLK_PIN                    APP_IO_PIN_5
    #define APP_SPIM_MOSI_PIN                   APP_IO_PIN_6
    #define APP_SPIM_MISO_PIN                   APP_IO_PIN_7
    #define APP_SPIM_CS_IO_TYPE                 APP_IO_TYPE_GPIOB
    #define APP_SPIM_CLK_IO_TYPE                APP_IO_TYPE_GPIOB
    #define APP_SPIM_MOSI_IO_TYPE               APP_IO_TYPE_GPIOB
    #define APP_SPIM_MISO_IO_TYPE               APP_IO_TYPE_GPIOB
    #define APP_SPIM_CS_PINMUX                  APP_IO_MUX_1
    #define APP_SPIM_CLK_PINMUX                 APP_IO_MUX_1
    #define APP_SPIM_MOSI_PINMUX                APP_IO_MUX_1
    #define APP_SPIM_MISO_PINMUX                APP_IO_MUX_1
    
  • dma_cfg:DMA参数配置

    • dma_cfg.tx_dma_instance:SPI发送使用DMA0实例
    • dma_cfg.rx_dma_instance:SPI接收使用DMA0实例
    • dma_cfg.tx_dma_channel:SPI发送使用DMA0实例通道,选择通道0
    • dma_cfg.rx_dma_channel:SPI接收使用DMA0实例通道,选择通道1
  • init:SPI传输参数

    • init.data_size:数据位宽SPI_DATASIZE_8BIT,8 bits
    • init.clock_polarity: 串行时钟有效极性SPI_POLARITY_LOW,CLK非活动状态时为低电平
    • init.clock_phase:位捕获的时钟活动边沿SPI_PHASE_1EDGE,在第一个时钟变化沿捕获数据
    • init.baudrate_prescaler:分频系数,SPI传输时钟等于系统时钟除以分频系数,定义如下:
      #define SPI_CLOCK_PRESCALER             16u
    • init.ti_mode:定义是否使能TI模式,SPI_TIMODE_DISABLE不使能
    • init.slave_select:SPI_SLAVE_SELECT_0选择从设备0
    • init.rx_sample_delay:RX输入端口的采样延时,以系统外设时钟周期为单位
    • init.is_soft_cs:设置是否通过软件控制CS,SPI_SOFT_CS_MODE_DISABLE不使能软件控制CS

重要函数

  • Flash初始化
    spi_flash_init(APP_SPI_TYPE_DMA, FLASH_CLOCK_PRESCALER)
  • 读取Flash的ID
    flash_id = spi_flash_read_id();
  • 擦除Flash数据
    ret = spi_flash_erase(FLASH_PROGRAM_START_ADDR)
  • 写入Flash数据
    spi_flash_program(FLASH_PROGRAM_START_ADDR, write_buffer, FLASH_OPERATION_LENGTH)
  • 读取Flash的数据
    spi_flash_fast_read(FLASH_PROGRAM_START_ADDR, read_buffer, FLASH_OPERATION_LENGTH)

测试验证

  1. 参考示例工程代码进行Flash连接。

  2. 测试:

    连接开发板到PC端,打开串口调试助手,连接串口。打印如下,读取Flash ID成功,且写入Flash后,读取Flash设备数据和写入的一致。

    Flash id is:0xb6017
    [TEST Time:00:00] SPI flash read data verify success.
    [11:14:34.214] [TEST Time:00:00] SPI flash read data verify success.
    [11:14:34.741] [TEST Time:00:00] SPI flash read data verify success.

扫描关注

打开微信,使用“扫一扫”即可关注。