2.5. SPI 主机

Overview

提供 SPI 主机应用示例、配置介绍和常见问题。

2.5.1. 应用实例

示例演示:

  • 设置 spi 主机参数

  • 主 spi 设备收发数据

example: 具体示例代码详见 apps/common/example/peripheral/spi/spi_master/main.c ,示例工程实现需在 apps/demo/demo_DevKitBoard/include/demo_config.h 中开启宏 USE_SPI_MASTER_TEST_DEMO

2.5.2. 常见问题

  • SPI 主机如何配置驱动程序?

    答:SPI 主机在 board.c 中配置参数

    //1 添加SPI硬件参数,标准spi协议mosi miso clk
    SPI1_PLATFORM_DATA_BEGIN(spi1_data)//当使用SPI2则:SPI2_PLATFORM_DATA_BEGIN(spi2_data)
        .clk    = 24000000, //主机spi时钟
        .mode   = SPI_STD_MODE,//spi数据线传输:mosi miso clk
        .port   = 'B',//SPI接口
        .attr   = SPI_SCLK_H_UPL_SMPH,//参数:默认为主机,CLK高 更新数据高。
    SPI1_PLATFORM_DATA_END()//当使用SPI2则:SPI2_PLATFORM_DATA_END()
    
    //2 设备列表添加SPI设备
    {"spi1", &spi_dev_ops, (void *)&spi1_data },
    

    Note

    关于 SPI 主机配置参数的几个说明:
    1. 一般用户可用 SPI1 和 SPI2,SPI0 为系统使用的 flash。

    2. clk:spi 时钟,最高为 lsb_clk 时钟。

    3. port:SPI 硬件接口,数据手册的 SPI 的 spi_do、spi_di、spi_clk 即为标准的 MOSI、MISO、CLK。

      SPI 1

      port

      spi_do

      spi_di

      spi_clk

      A

      PB7

      PB5

      PB6

      B

      PC10

      PC8

      PC9

      SPI 2

      port

      spi_do

      spi_di

      spi_clk

      A

      PH1

      PH2

      PH0

      B

      USBDMA

      PG15

      IO_PORT_USB_DPA

      C

      PA4

      PA2

      PA3

    4. mode:SPI_STD_MODE,默认的标准 spi 模式(mosi miso clk)。

    5. attr:参数1主从模式:从机模式 SPI_MODE_SLAVE (默认0则主机模式),参数2采样模式:SPI_SCLK_H_UPL_SMPH 为 CLK 空闲H高电平,上升沿更新数据,下降沿采样数据;其他采样如下,详情对应CPU下的 include_lib\driver\cpu\wl80\asm\spi.h 。(注意,spi作接收时,不可使用SPI_SCLK_H_UPL_SMPH和SPI_SCLK_L_UPH_SMPL,会出现数据接收错误,这是芯片spi模块自身设计问题。)

    SPI_SCLK_H_UPH_SMPL

    CLK空闲H,上升沿更新数据,下降沿采样数据

    SPI_SCLK_H_UPL_SMPH

    CLK空闲H,下降沿更新数据,上升沿采样数据

    SPI_SCLK_H_UPH_SMPH

    CLK空闲H,上升沿更新数据,上升沿采样数据

    SPI_SCLK_H_UPL_SMPL

    CLK空闲H,下降沿更新数据,下降沿采样数据

    SPI_SCLK_L_UPH_SMPL

    CLK空闲L,上升沿更新数据,下降沿采样数据

    SPI_SCLK_L_UPL_SMPH

    CLK空闲L,下降沿更新数据,上升沿采样数据

    SPI_SCLK_L_UPH_SMPH

    CLK空闲L,上升沿更新数据,上升沿采样数据

    SPI_SCLK_L_UPL_SMPL

    CLK空闲L,下降沿更新数据,下降沿采样数据

  • WL80 (790x系列) DMA 最大字节数的 SPI_MAX_SIZE ,当芯片为 AC790N 则 SPI_MAX_SIZE = 65535,当芯片为 AC791N 则 SPI_MAX_SIZE = 2^31,因此在 DMA 接收和发送是需注意 DMA 数据量不能超过最大值。 WL82(7910) 系列 DMA 支持超 64k 读写数据。

  • 主机模式硬件也不支持 CS 拉,CS 需要用户自行加代码,参考测试程序代码。

  • 使用时需要注意调用 SPI 底层驱动互斥问题。

2.5.3. API参考

  • SPI 的 API 接口说明如下:

Functions

void *dev_open(const char *name, void *arg)

dev_open:用于打开一个设备

Parameters
  • name – 设备名称

  • arg – 控制参数,一般为NULL

int dev_read(void *device, void *buf, u32 len)

dev_read:用于设备数据的接收。

Parameters
  • device – 设备句柄

  • buf – 要读入的 buffer 缓冲区

  • len – 要读入的长度

int dev_write(void *device, void *buf, u32 len)

dev_write:用于设备数据的发送。

Parameters
  • device – 设备句柄

  • buf – 要写入的 buffer 缓冲区

  • len – 要写入的长度

int dev_ioctl(void *device, int cmd, u32 arg)

dev_ioctl:用于对设备进行控制和参数的修改

Parameters
  • device – 设备句柄

  • cmd – 设备控制命令

  • arg – 控制参数

int dev_close(void *device)

dev_close:用于关闭一个设备

Parameters

device – 设备句柄