文章目录
1.spi总线驱动
1.1spi简介
SPI 是串行外设接口(Serial Peripheral Interface)的缩写。
是 Motorola 公司推出的一种同步串行接口技术,是一种
高速的,全双工,同步的通信总线。
SPI优点
支持全双工通信
通信简单
数据传输速率快
1):高速、同步、全双工、非差分、总线式
2):主从机通信模式
缺点
没有指定的流控制,没有应答机制确认是否接收到数据,
所以跟IIC总线协议比较在数据的可靠性上有一定的缺陷。
1.2spi时序解析
可以一主机多从机,具体和那个从机通讯通过cs片选决定。
MISO :主机输入,从机输出
MOSI :主机输出,从机输入
CLK :时钟线(只能主机控制)
CS :片选线
数据传输的四种方式:
CPOL(时钟极性) : 0:时钟起始位低电平 1:时钟起始为高电平
CPHA(时钟相位) :0:第一个时钟周期采样 1:第二个时钟周期采样
例如:
CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,
也就是 SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送
是在下降沿。
CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,
也就是 SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送
是在上升沿。
CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,
也就是 SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送
是在上升沿。
CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,
也就是 SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送
是在下降沿。
1.3spi驱动框架
配置spi核心层和spi控制器驱动到内核中
spi控制器驱动配置:
Device Drivers —>
[*] SPI support ---> <*> STMicroelectronics STM32 SPI controller
spi核心层配置:
CONFIG_SPI_MASTER=y
重新编译内核
make uImage LOADADDR=0xc2000000
将编译好的内核拷贝到tftpboot目录下
1.4spi设备驱动的API
1.分配并初始化对象
struct spi_driver {
int (*probe)(struct spi_device *spi);
int (*remove)(struct spi_device *spi);
struct device_driver driver;
};
struct device_driver {
const char *name;
const struct of_device_id *of_match_table;
}
2.注册
#define spi_register_driver(driver) \
__spi_register_driver(THIS_MODULE, driver)
3.注销
void spi_unregister_driver(struct spi_driver *sdrv)
4.一键注册的宏
module_spi_driver(结构体变量名);
1.5spi驱动的实例
#include <linux/init.h>
#include <linux/module.h>
#include <linux/spi/spi.h>
int m74hc595_probe(struct spi_device* spi)
{
printk("%s:%d\n", __func__, __LINE__);
return 0;
}
int m74hc595_remove(struct spi_device* spi)
{
printk("%s:%d\n", __func__, __LINE__);
return 0;
}
struct of_device_id oftable[] = {
{
.compatible = "hqyj,m74hc595",},
{
}
};
MODULE_DEVICE_TABLE(of,oftable);
struct spi_driver m74hc595 = {
.probe = m74hc595_probe,
.remove = m74hc595_remove,
.driver = {
.name = "m74hc595"