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 主机配置参数的几个说明:
一般用户可用 SPI1 和 SPI2,SPI0 为系统使用的 flash。
clk:spi 时钟,最高为 lsb_clk 时钟。
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
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作接收时,不可使用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 – 设备句柄