SPI驱动初步分析
SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。
SPI接口技术是一种高速,高效的同步串行接口技术,因而SPI设备在数据通信中应用十分方便。设备驱动程序作为操作系统内核和硬件之间的接口,是嵌入式开发的重要组成部分。本文针对TI的davinci芯片DM6467和嵌入式Linux操作系统构建的开发平台,分析了DM6467的SPI接口特性,寄存器作用,以及初始化过程,并根据接口的连接特点说明了SPI设备驱动程序的基本开发方法。
同为串行通讯方式,SPI与uart非常相同,都是一个时钟周期只能传送一位数据。
与uart不同的是,SPI是同步串口通讯,即在发送数据的同时,也收到了相同数量的数据。
DM6467的SPI接口,其工作模式有两种:主模式和从模式。
工作于主模式的设备,我们称之为SPI主设备;工作于从模式的设备,我们称之为SPI从设备。
主设备提供时钟,并能对多个从设备进行选择,对选中的从设备发起通讯。
从设备接收时钟,等待主设备的选择,在选中后等待主设备的时钟信号,并进行数据交互。
davinci芯片为SPI提供了6个引脚:
SPI_CLK:串行时钟,主设备的输出,从设备的输入
SPI_EN:从设备状态通知引脚,主设备的输入,从设备的输出
SPI_SIMO:数据脚,主设备的输出,从设备的输入
SPI_SOMI:数据脚,主设备的输入,从设备的输出
SPI_CS0:片选0脚,主设备的输出,从设备的输入
SPI_CS1:片选1脚,主设备的输出,从设备的输入
其工作模式,又分为4种,具体如下:
3线模式,使用SIMO,SOMI,CLK,适用于一主一从
4线模式,使用SIMO,SOMI,CLK,CS,适用于一主多从
4线模式,使用SIMO,SOMI,CLK,EN,适用于一主一从,提供了从设备的ready状态
5线模式,使用SIMO,SOMI,CLK,CS,EN,适用于一主多从,提供了从设备的ready状态
我们采用最简单的3线模式,只使用3个引脚:SIMO,SOMI,CLK。
数据传输位数可以编程,变化范围:2-16位。我们采用最常用的8位数据模式,MSBfirst,数据高电平有效,无延迟。
由于不考虑效率,通讯过程中,没有使用比较复杂的EDMA与中断模式,而采用最简单的循环查询模式。
davinci芯片提供了时钟相位与极性的选择,在这里,我们只要保证主设备与从设备的一致即可。
SPI驱动编程的基本思路:
写一个针对特定SPI协议的字符设备驱动程序,主要工作就是填充file_operations结构体,以及进行设备和程序的注册。
具体步骤是通过寄存器直接操作spi控制器。
加载模块时创建SPI字符设备,
open时设置工作模式,初始化SPI。
write,read时进行数据交互,为简化程序起见,在驱动中每次只交互一字节,多字节的交互通过应用程序实现。
由于SPI是一步就实现了交互,所以驱动中不需要同时有读写函数。在主设备驱动实现write,在从设备实现read。
close不做任何事。
卸载模块时,销毁SPI字符设备。
下面着重描述了SPI的初始化过程:
SPI初始化流程:
1,清零SPI全局控制寄存器SPIGCR0的RESET位,以确保SPI模块处于复位状态
2,将SPIGCR0的RESET位置1,以使SPI模块脱离复位状态
3,设置SPIGCR1的CLKMOD 和 MASTER 位,完成主从模式设置。
4,配置SPIPC0,使能相关的引脚,如SPI_SIMO, SPI_SOMI, SPI_CLK,以及可能用上的SPI_CS0, SPI_CS1,SPI_EN。
5,配置SPIFMTn(n=0,1,2,3),设置所需的数据格式。
a,对PRESCALEn位操作,设置时钟分频数
b,对CHARLENn位操作,设置传输字符的位数(2-16)
c,通过PHASEn 与 POLARITYn位,设置时钟相位与极性
d,通过SHIFTDIRn位,设置移位方向
6,用SPIDAT1的DFSEL位选择预配置好的数据传输格式。
7,配置用SPI_CS的四线模式需要进行的配置
a,用SPIDELAY配置片选线的建立或保持时间
b,用SPIDAT1的CSNR,选择片选号
c,用SPIDEF的CSDEFn位,设置片选线非激活状态的默认片选值。
8,配置用SPI_EN的四线模式需要进行的配置
a,用SPIPC0 的ENAFUN位配置SPI_EN功能
b,配置SPIINT的ENABLE_HIGHZ位,指导SPI未激活时SPI_EN脚的行为。
9,如果用5线模式,需要同时操作第7步与第8步
10,设置SPIINT,使能所需中断
11,用SPILVL的RXINTLVL位设置中断事件级别
12,设置SPIGCR1的SPIEN位,使能SPI模块
13,如果用EDMA执行传输,建立并使能EDMA通道,然后设置SPIINT的DMAREQEN位。
14,用CPU 和 EDMA,将数据写入SPIDAT1,数据就准备发送了。
本文针对TI的davinci芯片DM6467和嵌入式Linux操作系统构建的开发平台,分析了DM6467的SPI接口特性,寄存器作用,以及初始化过程,并根据接口的连接特点说明了SPI设备驱动程序的基本开发方法。
更具体的信息请参考TI相关文档。
待续:SPI主模式驱动之初步实现。