在SPI接口使用之前,需要实现SPI提供的服务,包括:
SPI接口的初始化、配置、打开、关闭、发送、接收等,如果使能了中断,还需要提供中断服务程序,使能了DAM,需要提供DMA的收发程序等。
实现上述功能服务前,还需要提供一些基础的服务,比如寄存器配置、状态获取、配置参数获取和设置、GPIO相关初始化和配置控制等。
通过前面学习可知,SPI寄存器的基地址获取方式:
spi_regs[SPI0]
spi_regs[SPI1]
spi_regs[SPI2]
其中SPI0、SPI1、SPI2为SPI编号。
通过基地址和寄存器配置相关的宏定义,可以实现对寄存器的配置。
对于SPI GPIO的访问,需要知道使用了哪个SPI,即SPI的编号,使用了哪个组。
当上层使用SPI接口时,传入参数为SPI设备。这里提供函数,通过SPI设备返回其编号,函数实现如下:
static u8 spi_get_info_id(spi_dev spi)//获取ID
{
ASSERT(spi < SPI_MAX_HW_NUM);
return spi;
}
这里SPI设备号和SPI编号一致,因此为相同的值。
上层调用SPI接口时传入SPI设备即为SPI的编号。
通过SPI设备,获取其用了哪个端口,即哪个组,函数实现如下:
static u8 spi_get_info_port(spi_dev spi)
{
u8 port = (u8) - 1;
u8 id = spi_get_info_id(spi);
switch (id) {
#if SPI0_ENABLE
case SPI0:
port = spi0_p_data.port;
break;
#endif
#if SPI1_ENABLE
case SPI1:
port = spi1_p_data.port;
break;
#endif
#if SPI2_ENABLE
case SPI2:
port = spi2_p_data.port;
break;
#endif
default: