ds18b20温度传感器驱动程序

ds18b20驱动程序

有了之前延时的方法,那么实现一个单总线数据传输的传感器驱动程序就非常简单了。下面我们套用杂项驱动框架来编写ds18b20驱动程序。
实现需要明确的是:**ds18b20驱动的本质是通过2440的gpio,通过给定的时序对ds18b20的读写数据访问,最后将数据传回应用程序。**由于我们实验的linux内核是三星公司根据2440公板修改后的内核,所以有关gpio的操作,三星公司提供了几个api函数,从而大幅度降低了程序的编写难度

  1. void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function);配置gpio的功能,这里的功能主要就是输出/输入。该函数需要两个参数,第一个参数是需要控制的引脚,系统提供了几个带参宏,例如#define S3C2410_GPF(_nr) 表示GPF组的第_nr引脚。 S3C2410_GPF(1)就表示GPF1引脚。第二个参数表示功能,系统提供了几个不带参宏,如S3C2410_GPIO_OUTPUT表示输出,S3C2410_GPIO_INPUT表示输入;
  2. void s3c2410_gpio_pullup(unsigned int pin, unsigned int to);设置gpio引脚的内部上拉电阻。第一个参数表示要设置的引脚,第二个参数为1时表示使能上拉,0表示禁止上拉。本实验要全程使用内部上拉,因为我们没有外接上拉电阻。
  3. **unsigned int s3c2410_gpio_getpin(unsigned int pin);**读取某引脚的电平,1表示高电平,0表示低电平。
  4. void s3c2410_gpio_setpin(unsigned int pin, unsigned int to);控制某引脚的电平。第一个参数是要控制的引脚,第二个参数为1表示输出高电平,为0表示输出低电平。
    我们将ds18b20的数据引脚接到
    2440的GPF3
    引脚:
    在这里插入图片描述
    先定义几个宏便于之后的操作:

复位函数

在这里插入图片描述
首先编写ds18b20的复位函数
第29行:使能上拉电阻
第33-34行:在释放总线前,要把功能设置为输入并将引脚设置为高
之后和裸机驱动部分裸机类似

向ds18b20写数据函数

在这里插入图片描述
第69行的延时是有必要的,因为引脚从低电平变为高电平需要时间。

读取一个字节的函数

在这里插入图片描述

温度采集函数

在这里插入图片描述
最后就是温度采集了,跟裸机程序一样。需要注意的是这里不能使用浮点运算把温度值算好再传递给应用程序。这是因为内核本身是不支持浮点运算的这个计算的过程应该放在应用程序中

代码

#include <linux/init.h>
#include <linux/module.h>
#include <mach/hardware.h>
#include <mach/gpio-fns.h>
#include <asm/irq.h> 
#include <mach/regs-gpio.h>  
#include <asm/io.h>
#include <linux/delay.h>
#include <linux/miscdevice.h>
#include <asm/uaccess.h>
#include <linux/fs.h>
#include <linux/timer.h>

#define DQ S3C2410_GPF(3)
#define DQ_OUT S3C2410_GPIO_OUTPUT
#define DQ_IN  S3C2410_GPIO_INPUT

static int ds18b20_reset(void)
{
	int k;
	s3c2410_gpio_pullup(DQ,1);
	s3c2410_gpio_cfgpin(DQ,DQ_OUT);
	s3c2410_gpio_setpin(DQ,0);
	udelay(500);
	s3c2410_gpio_cfgpin(DQ,DQ_IN);
	s3c2410_gpio_setpin(DQ,1);
	k = 0;
	while(k < 30 && s3c2410_gpio_getpin(DQ))
	{
		udelay(10);
		++k;
	}
	if(k >= 30)
	{
		return 0;
	}
	k = 0;
	while(k < 30 && !s3c2410_gpio_getpin(DQ))
	{
		udelay(10);
		++k;
	}
	if(k >= 30)
	{
		return 0;
	}
	return 1;
}

static void ds18b20_write(unsigned char dat)
{
	int i;
	s3c2410_gpio_cfgpin(DQ,DQ_OUT);

	for(i = 0;i < 8;++i)
	{
		s3c2410_gpio_setpin(DQ,0);
		udelay(10);
		if(dat & 0x01)
		{
			s3c2410_gpio_setpin(DQ,1);
		}
		else
		{
			s3c2410_gpio_setpin(DQ,0);
		}
		udelay(40);
		s3c2410_gpio_setpin(DQ,1);
		udelay(3);
		dat >>= 1;
	}
}

static unsigned char ds18b20_read(void)
{
	unsigned char ret = 0;
	int i;

	for(i = 0;i < 8;++i)
	{
		s3c2410_gpio_cfgpin(DQ,DQ_OUT);
		s3c2410_gpio_setpin(DQ,0);
		udelay(3);
		s3c2410_gpio_setpin(DQ,1);
		s3c2410_gpio_cfgpin(DQ,DQ_IN);
		udelay(1);
		if(s3c2410_gpio_getpin(DQ))
		{
			ret |= 0x01 << i;
		}
		udelay(45);
	}
	return ret;
}

