IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> RK3568读取DS18B20温度(linux驱动DS18B20) -> 正文阅读

[C++知识库]RK3568读取DS18B20温度(linux驱动DS18B20)

gpio模拟单总线驱动DS18B20读取温度

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/slab.h>
#include <linux/device.h>
#include <linux/io.h>
#include <linux/delay.h>
#include <linux/of_gpio.h>
#include <linux/gpio.h>
#include <linux/uaccess.h>
#include <asm/uaccess.h>
#define gpionum      30   //gpio0
#define HIGH 1
#define LOW 0
//定义DS18B20ROM指令
#define    DS18B20_ReadROM        0x33    //读ROM
#define    DS18B20_MatchROM       0x55    //匹配ROM
#define    DS18B20_SkipROM        0xCC    //跳过ROM
#define    DS18B20_SearchROM      0xF0    //搜索ROM
#define    DS18B20_AlarmROM       0xEC    //报警搜索
//定义DS18B20存储器操作命令
#define    DS18B20_WriteSCR       0x4E    //写暂存存储器
#define    DS18B20_ReadSCR        0xBE    //读暂存存储器
#define    DS18B20_CopySCR        0x48    //复制暂存存储器
#define    DS18B20_ConvertTemp    0x44    //温度变换
#define    DS18B20_RecallEP       0xB8    //重新调出
#define    DS18B20_ReadPower      0xB4    //读电源
#define DEVICE_NAME  "DS18B20"    // 设备名称   
typedef unsigned char U8;
typedef unsigned short U16;
static int DS18B20_Major = 0;           //主设备号 
U16 temp;
U8 DS18B20_ID[8] = {0};
U8 DS18B20_Init(void)
{  
    gpio_direction_output(gpionum,HIGH);
    gpio_set_value(gpionum, LOW);
    udelay(700);
    gpio_set_value(gpionum, HIGH);
    udelay(4);
    gpio_direction_input(gpionum);
    udelay(100);
    return 0;

}
u8 DS18B20_ReadBit(void)   
{
    U8 dat;
    gpio_direction_output(gpionum,HIGH);
    gpio_set_value(gpionum, LOW);
    udelay(2);
    gpio_set_value(gpionum, HIGH); //add
    gpio_direction_input(gpionum);
    udelay(10);
    if(gpio_get_value(gpionum)!=0)
        dat=1;
    else
        dat=0;
    gpio_direction_output(gpionum,HIGH);
    gpio_set_value(gpionum, HIGH);//add
    udelay(50);
    return (dat);
}
U8 DS18B20_ReadByte(void)  
{
    U8 i,j,dat;
    dat=0;
    for(i=1;i<=8;i++)
    {
        j=DS18B20_ReadBit();
        dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
    }
    return(dat);
}
void DS18B20_WriteByte(U8 dat)
{
    U8 j;
    U8 testb;
    gpio_direction_output(gpionum,HIGH);
    for(j=1;j<=8;j++){
        testb=dat&0x01;
        dat=dat>>1;
        if(testb) {
            gpio_set_value(gpionum, LOW);
            udelay(8);
            gpio_set_value(gpionum, HIGH);
            udelay(50);
        }
        else{
            gpio_set_value(gpionum, LOW);
            udelay(90);
            gpio_set_value(gpionum, HIGH);
            udelay(8);
        }
    }
}
void DS18B20_ReadID(void)
{
    udelay(1);
    DS18B20_Init();
    DS18B20_WriteByte(DS18B20_ReadROM);
    DS18B20_ID[0] = DS18B20_ReadByte();
    DS18B20_ID[1] = DS18B20_ReadByte();
    DS18B20_ID[2] = DS18B20_ReadByte();
    DS18B20_ID[3] = DS18B20_ReadByte();
    DS18B20_ID[4] = DS18B20_ReadByte();
    DS18B20_ID[5] = DS18B20_ReadByte();
    DS18B20_ID[6] = DS18B20_ReadByte();
    DS18B20_ID[7] = DS18B20_ReadByte();
}
void DS18B20_Match(void)

