温湿度传感器si7020-a20 linux驱动编写

本文档详细介绍了如何为温湿度传感器si7020-a20编写Linux驱动,包括在atml 9x35平台上添加I2C设备节点,读取温湿度数据的步骤,以及内核模块的实现。通过驱动,应用程序可以从/dev/si7020设备文件读取湿度和温度数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    温湿度传感器在工业当中运用的比较广泛,通常用于检测设备所处环境的温度和湿度,温度过高,设备就有可能自动关机来保证设备不被烧坏。
我所采用的温湿度传感器是si7020-a20的芯片,I2C接口,地址如图描述:

也就是说,作为从机,si7020地址是0x40。另外,cpu采用atml 9x35,内核2.6.39。知道0x40这个地址之后,就要在板级文件board-sam9x5ek中添加相应的代码。</span>
找到ek_i2c_devices数组,在数组中添加如下代码:

[cpp]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. {  
  2.     I2C_BOARD_INFO("si7020", 0x40)  
  3. },  
    第一个是这个模块的名字,待会儿要和驱动中的.name 匹配。0x40是i2c地址。这个数组在ek_board_init函数中,通过i2c_register_board_info(0,ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices)); 注册进内核。
    新建makefile:
[cpp]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. obj-m := si7020.o  
  2. KDIR := ../linux-2.6.39  
  3. all:  
  4.         make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm  
  5. clean:  
  6.         rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order  

    然后新建驱动代码源文件si7020.c:
[cpp]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <linux/module.h>  
  2. #include <linux/types.h>  
  3. #include <linux/fs.h>  
  4. #include <linux/errno.h>  
  5. #include <linux/init.h>  
  6. #include <linux/cdev.h>  
  7. #include <asm/uaccess.h>  
  8. #include <linux/slab.h>  
  9. #include <linux/spi/spi.h>  
  10. #include <linux/miscdevice.h>  
  11. #include <linux/device.h>  
  12. #include <linux/io.h>  
  13. #include <asm/uaccess.h>  
  14. #include <linux/sched.h>  
  15. #include <linux/i2c.h>  
  16. #include <linux/delay.h>  
  17.   
  18. struct si7020_data{  
  19.     struct i2c_client *client;  
  20.     struct mutex lock;  
  21.     int buf[2];  
  22. };  
  23.   
  24. enum   
  25. {  
  26.     humidity,  
  27.     temperature,  
  28. };  
  29.   
  30. struct si7020_data *si7020;  
  31.   
  32. static void get_humi_val()  
  33. {  
  34.     unsigned int ret = 0;  
  35.     char tmp[2] = {0};  
  36.     //printk(KERN_INFO "enter get_humi_val\n");  
  37.   
  38.     i2c_smbus_write_byte(si7020->client, 0xf5);  
  39.     msleep(100);  
  40.     i2c_master_recv(si7020->client, tmp, 2);  
  41.     ret =((tmp[0]<<8)|tmp[1]);  
  42.     if(ret < 0)  
  43.         dev_err(&si7020->client->dev, "Read Error\n");  
  44.       
  45.     //printk(KERN_INFO "humi ret %d\n",ret);  
  46.     si7020->buf[humidity] = 125*ret/65536 - 6;  
  47.     if(si7020->buf[humidity] < 1)  
  48.         si7020->buf[humidity] = 0;  
  49.     if
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值