unsigned short getTemperature(void)
{
	unsigned short ret;
	ds18b20_reset();
	ds18b20_write(0xCC);
	ds18b20_write(0x44);
	mdelay(500);
	ds18b20_reset();
	ds18b20_write(0xCC);
	ds18b20_write(0xBE);
	ret = ds18b20_read();
	ret |= ds18b20_read();
	return ret;
}

static int ds18b20_driver_open(struct inode *node, struct file *fp)
{
	return 0;
}

static int ds18b20_driver_close(struct inode *node, struct file *fp)
{
	return 0;
}

static ssize_t ds18b20_driver_read(struct file *fp, char __user *user_buffer, size_t len, loff_t *offset)
{
	unsigned ret = getTemperature();
	copy_to_user(user_buffer,&ret,4);
	return sizeof(ret);
}

static ssize_t ds18b20_driver_write(struct file *fp, const char __user *user_buffer, size_t len, loff_t *offset)
{
	return 0;
}


static struct file_operations fops =
{
	.owner = THIS_MODULE,
	.open = ds18b20_driver_open,
	.read = ds18b20_driver_read,
	.write = ds18b20_driver_write,
	.release = ds18b20_driver_close
};

static struct miscdevice ds18b20_dev =
{
	.minor = MISC_DYNAMIC_MINOR,
	.name = "ds18b20",
	.fops = &fops
};


static int __init ds1820_init(void)
{
	int ret;
	ret = misc_register(&ds18b20_dev);
	if(ret < 0)
	{
		printk("misc_register is failed\n");
		return -1;
	}

	return 0;
}

static void __exit ds1820_exit(void)
{
}

module_init(ds1820_init);
module_exit(ds1820_exit);

MODULE_LICENSE("GPL");

应用层代码

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void)
{
    int fd = open("/dev/ds18b20",O_RDWR);
    if(fd < 0)
    {
        printf("file open error\n");
        return 0;
    }

	int i = 0;
	float j = 0;
    while(1)
    {
		sleep(1);
		read(fd,&i,4);
		j = i * 0.0625; 
		printf("%.2f\n",j);
    }

    return 0;
}

结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/573916.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【介绍下WebStorm开发插件】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

保护你的网站:了解5种常见网络攻击类型及其防御方法

随着互联网的迅猛发展&#xff0c;针对网站的各种类型的网络攻击随之增加&#xff0c;网络攻击事件层出不穷&#xff0c;由此&#xff0c;如何保护网站安全成为每个网站所有者的重要议题。在下面的内容中&#xff0c;我们将探讨5种常见网络攻击类型及其防御方法&#xff0c;以帮…

SNETCracker--超级弱口令检查工具简介

一、简介 SNETCracker 超级弱口令检查工具是一款Windows平台的弱口令审计工具&#xff0c;支持批量多线程检查&#xff0c;可快速发现弱密码、弱口令账号&#xff0c;密码支持和用户名结合进行检查&#xff0c;大大提高成功率&#xff0c;支持自定义服务端口和字典。 二、SNE…

常见内网系统网络结构及nginx代理配置

系统网络结构图及nginx配置 1.系统网络结构图2.Nginx网络配置2.1请求从互联网区访问到内网区2.2 请求从内网访问互联网 1.系统网络结构图 传统公司服务部署网络都会分区&#xff0c;应用都部署在内网区&#xff0c;请求通过dmz区转出内网与互联网发生交互。 结构图详解&#…

springCloud集成activiti5.22.0流程引擎

springCloud集成activiti5.22.0流程引擎 点关注不迷路&#xff0c;欢迎再访&#xff01; 精简博客内容&#xff0c;尽量已行业术语来分享。 努力做到对每一位认可自己的读者负责。 帮助别人的同时更是丰富自己的良机。 小编最近工作需要涉及到流程&#xff0c;由于网络上5.22版…

CHARLS轻松发二区,只用了COX回归模型 | CHARLS CLHLS CFPS 公共数据库周报(4.3)...

零基础CHARLS发论文&#xff0c;不容错过&#xff01; 长期回放更新指导&#xff01;适合零基础&#xff0c;毕业论文&#xff0c;赠送2011-2020年CHARLS清洗后的数据全套代码&#xff01; CHARLS公共数据库 CHARLS数据库简介中国健康与养老追踪调查(China Health and Retireme…

C++初阶学习第三弹——类与对象(上)——初始类与对象

前言&#xff1a; 在前面&#xff0c;我们已经初步学习了C的一些基本语法&#xff0c;比如内敛函数、函数重载、缺省参数、引用等等&#xff0c;接下来我们就将正式步入C的神圣殿堂&#xff0c;首先&#xff0c;先给你找个对象 目录 一、类与对象是什么&#xff1f; 二、类的各…

ArtNeRF、Attention Control、Pixel is a Barrier、FilterPrompt