{
    DS18B20_WriteByte(DS18B20_MatchROM);
    DS18B20_WriteByte(DS18B20_ID[0]);
    DS18B20_WriteByte(DS18B20_ID[1]);
    DS18B20_WriteByte(DS18B20_ID[2]);
    DS18B20_WriteByte(DS18B20_ID[3]);
    DS18B20_WriteByte(DS18B20_ID[4]);
    DS18B20_WriteByte(DS18B20_ID[5]);
    DS18B20_WriteByte(DS18B20_ID[6]);
    DS18B20_WriteByte(DS18B20_ID[7]);
}
void DS18B20_TmpChange(void)

{
    while(DS18B20_Init());
    udelay(100);/*delay(1);*/
    DS18B20_WriteByte(DS18B20_SkipROM);  // address all drivers on bus
    DS18B20_WriteByte(DS18B20_ConvertTemp);  //  initiates a single temperature conversion
}
u16 DS18B20_Temperature(void)
{
    U8 a,b;
    while(DS18B20_Init());
    udelay(100);
    DS18B20_WriteByte(DS18B20_SkipROM);
    DS18B20_WriteByte(DS18B20_ReadSCR);
    udelay(4);
    a=DS18B20_ReadByte();
    b=DS18B20_ReadByte();
    temp=b;
    temp<<=8;             //two byte  compose a int variable
    temp=temp|a;
    return temp;
}
static int RK3568_ds18b20_open(struct inode *inode, struct file *file)

{
    //printk("RK3568-DS18B20 Driver Open is Called!\n");
    DS18B20_TmpChange();
    mdelay(1000);
    DS18B20_Temperature();
    DS18B20_TmpChange();
    mdelay(1000);
    DS18B20_Temperature();
    return 0;

}
static int RK3568_ds18b20_release(struct inode *inode, struct file *file)
{
    printk("RK3568-DS18B20 Driver Release Called!\n");
    return 0;

}
ssize_t RK3568_ds18b20_read(struct file *filp, char *buf, size_t count, loff_t *f_pos)

{
	unsigned int ret;
    u16 ds18b20_val;
    DS18B20_TmpChange();
    mdelay(500);
    ds18b20_val =DS18B20_Temperature();
	printk("DS18B20 Temperature=%u\r\n",ds18b20_val);	//精度0.0625 
    ret=copy_to_user(buf, &ds18b20_val, sizeof(ds18b20_val));
	if(!ret) return ret;
    return 0;
}
static struct file_operations RK3568_ds18b20_fops =
{
    .owner  =   THIS_MODULE,
    .open   =   RK3568_ds18b20_open,
    .release =  RK3568_ds18b20_release,
    .read   =   RK3568_ds18b20_read,
};
static struct class *ds18b20_class;
static int __init RK3568_ds18b20_init(void)
{
    printk("RK3568 DS18B20 DRIVER MODULE INIT\n");
    DS18B20_Init();  //DS18B20初始化
    DS18B20_Major = register_chrdev(0, DEVICE_NAME, &RK3568_ds18b20_fops);
    if (DS18B20_Major < 0)
    {
        printk(DEVICE_NAME " can't register major number\n");
        return DS18B20_Major;
    }
    printk("register RK3568-DS18B20 Driver OK! Major = %d\n", DS18B20_Major);
    ds18b20_class = class_create(THIS_MODULE, DEVICE_NAME);
    if(IS_ERR(ds18b20_class))
    {
        printk("Err: failed in RK3568-DS18B20 class. \n");
        return -1;
    }
    device_create(ds18b20_class, NULL, MKDEV(DS18B20_Major, 0), NULL, DEVICE_NAME);
    printk(DEVICE_NAME " initialized\n");
    return 0;

}
static void __exit RK3568_ds18b20_exit(void)
{
    printk("RK3568 DS18B20 DRIVER MODULE EXIT\n");
    unregister_chrdev(DS18B20_Major, DEVICE_NAME);
    device_destroy(ds18b20_class, MKDEV(DS18B20_Major, 0));
    class_destroy(ds18b20_class);
}
module_init(RK3568_ds18b20_init);
module_exit(RK3568_ds18b20_exit);
MODULE_AUTHOR("pang");    
MODULE_DESCRIPTION("RK3568 DS18B20 Driver"); 
MODULE_LICENSE("GPL");
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:09:20  更:2022-04-27 11:09:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 0:55:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码