CN / EN
文档反馈
感谢关注汇顶文档,期待您的宝贵建议!
感谢您的反馈,祝您愉快!
无匹配项 共计114个匹配页面

示例代码

SPI读写Flash

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

示例工程流程图

图 21 Flash读写示例流程图

文件调用层次

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

图 22 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连接:

    表 248 开发板管脚与Flash管脚对应连接
    开发板 开发板管脚与Flash管脚对应连接关系

    GR551x开发板

    • J4的D10(CS)连接Flash的CS引脚
    • D13(CLK)连接Flash的CLK引脚
    • D11(MOSI)连接Flash的MISO引脚
    • D12(MISO)连接Flash的MOSI引脚

    GR5526开发板

    无。

    说明:

    GR5526开发板自带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.

扫描关注

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