示例代码
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连接:
表 248 开发板管脚与Flash管脚对应连接 开发板 开发板管脚与Flash管脚对应连接关系 GR551x开发板
- J4的D10(CS)连接Flash的CS引脚
- D13(CLK)连接Flash的CLK引脚
- D11(MOSI)连接Flash的MISO引脚
- D12(MISO)连接Flash的MOSI引脚
GR5526开发板
无。
说明:
GR5526开发板自带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.