SPI是一种高速的,全双工,同步串行通信接口,用于连接微控制器、传感器、存储设备等,本文以指纹识别模块为例简单介绍SPI使用。
SPI以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,分别是:
Linux内核用CPOL和CPHA的组合来表示当前SPI的四种工作模式:
CPOL:表示时钟信号的初始电平的状态,0为低电平,1为高电平。CPHA:表示在哪个时钟沿采样,0为第一个时钟沿采样,1为第二个时钟沿采样。SPI的四种工作模式波形图如下:
在内核源码目录kernel/drivers/spi/中创建新的驱动文件,如:spi-rockchip-firefly.c 在驱动文件所在目录下的Kconfig文件添加对应的驱动文件配置,如:
在驱动文件所在目录下的Makefile文件添加对应的驱动文件名,如:
用make menuconfig在内核选项中选中所添加的驱动文件,如:
在DTS中添加SPI驱动结点描述,如下所示: kernel/arch/arm/boot/dts/firefly-rk3288-aio-3288j.dts
status:如果要启用SPI,则设为okay,如不启用,设为disable。
spidev@00:由于本例子使用的是SPI0,且使用CS0,故此处设为00,如果使用CS1,则设为01。
compatible:这里的属性必须与驱动中的结构体of_device_id 中的成员compatible 保持一致。
reg:此处与spidev@00保持一致,本例设为:0x00;
spi-max-frequency:此处设置spi使用的最高频率。
spi-cpha,spi-cpol:SPI的工作模式在此设置,本例所用的模块SPI工作模式为SPI_MODE_1,故设:spi-cpha = <1>,如果您所用设备工作模式为SPI_MODE0,则需在此把这两个注释掉,如果用SPI_MODE3,则设:spi-cpha = <1>;spi-cpol = <1>。
在定义 SPI 驱动之前,用户首先要定义变量 of_device_id 。 of_device_id 用于在驱动中调用dts文件中定义的设备信息,其定义如下所示:
此处的compatible与DTS文件中的保持一致。 定义spi_driver如下所示:
在初始化函数static int __init spidev_init(void)中创建一个字符设备:
向内核添加该设备:
创建设备类:
向内核注册SPI驱动:
如果内核启动时匹配成功,则调用该驱动的probe函数。 probe函数如下所示:
如果注册SPI驱动成功,你可以在/dev/目录下面看你到注册的驱动名称,可以在sys/class/下面看到你注册的驱动设备类。
写同步函数:
在本例所用的模块中,读数据的过程为:
主机向模块写寄存器的地址及读的指令(如:地址为0xf0,读指令为0x00)
模块收到读的指令后,数据以页的形式发送
主机设置读的模式
主机读取一页数据并存储
注:Firefly的SPI驱动是Linux下通用的驱动,可以参考源码:kernel/drivers/spi/spidev.c
全部0条评论
快来发表一下你的评论吧 !