以 TMP102 为例
1. 厂商:
德州仪器公司
2. 特点:
两种运行模式, 12 位精度 / 13 位精度
精确度达 0.5℃, 芯片读到的值的精确度是 0.0625℃
兼容 SUMBus 和 I2C.
3. 常见总线协议
(1)SPI:Serial Peripheral Interface
4 条线: 串行时钟线(SCLK), 主机输入 / 从机输出数据线 MISO, 主机输出 / 从机输入数据线 MOSI, 低电平有效的从机选择线 NSS.
在 CPU 和外围低速器件之间进行同步串行数据传输, 全双工通信, 数据传输速度总体来说比 I2C 总线要快, 速度可达到几 Mbps.
(2)I2C:
2 条线: SDA(串行数据线),SCL(串行时钟线)
高效, 简单
4.TMP102 寄存器介绍
指针寄存器(Pointer Register)
配置寄存器(Configuration Register)
温度寄存器(Temperature Register)
低温阈值寄存器(T LOW Register)
高温阈值寄存器(T HIGH Register)
3. 驱动实现原理
(1)结构体创建
sensor_private_data 结构体: 用于上报数据
misc 设备结构体: 用于常见 ioctl
(2)注册
我们采用 i2c 协议, 所以驱动类型为 i2c_driver, 注册的时候初始化结构体和芯片寄存器
TMP102 芯片寄存器初始化过程如下:
读配置寄存器; 写配置寄存器, 将 {0x70,0xA0} 写入配置寄存器, 开启温度转化功能; 读配置寄存器; 若读取成功, 则初始化结束.
(3)i2c 传输
寄存器读写通过 I2C 协议, 需定义一个 i2c_msg 数组, 并填充这个数组的地址, buffer 等内容, 通过 i2c_transfer 将这个 msgs 数组转发出去.
(4)上报数据
从寄存器中读到有效的数据
然后进行处理
最后直接使用 input 子系统中给出的标准接口 input_report_abs 把数据上报到 input 子系统中.
对于 TMP102 芯片而言, 读取的数据格式如表所示. 数据占了两个字节, 第一个字节表示高八位的, 第二个字节仅高四位为有效值, 因此需要上报的数值应该经过 x = (buffer[0]<<8|buffer[1])>>4 处理以后在进行上报.
Temperature 第一个寄存器
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
T11 | T10 | T9 | T8 | T7 | T6 | T5 | T4 |
Temperature 第二个寄存器
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
T3 | T2 | T1 | T0 | 0 | 0 | 0 | 0 |
来源: https://www.qcloud.com/developer/article/1509278