2.6. SPI 从机

Overview

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

2.6.1. 应用实例

示例演示:

  • 设置 spi 从机参数

  • 从机 spi 设备读取接收到的数据。

example: 具体示例代码详见 apps/common/example/peripheral/spi/spi_slave/main.c

2.6.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    = 80000000, //时钟,可设置,无影响,时钟从机模式跟随主机模式
        .mode   = SPI_STD_MODE,//spi数据线传输:mosi miso clk
        .port   = 'B',//SPI接口
        .attr   = SPI_MODE_SLAVE | SPI_SCLK_H_UPL_SMPH | SPI_UNIDIR_MODE,//参数:从机,CLK高 更新数据高,单向模式
    SPI1_PLATFORM_DATA_END()//当使用SPI2则:SPI2_PLATFORM_DATA_END()
    
    //2 设备列表添加SPI设备
    {"spi1", &spi_dev_ops, (void *)&spi1_data },
    

    Note

    关于 SPI 从机配置参数的几个说明:
    1. clk:SPI 时钟,从机模式则跟随主机。

    2. 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

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

    4. 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,下降沿更新数据,下降沿采样数据

    参数 3 单双向模式:SPI_UNIDIR_MODE 为单向:只用 SPI 的 DO 一根线数据传输(一般只用于作为从机只接收数据,或者只发送数据),SPI_BIDIR_MODE 为双向:用 SPI 的 DO/DI 两根线数据传输,从机单双向都可用(具体看实际应用)。

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

  • 当使用 SPI 作为从机接收不固定数据时,需要知道通信协议,详情参考程序 spi_nomask_interrupt.c

  • 使用不可屏蔽中断时,中断函数不能调用系统 API(调试期间可加打印 printf 函数),调用函数需要用户自写,调用其他 API 也需要指定到指定在内部 sram,即 sec (.volatile_ram_code) 指定函数,详情参考程序 spi_nomask_interrupt.c

  • 从机模式下不支持 CS 拉低或者拉高触发接收(主机下用户自行处理 CS 引脚时序,一般在读写前改变即可)

2.6.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 – 设备句柄