本文首发于公众号&#xff1a;机器感知 ArtNeRF、Attention Control、Pixel is a Barrier、FilterPrompt ArtNeRF: A Stylized Neural Field for 3D-Aware Cartoonized Face Synthesis Recent advances in generative visual models and neural radiance fields have greatly …

【笔试训练】day11

1.游游的水果大礼包 思路&#xff1a; 枚举。假设最后的答案是x个a礼包&#xff0c;y个b礼包&#xff0c;得到一个式子&#xff1a;ansa*xb*y 我们可以枚举x的数量&#xff0c;这样就能变相的把y的求出来。呃这就是鸡兔同笼问题嘛 x最大的范围是多少呢&#xff1f;也就是a礼…

【CouchDB 与 PouchDB】

CouchDB是什么 CouchDB&#xff0c;全名为Apache CouchDB&#xff0c;是一个开源的NoSQL数据库&#xff0c;由Apache软件基金会管理。CouchDB的主要特点是使用JSON作为存储格式&#xff0c;使用JavaScript作为查询语言&#xff08;通过MapReduce函数&#xff09;&#xff0c;并…

面试二十二、跳表SkipLists

跳表全称为跳跃列表&#xff0c;它允许快速查询&#xff0c;插入和删除一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(logn)。快速查询是通过维护一个多层次的链表&#xff0c;且每一层链表中的元素是前一层链表元素的子集&#xff08;见右边的示意图&…

day07 51单片机-18B20温度检测

18B20温度检测 1.1 需求描述 本案例讲解如何从18B20传感器获取温度信息并显示在LCD上。 1.2 硬件设计 1.2.1 硬件原理图 1.2.3 18B20工作原理 可以看到18B20有两根引脚负责供电&#xff0c;一根引脚负责数据交换。18B20就是通过数据线和单片机进行数据交换的。 1&#xf…

前端项目中使用插件prettier/jscodeshift/json-stringify-pretty-compact格式化代码或json数据

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、json代码格式化-选型二、json-stringify-pretty-compact简单试用三、prettier在前端使用四、查看prettier支持的语言和插件五、使用prettier格式化vue代码最终效果如图&#xff1a; ![在这里插入图片描述](https://im…

【ruoyi-vue】登录解析(后端)

调试登录接口 进入实现类可以有 验证码校验 登录前置校验 用户验证 验证码校验 通过uuid获取redis 中存储的验证码信息&#xff0c;获取后对用户填写的验证码数据进行校验比对 用户验证 1.进入控制器的 /login 方法 2.进入security账号鉴权功能&#xff0c;经过jar内的流…

python逆向基础流程(纯小白教程)

一&#xff0c;例题链接 NSSCTF | 在线CTF平台 二&#xff0c;文件特征 使用工具查看文件信息&#xff0c;发现是pyinsatller打包的exe文件&#xff0c;如果硬用ida分析成汇编或c语言根本摸清楚程序的逻辑&#xff0c;所以思路是反编译成py文件直接分析python代码 三&#xf…

【论文推导】基于有功阻尼的转速环PI参数整定分析

前言 在学习电机控制的路上&#xff0c;PMSM的PI电流控制是不可避免的算法之一&#xff0c;其核心在于内环电流环、外环转速环的设置&#xff0c;来保证转速可调且稳定&#xff0c;并且保证较好的动态性能。整个算法仿真在《现代永磁同步电机控制原理及matlab仿真》中已详细给出…

VUE项目使用.env配置多种环境以及如何加载环境

第一步&#xff0c;创建多个环境配置文件 Vue CLI 项目默认使用 .env 文件来定义环境变量。你可以通过创建不同的 .env 文件来为不同环境设置不同的环境变量&#xff0c;例如&#xff1a; .env —— 所有模式共用.env.local —— 所有模式共用&#xff0c;但不会被 git 提交&…

Clickhouse离线安装教程

https://blog.51cto.com/u_15060531/4174350 1. 前置 1.1 检查服务器架构 服务器&#xff1a;Centos7.X 需要确保是否x86_64处理器构架、Linux并且支持SSE 4.2指令集 grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 …

不墨迹,向媒体投稿不讲攻略,直接上方法

作为一名单位信息宣传员,我曾深陷于向媒体投稿的泥沼之中,饱尝了费时费力、审核严苛、出稿缓慢的苦涩,承受着领导急切期盼与自我压力交织的煎熬。然而,当我有幸接触到智慧软文发布系统,这一切困境如同阴霾散去,取而代之的是便捷流畅的投稿流程,以及领导满意、团队轻松的工作氛围…

Java Swing游戏开发学习24

内容来自RyiSnow视频讲解 这一节讲的是Scrolling Message, Leveling Up, Damage Calculation滚动消息&#xff0c;升级&#xff0c;伤害计算。 伤害计算 玩家与怪的战斗&#xff0c;玩家对怪的伤害值为攻击值减去怪的防御值。 int damage attack - gp.monster[i].defense; …