一. 模式特点
三线:SS、CLK、MOSI和MISO同一根数据线,半双工
四线:SS、CLK、MOSI、MISO,全双工
CPOL:时钟极性, =0 时钟空闲时 低电平 =1 时钟空闲时 高电平
CPHA:时钟相位, =0 数据将在时钟第1个边沿进行读取 =1 数据将在时钟第2个边沿进行读取
二. SPI驱动模型:SPI核心层、SPI主机控制器层、SPI(从机)设备驱动层。
1. SPI核心
SPI控制器驱动和设备驱动之间的纽带,它提供了SPI控制器驱动和设备驱动的注册、注销方法等。
2.SPI总线驱动
对控制器的驱动实现。
3. SPI设备驱动
对SPI从设备的驱动实现,如spi flash
1. SPI核心层
1.1 相关文件:devices/spi/spi.c、include/linux/spi/spi.h
1.2作用
1)提供了SPI总线驱动和设备驱动的注册、注销方法等。
2)使 SPI设备驱动可以访问使用 SPI 控制器驱动提供的向SPI总线传递数据所使用的方法、函数1.3 SPI控制器层接口
//分配spi_master结构
struct spi_master *spi_alloc_master(struct device *dev, unsigned size)
//注册spi_master结构
int spi_register_master(struct spi_master *master)
//注销spi_master结构
void spi_unregister_master(struct spi_master *master)
1.3 SPI设备驱动层接口
// 分配spi_driver结构到spi总线
int spi_register_driver(struct spi_driver *sdrv)
// 注销spi_driver总线
static inline void spi_unregister_driver(struct spi_driver *sdrv)
//分配、添加spi_device结构到spi总线上;
struct spi_device *spi_new_device(struct spi_master *master, struct spi_board_info *chip)
1.4 构建spi总线(内核中已经做好)
static int __init spi_init(void)
{
int status;
buf = kmalloc(SPI_BUFSIZ, GFP_KERNEL);
if (!buf) {
status = -ENOMEM;
goto err0;
}
status = bus_register(&spi_bus_type);
if (status < 0)
goto err1;
status = class_register(&spi_master_class);
if (status < 0)
goto err2;
return 0;
err2:
bus_unregister(&spi_bus_type);
err1:
kfree(buf);
buf = NULL;
err0:
return status;
}
postcore_initcall(spi_init);
2. SPI主机控制器层构建(基于platform总线)
struct spi_master: 主控制器接口,用来描述控制器驱动