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. 寄存器读写和数据获取时序

- 事件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)


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


(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.开机
- 往寄存器写入输出电压范围;
- 往寄存器写入上电指令;
3.传递函数
- 单极性
- 双极性
- 符号解释:


三、寄存器
- 写入格式


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

- OUTPUT RANGE

- CONTROL_REGISTER

- POWER CONTROL REGISTER

