一. 模式特点
三线: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作用
扫描二维码关注公众号,回复:
151177 查看本文章
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: 主控制器接口,用来描述控制器驱动