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 主机配置参数的几个说明:
clk:SPI 时钟,从机模式则跟随主机。
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
mode:SPI_STD_MODE,默认的标准 spi 模式(mosi miso clk)。
attr:参数 1 主从模式:从机模式 SPI_MODE_SLAVE (默认0则主机模式)。参数 2 采样模式:SPI_SCLK_H_UPL_SMPH 为 CLK 空闲H高电平,上升沿更新数据,下降沿采样数据;其他采样如下,详情对应 CPU 下的
include_lib\driver\cpu\wl80\asm\spi.h
。
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 – 设备句柄