江西理工大学应用科学学院
嵌入式系统开发技术
课程设计
    业:    电子信息工程     
    级:    电信121         
            号:  08060312109       
    名:        贺佳         
设计题目:Linux温度传感器驱动程序
                                                  20151124

 
贺佳
 
电信121
 
08060312109
课设题目
基于嵌入式Linux温湿度传感器驱动程序
指导教师
王苏敏
评分项目
满分分值
得分
设计文档(30分)
文档格式
封面
2
页面布局
4
目录格式
3
图表质量
2
页眉页脚
2
文档内容
内容完整性
6
内容逻辑性
5
内容正确性
6
程序代码(30分)
程序功能
15
编程规范
7
编程文档
8
答辩(20分)
课题陈述
7
问题答辩
10
是否超时
3
考勤(20分)
20
总评成绩
指导教师评语
签名:                     
教研室意见
签名:                     

基于嵌入式Linux温湿度传感器驱动程序
2.需求分析
在工业控制和工业生产领域中, 传感器对于工业控制和生产环境的监控作用不言而喻。传统的传感器监控系统大都采用单片机控制, 其监控的准确度和实时性不太令人满意。本文寻到一套切实可行的传感器设计方案,其利用温湿度传感器芯片,,基于PXA310硬件平台和操作系统,能有效监控现场温湿度Linux变化。在周围环境发生变化, 不能满足工作要求时,可以获取监控数据并提出预警, 提高生产和工作环境检测的可靠性及实时性。
温度设计传感器电路设计
比较了一些传感器应用设计方案后 ,选用SHTl O 芯片为嵌入式温湿度传感器的 printf输出格式linux核心部件。它外围电路简 便,相比其他传感器芯片(DSl 8820)有其独到优势[1]。 STHlO 每秒可进行 3 次温湿度测量 ,数据精度 14 bit 并且工作稳定。其测量采用 CMOSens 专利[2 ,所以在 测量效率和精度上要好于 05188200518820  采用 单单、线控制方案( l-wire
大约每秒测量一次,9 位数 字式温度数据;只提供温度测量
需求概述
SHTlO  是一款高度集成的温湿度传感器芯片 ,提供全量程标定数字输出 。传感器包括一个电窑 性聚合 体湿度敏感元件和一个用能隙材料制成的温度 敏感元 件,他们与 14 AI D 转换器以及一个串行接 口电路设计在同一个芯片上面。其通过标定得到校 系数以程序形式储存在芯片 OTP 内存中,并利用两 线制串行接口与 内部电压调整 ,使外国系统集成变得 快速而简单。。其在生产环境检测要 求严格时,就显得精度和功能有些不足.SHTl O  芯片 电源 3.3V 。传感器上 电后,等待 ms  来完成 “休眠” 状态。通信复位和启动传输命 令后,发送  组测量命令( '00000101 表示相对湿 RH,  '000000 门’ 表示温度 T ,控制器要等待测 量结束。这个过程需要大约 ll/5 5 / 210ms  ,分别对 8/12 /14bit  测量。SHTlO  通过下拉 DATA  至低 电平,表示测量结束。控制器触发 SCK  时钟前,必须等待这个 “数据备妥” 信号才能将测量数据正确读 入。 测量和通讯结束后 SHTlO  自动转入休眠模式。数据 传送采用两线制串行接 口(与 12 接口不兼容)。
3.总体设计
SHTl O 采用 LCC 封装,其DATA SCK 号| 脚分
别连接到 PXA310 GP1078 GP. 79PXA3 lO
通过模拟时序方式实现对外 国温湿度传感器的控制和 数据读写操作。由于 SHTl O 对于温湿度灵敏度很高 ,在系统集成时应尽量远离发热源(如 MCULCD 等), 否则测量结果会有所偏离 ;为 SHTlO 布线时,周围应 尽量铺地减少周围器件对其 的干扰。SHTlO 电路原理 图如图 1 所示。
4
t
JV
i
F
     
·
G
1  SHTl O 电路原理图
Linux温湿度传感器驱动程序 实现
单片机控制的传感器设备中 ,单片机通常是单线 程运行。在进行温湿度测量时 ,单片机需要等待测试 结果返回,其方法阻碍了其他测试和操作的罔步执行。 在嵌入式 LimX 系统中,
驱动程序将测试任务送入任 务队列,交出CPU 控制权,继而进行其他实时任务运 行,待内核空闲再进λ任务队列完成传感器的测量 以此提高系统执行的效率和实时性。
Linux 温湿度传感器设备加载
温湿度传感器使用Linux 内核的 Miscdevice 数据结构在驱动程序初始化时将设备注册到内核 Miscdevice 是字符设备 ,其主设备号为 10,设备及 设备接口函数定义如下所示。
static struct file_operations shtl O_fops = { owner:THIS_MODULE,    //   模块
read:  shtl O_ read,                        //数据读取操作
static  struct  miscdevice my_shtl O ={
.minor=4,            //设备号为4
.name="SHTl O"          //设备名称为SHTl O
.fops=&shtl O_fops,        //设备可用相关操作
驱动程序加载设备时将调用 
内核的注册函数。在Linux2.4 2.6 内核申,几乎所有 Linux 驱动程序都依靠如下函数加载模块.
static int    init shtl
O_init(void)
misc_register(&my_shtl  O);  //注册设备SHTl O
return O;              //返回成功操作0
驱动程序初始化完成后 ,上层应用程序可以调用 shtl O_fops 中的 shtl O_read 函数进行温湿度的读 取操作。
Linux  温湿度传感器设备操作
进行数据读取前,首先要在驱动程序 甲开辟 4 字节的数据空间,用于存放温度和湿度测量值 。这里 定义全局变量数据缓冲区为 unsigned char bu例。
读取 SHTl O 温湿度数据前 ,需要进行端 口初始化 SHTlO 复位操作,然后将任务送于任务队列 并阻塞 线程[SJ ,当任务完成返回后再唤醒线 程,将读到数据 传递给上层应用程序做进一步处理 。程序流程图和实 现函数如图 2 所示。
            内核空间数据送往用户间处理   
2    驱动程序流程图
static int measure_ shtl O(u8 checksum,u8 mode)
unsigned  char error=O;              //设备无应答 ,标识清 O
int i=O;                              //用来指示数据存放位置
start_trans();                      //模拟时序,启动传输
switch(mode)                        //选择 方式
case    TEMP:error+ =write_ byte    (MEASURE_ TEMP);
i= l;break;                          //测量温度 ,指示存放位置
case    HUMl:error+=wite_byte(MEASURE_ HUMI);
break;                                //测量湿度
while(]){                          //等待 SHTlO 应答 ,退出
if(read_data0==0) break;
if(i){                              //查看 i,存放数据
buf[O]=read_byte(ACK);        //将测量温度数据 存放于
buf[l ]=read_byte(ACK);          / /buf[O]和 buf[1],并应答
else{
buf[2]=read_byte(ACK);          //将测量湿度数据 存放于
buf[3]=read_byte(ACK);                / / buf[2]矛日 buf[3]并应答
                                //最后读效验  ,无应答
checksum= read_byte(noACK);
return  error;                        //返回错误标识
述函数中 start_trans;  write_byte;  read_data;    read_byte 分别利用 PXA310 sl脚模拟时序 完成启动传输、写字节,读一位数据和读字节的操作。
static    ssize_t    sht lO_read(struct    fileile,char *buffer,size_t count,loff_t *ppos
porUnit();                            //初始化 PXA310 端口
reset_sht100;                        //复位 SHTl O
tasklet_schedule(&shtl O_tasklet);          //将任务送于任务队列
wait_for_completion(&comp);                //阻塞线程 ,等待完成
copy_to_user(buffer, (char *)&buf,sizeof(buf));    //将读到的数据返 回用户
return O;                                      //空间,退出
tasklet_sched ule() tasklet ,在获得运行机会之前 只会调度一次 ,如果在 时被 ,则 6)  0 wait_for_completion ()这个函数进行    个不可打断 的等待,如果有代码调用它 ,并且没有完成这个任务 结果会是一个不可杀死的进程 copy_to_user ()将内 核空间数据传向上层用户空间 ,并让上层测试程序做 进一步处理。