📄 temperature.c
字号:
#include "temperature.h"#define DEBUG 1int tptMajor = 0;char tptName[] ="rpt";static unsigned char rbuf[9];//unsigned char temp;//-------------------------void scan_temp(void){ reset18b20(); // 发送复位脉冲 presence18b20(); // 等待DS18B20的应答 send(0xcc); // cc命令,忽略ROM send(0x44); // 启动温度转换// mdelay(800); // 等待转换结束 ?????????}void get_temp(void){ reset18b20(); // 发送复位脉冲 presence18b20(); // 等待DS18B20的应答 send(0xcc); // cc命令,忽略ROM send(0xbe); // 发送读温度命令,从DS18B20中读出9个字节 read(); reset18b20(); // 发送复位脉冲 presence18b20(); // 等待DS18B20的应答}//-----------------------------------------------------------void reset18b20(void) // 发送复位脉冲{ setoutputmode(); /* while(1) { regsDat &= 0xDF; //temp = 0; mdelay(500); mdelay(500); regsDat |= 0x20; //temp = 1; mdelay(500); mdelay(500); } */ //regsDat &= 0xFE; //temp = 0; regsDat &= 0xDF; //temp = 0; udelay(320); udelay(320); //regsDat |= 0x01; //temp = 1; regsDat |= 0x20; //temp = 1;}//-----------------------------------------------------------void presence18b20(void) // 等待DS18B20的应答{ int presence_loop; setinputmode();/* setinputmode(); while(1) if( !(regsDat & 0x20) )// 等待DS18B20的应答脉冲 break; while(1) { if( regsDat & 0x20) // 等待应答脉冲结束 { printk("ack over!\n"); break; } } udelay(35);*/ for(presence_loop = 0; presence_loop < 100000; presence_loop++) { if( !(regsDat & 0x01) )// 等待DS18B20的应答脉冲 //if( !(regsDat & 0x20) )// 等待DS18B20的应答脉冲 { break; } }// printk("loop count = %d",presence_loop); for(presence_loop = 0; presence_loop < 100000; presence_loop++) { if( regsDat & 0x01) // 等待应答脉冲结束 //if( regsDat & 0x20) // 等待应答脉冲结束 { //printk("have over!\n"); break; } }// printk("loop count = %d",presence_loop); udelay(35);}//-----------------------------------------------------------void send(unsigned char com_word) // 发送数据到ds18b20{ unsigned char i,j; j = com_word; setoutputmode(); for(i=0; i<8; i++) { //regsDat &= 0xFE; // give a low pulse before we send '1'. regsDat &= 0xDF; // give a low pulse before we send '1'. udelay(10); if (j & 0x01) { // send 1 //regsDat |= 0x01; regsDat |= 0x20; udelay(120); } else { // send 0 //regsDat &= 0xFE; regsDat &= 0xDF; udelay(120); //regsDat |= 0x01; regsDat |= 0x20; } j = j >> 1; }}//-----------------------------------------------------------void read(void) // 从DS18B20读取数据{ unsigned char i,j,rdata = 0; for(i=0; i<2; i++) { setoutputmode(); //regsDat |= 0x01; // 发送一个高 regsDat |= 0x20; // 发送一个高 for(j=0; j<8; j++) { //regsDat &= 0xFE; // 发送一个低脉冲 regsDat &= 0xDF; // 发送一个低脉冲 udelay(4); //regsDat |= 0x01; // 发送一个高,如果18b20检测到这个上升沿,将准备发送数据 regsDat |= 0x20; // 发送一个高,如果18b20检测到这个上升沿,将准备发送数据 udelay(2); rdata = rdata >> 1; setinputmode(); //if(regsDat & 0x01) if(regsDat & 0x20) rdata = rdata | 0x80; else rdata = rdata & 0x7f; udelay(4); setoutputmode(); //regsDat |= 0x01; regsDat |= 0x20; udelay(120); } rbuf[i] = rdata; rdata=0; }}//-----------------------------------------------------------void setoutputmode(void) // 设置输出模式{ regsSftClk = 0xAA; // open soft-ware clock. regsDevCfg |= 0x08000000; //regsDevCfg.GonK = 1; //regsDir |= 0x01; // output = _ _ _ _ _ _ _ 1 // debug //regsDir |= 0x0ff; // output = _ _ _ _ _ _ _ 1 regsDir |= 0x20; // output = _ _ _ _ _ _ _ 1}//-----------------------------------------------------------void setinputmode(void) // 设置输入模式{ regsSftClk = 0xAA; // open soft-ware clock. regsDevCfg |= 0x08000000; //regsDevCfg.GonK = 1; //regsDir &= 0xFE; // intput = _ _ _ _ _ _ _ 0 regsDir &= 0xDF; // intput = _ _ _ _ _ _ _ 0}//-----------------------------------------------------------struct file_operations tpt_fops={ NULL, NULL, tptRead, tptWrite, NULL, NULL, NULL,//tptIoctl, NULL, tptOpen, NULL, tptRelease, NULL, NULL, NULL, NULL, NULL, NULL, NULL};//-----------------------------------------------------------int tptOpen(struct inode* inode,struct file* filp){ int ret = 0; // 4-----分配私有数据------------------------ // 2-----监察设备状态------------------------ // 3-----识别次设备,有必要更新f_op---------- // 1-----增加设备计数------------------------ MOD_INC_USE_COUNT; // debug //setoutputmode();/* regsDir |= 0x00; // output = _ _ _ _ _ _ _ 1 gpiobint &= 0x0ff; while(1) { ret = regsDat; printk("b data = %x\n",ret); mdelay(500); mdelay(500); }*/ return ret;}//-----------------------------------------------------------int tptRelease(struct inode* inode,struct file* filp){ // 1.------释放分配的私有数据空间------------------------- // 2.------最后一次关闭设备------------------------------- // 3.------减少设备计数----------------------------------- // 4.------释放中断服务例程 MOD_DEC_USE_COUNT; return 0;}//-----------------------------------------------------------ssize_t tptRead(struct file *filp,char *buf,size_t count, loff_t *offp){ // 读温度数据 if(count == 10) { scan_temp(); return 0; } else if(count == 11) get_temp(); else return -1; copy_to_user(buf,rbuf,2); return 0;}//-----------------------------------------------------------ssize_t tptWrite(struct file *filp,const char *buf,size_t count,loff_t *offp){ return 0;}//**************************************************************************//**************************************************************************//**************************************************************************int init_module(void){ int result ; EXPORT_NO_SYMBOLS; result = register_chrdev(tptMajor,tptName,&tpt_fops); if( result < 0 ) { #ifdef DEBUG printk("温测 模块加载失败!\n"); #endif return result; } tptMajor = result;#ifdef DEBUG printk("温测 模块加载成功!\n"); printk("温测 主设备号 %d\n",tptMajor);#endif return 0;}//-----------------------------------------------------------void cleanup_module(void){ int nResult = unregister_chrdev(tptMajor,tptName); if( nResult < 0) { #ifdef DEBUG printk("温测 模块卸载失败!\n"); #endif return; }#ifdef DEBUG printk("温测 主设备号 %d\n",tptMajor); printk("温测 模块卸载成功!\n");#endif}MODULE_LICENSE("GPL");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -