目录
三、在mach-smdk2440.c中添加对设备DS18B20的支持:
一、前言
=================================================================================================
因为Linux内核3.0自带Dallas 1-wires设备驱动,路径为:drivers/w1,所以在写驱动之前我首先进行了内核自带的单总线设备通用驱动移植(其实主要原因是温度传感器是我自己刚刚焊接上去的,想确认下其能否正常工作);此类驱动为Master/Slave模式:Master目录下为主控制器驱动,我们用到的是w1-gpio.c;Slave目录下是从设备驱动,我们使用的DS18B20属于温度传感器,所以使用w1_therm.c这个驱动。w1-gpio.c是单总线的IO操作方法,用于模拟单总线时序;w1_therm.c是DS18B20的内部操作方法(读写寄存器),和IO时序无关;我们可以将驱动结构看成是将“w1_therm”挂接到“w1-gpio”总线上,由w1-gpio控制w1_therm工作。
=====================================================================================
二、S3C2440 温度传感器ds18b20介绍
DS18B20是一种数字温度传感器,常用于嵌入式系统中。它采用1-wire总线协议,仅需要一个IO引脚即可完成数据的传输。DS18B20具有以下特点:
1.温度测量范围宽:-55℃~+125℃,精度可达0.5℃。
2.具有唯一的64位序列号,可以对多个DS18B20进行区分。
3.采用单总线数据传输协议,可以方便地与单片机进行通信。
4.体积小巧,封装形式多样,便于嵌入式系统的集成。
在使用DS18B20时,需要进行初始化和温度测量两个步骤。初始化时,需要发送一条复位指令,然后进行读取ROM指令,将DS18B20的序列号读取出来。温度测量时,需要发送启动转换指令,然后等待一段时间后进行读取温度指令,将温度值读取出来。控制DS18B20的操作可以通过单片机的软件实现,也可以使用专门的DS18B20驱动芯片来控制。
三、在mach-smdk2440.c中添加对设备DS18B20的支持:
[leiyuxing@centos6 linux-3.0]$ vim ./arch/arm/mach-s3c2440/mach-smdk2440.c
246 #include <linux/w1-gpio.h>//加入w1-gpio.h头文件,以使用w1_gpio_platform_data结构体
247 #if 1
248 /* DS1820B add by leiyuxing 2016.8.22*/
249 static void w1_enable_external_pullup(int enable)
250 {
251 if(enable)
252 s3c_gpio_setpull(S3C2410_GPG(0), S3C_GPIO_PULL_UP);
253 else
254 s3c_gpio_setpull(S3C2410_GPG(0), S3C_GPIO_PULL_NONE);
255 }
256
257
258 static struct w1_gpio_platform_data ds18b20_w1_gpio = {
259 .pin = S3C2410_GPG(0),
260 .is_open_drain = 0,
261 .enable_external_pullup = w1_enable_external_pullup,
262 };
263
264
265 static struct platform_device s3c_ds18b20_device ={
266 .name = "w1-gpio",
267 .id = -1,
268 .dev = {
269 .platform_data = &ds18b20_w1_gpio,
270 },
271 };
272 #endif
273 static struct platform_device *smdk2440_devices[] __initdata = {
........
........
288 &s3c_ds18b20_device,//add by leiyuxing 2016.8.22
};
切记!!一定要把 platform_device s3c_ds18b20_device 的这些结构体定义放在smdk2440_devices前,否则编译时会一直出现未声明的错误!!!
说明:设备名称是“w1-gpio”,这个和w1-gpio.c驱动中的驱动名称一致,才能注册这个设备驱动。通过FL2440开发板底板原理图可以看到只用到了GPG(0)这个管脚。
好了我们接下来配置内核,支持W1-gpio和ds18b20驱动:
重新编译内核并在开发板上更新内核,启动target,便可以测试温度了:
当时测试到温度的时候发现室温有点高,特意去看了下空调,原来空调制冷模式开错了,哈哈!
但做这么多真正的意义在于我焊接的温度传感器是可以工作的,排除了硬件上的问题我就可以放心地写代码测试了!!
四、S3C2440 温度传感器ds18b20问题及处理
-
硬件问题:需要检查ds18b20的线路是否接口正确,尤其是VCC、GND和数据线。当数据线接触不良或者接线错误时,会导致读取温度不准确。
-
软件问题:需要检查程序中读取ds18b20的引脚、协议是否正确,还要检查是否选择了正确的分辨率。如果代码写的有误,也会导致读取温度不准确。
-
电源问题:当ds18b20的电源电压不稳定或者电源不足时,也会导致读取温度不准确。需要检查电源是否满足要求,并且电源线路是否正确。
-
环境问题:当ds18b20暴露在极端环境中,如高温、低温或湿度较高的地方,也会导致读取温度不准确。需要将ds18b20放在适宜的环境中进行测试。
处理方法:
-
检查ds18b20的线路是否接口正确,重新连接线路。
-
检查程序中读取ds18b20的引脚、协议是否正确,检查选择的分辨率是否正确。
-
检查电源是否满足要求,并且电源线路是否正确。
-
将ds18b20放在适宜的环境中进行测试。
-
更换ds18b20芯片。如果以上方法都不能解决问题,可能是芯片本身存在问题,需要更换新的ds18b20芯片。