SPI驱动框架+SPI设备驱动编写方法

789 阅读3分钟

I2C驱动框架

一、主要对象

1. SPI总线

// linux/driver/spi.c
struct bus_type spi_bus_type = {
	.name		= "spi",
	.dev_groups	= spi_dev_groups,
	.match		= spi_match_device, //匹配规则
	.uevent		= spi_uevent,
};

2. SPI驱动

// linux/spi/spi.h
struct spi_driver {
	const struct spi_device_id *id_table; //要匹配的从设备信息
	int			(*probe)(struct spi_device *spi); //probe函数
	int			(*remove)(struct spi_device *spi); 
	void			(*shutdown)(struct spi_device *spi); 
	struct device_driver	driver;
};

实战——ADS8694

一、硬件特性

精度:18位
通道数:4
内部含参考电压(REFSEL接AGND):4.096V
通讯方式:SPI
5V供电下最大测量范围:-2.5 * Vref ~ +2.5 * Vref
每个引脚测量范围可分别编程(PGA):双极性2.5、1.25、0.625;单极性2.5、1.25倍
AD转换表

二、工作特性

1. 寄存器读写和数据获取时序

图中有4个事件:

  • 事件1:主机拉低CS->ADC开始转换数据(此时不输出数据即SDO=LOW),同时从ADC可以接收来自主机得数据(SDI)总线,进行对寄存器配置等。
  • 事件2:此时并不会输出数据,因为AD转换结果固定在第16个SCLK下降沿发出,因此SCLK得频率不可以太大,否则来不及转换呢。根据data:Timing Requirement可知,fsclkmax=18M。
  • 事件3:此时为第16个SCLK的下降沿,设备不再从SDI读入数据,SDO开始输出转换数据,一共需要18个SCLK。
  • 事件4:主机拉高CS,SDO进入高阻态
  • 结论:可见34个SCLK完成一次写入或者转换。

2. 工作模式

(1) NO_OP(0000h)

维持原状

(2) STANDBY(8200h)

低功耗模式,部分电路断电,在CS被拉高的上升沿,执行该命令。在STADBY模式,可以对Program寄存器进行更新。输入命令AUTO_RST和MAN_CH_n,在下一个CS上升沿退出STANBY模式。下一个CS下降沿开始对输入进行采样,在退出STANDBY模式后至少要拉高CS20us,用以上电。

(3) PWR_DN(8300h)

断电模式

(4) AUTO_RST(A000h)

自动扫描设备所有通道电压模式。扫描完一个通道之后,下一次CS拉低,会自动扫描下一个通道。为了在下一个数据帧准确的获取通道1上的数据,命令帧必须是34个SCLK的帧。下图为命令时序图:

下列为数据时序图(若中途再次发送该命令,则重新从0开始扫描):

(5)MAN_Ch_n

与自动采集类似,只不过是手动指定通道罢了。

(6)RST(8500h)

复位模式:所有寄存器值恢复默认。

三、寄存器

1. 命令寄存器(切换模式)

具体时序已经在上文给出。

2. 程序寄存器(配置)

(1)读写时序

(2)

开机所有寄存器重置为默认值

实战——AD5754

一.硬件特性

1.简介

  • 输出电压范围可编程+5V,+10V,+10.8V,±5V,±10V,±10.8V。
  • 处理时间:10us(典型)
  • 分辨率:16位
  • 双极性零漂:±6mv
  • SCLK周期:最小33ns
  • 通道数:4通道

2.引脚定义

二.工作特性

1.时序图

  • 写入时序

  • 各时间含义

  • 读出时序

2.开机

  1. 往寄存器写入输出电压范围;
  2. 往寄存器写入上电指令;

3.传递函数

  • 单极性
    V_{out} = V_{REFIN} \times Gain[\frac{D}{2^N}]
  • 双极性
    V_{out} = V_{REFIN} \times Gain[\frac{D}{2^N}] - \frac{Gain \times V_{REFIN}}{2}
  • 符号解释:

本文仅仅研究AD5754的单极性输出:

三、寄存器

  • 写入格式

  • DAC REGISTER(输出电压值的数字量)

  • OUTPUT RANGE

  • CONTROL_REGISTER

  • POWER CONTROL REGISTER