APP SPI驱动
宏定义
APP_SPI_PIN_ENABLE
| 描述 | 值 |
|---|---|
| SPI引脚使能 |
1 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_spi.h。
APP_SPI_PIN_DISABLE
| 描述 | 值 |
|---|---|
| SPI引脚不使能 |
0 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_spi.h。
结构体
app_spi_params_t
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_spi_id_t id |
设备类型 |
该参数的取值可以是下列值中的任意一个:
|
| 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 |
|
| 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
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| 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
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| 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 |
使能/不使能引脚 |
|
详细信息请参考文件:SDK_Folder\drivers\inc\app_spi.h。
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
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| uint32_t data_size |
SPI数据长度 |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t clock_polarity |
串行时钟有效极性 |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t clock_phase |
位捕获的时钟活动边沿 |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t baudrate_prescaler |
发送和接收SCK时钟波特率的预分频器值 |
取值范围:0 ~ 65534之间的偶数,如果是0,表示关闭clk。 分频值与波特率关系:clock rate = baudrate= peripheral CLK / baudrate_prescaler。 |
| uint32_t ti_mode |
TI mode使能/不使能 |
该参数的取值可以是下列值中的任意一个:
|
| uint32_t slave_select |
选择的从设备 |
该参数的取值可以是下列值中的任意一个:
|
| 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
结构体定义如下:
| 成员 | 描述 | 取值 |
|---|---|---|
| app_spi_evt_type_t type |
串口事件类型 |
该参数的取值可以是下列值中的任意一个:
|
| union { uint32_t error_code; uint16_t size; }data; |
说明: 若事件类型为传输错误,此处返回错误号; 若事件类型为接收/发送完成,此处显示已接收/发送的数据长度 |
SPI错误号及对应含义如下:
|
详细信息请参考文件:SDK_Folder\drivers\inc\app_spi.h。
枚举
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
枚举定义如下:
| 成员 | 描述 |
|---|---|
| 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
枚举定义如下:
| 成员 | 描述 |
|---|---|
| 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
枚举定义如下:
| 成员 | 描述 |
|---|---|
| APP_SPI_INVALID = 0 |
SPI不可用 |
| APP_SPI_ACTIVITY = 1 |
SPI激活 |
| APP_SPI_SLEEP = 2 |
SPI睡眠 |
详细信息请参考文件:SDK_Folder\drivers\inc\app_spi.h。
接口函数
| 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
| 函数原型 | uint16_t app_spi_init(app_spi_params_t *p_params, app_spi_evt_handler_t evt_handler) |
|---|---|
| 功能说明 | 初始化SPI |
| 输入参数 |
|
| 返回值 | 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
| 函数原型 | 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
| 函数原型 | uint16_t app_spi_receive_sync(app_spi_id_t id, uint8_t *p_data, uint16_t size, uint32_t timeout) |
|---|---|
| 功能说明 | SPI轮询方式(同步)接收数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_spi_receive_async
| 函数原型 | uint16_t app_spi_receive_async(app_spi_id_t id, uint8_t *p_data, uint16_t size) |
|---|---|
| 功能说明 | SPI中断方式(异步)接收数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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设备的读取操作 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 | 超时时间默认1s,定义请见DEFAULT_POLLING_WAIT_TIMEOUT_MS |
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设备进行数据写入操作 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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轮询方式(同步)发送数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
app_spi_transmit_async
| 函数原型 | uint16_t app_spi_transmit_async(app_spi_id_t id, uint8_t *p_data, uint16_t size) |
|---|---|
| 功能说明 | SPI中断方式(异步)发送数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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以轮询方式(同步)进行全双工数据发送和接收 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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以中断方式(异步)进行双工数据发送和接收 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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发送出去 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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发送出去 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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等 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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等 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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
| 函数原型 | uint16_t app_spi_transmit_high_speed_sync(app_spi_id_t id, uint8_t *p_data, uint16_t size) |
|---|---|
| 功能说明 | SPI中断方式(同步)高速发送数据,此函数关闭全局中断,避免高优先级中断的干扰 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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中断方式(同步)高速接收数据,此函数关闭全局中断,避免高优先级中断的干扰 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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接口函数
| 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
| 函数原型 | 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
| 函数原型 | 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
| 函数原型 | 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模式) |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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模式) |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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方式接收数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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方式发送数据 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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方式) |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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发送出去 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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等 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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等 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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方式发送数据,此函数关闭全局中断,避免高优先级中断的干扰 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
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方式接收数据,此函数关闭全局中断,避免高优先级中断的干扰 |
| 输入参数 |
|
| 返回值 | APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义 |
| 备注 |
示例工程
SPI读写Flash
示例实现SPI作为主设备用DMA方式对Flash设备进行读写,工程路径:SDK_Folder\projects\peripheral\spi\app_spi。
流程图
文件调用关系
示例工程在APP_DRV层基础上实现spi_flash.h,面向对Flash的操作,test_demo_cfg.h基于spi_flash.h,实现示例设计。示例工程的文件调用关系如下图所示:
初始化参数
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)
测试验证
-
参考示例工程代码进行Flash连接。
-
测试:
连接开发板到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.