執行序列
通過單線匯流排埠訪問 ds18b20 的協議如下:
步驟1. 初始化
步驟2. rom 操作指令
步驟3. ds18b20 功能指令
步驟1. 初始化
主機首先發出乙個480-960微秒的低電平脈衝,然後釋放匯流排變為高電平,並在隨後的480微秒時間內對匯流排進行檢測,如果有低電平出現說明匯流排上有器件已做出應答,若無低電平出現一直都是高電平說明匯流排上無器件應答
作為從器件的ds18b20在一上電後就一直在檢測匯流排上是否有480-960微秒的低電平出現,如果有,在匯流排轉為高電平後等待15-60微秒後將匯流排電平拉低60-240微秒做出響應存在脈衝,告訴主機本器件已做好準備,若沒有檢測到就一直在檢測等待。
2.寫時序
寫週期最少為60微秒,最長不超過120微秒,寫週期一開始作為主機先把匯流排拉低1微秒表示寫週期開始,隨後若主機想寫0,則繼續拉低電平最少60微秒直至寫週期結束,然後釋放匯流排為高電平;若主機想寫1,在一開始拉低匯流排電平1微秒後就釋放匯流排為高電平,一直到寫週期結束。
而作為從機的ds18b20則在檢測到匯流排被拉低後等待15微秒然後從15μs到45μs開始對匯流排取樣,在取樣期內匯流排為高電平則為1,若取樣期內匯流排為低電平則為0。
3.讀時序
對於讀資料操作時序也分為讀0時序和讀1時序兩個過程,讀時序是從主機把單匯流排拉低之後,在1微秒之後就得釋放單匯流排為高電平,以讓ds18b20把資料傳輸到單匯流排上。ds18b20在檢測到匯流排被拉低1微秒後,便開始送出資料,若是要送出0就把匯流排拉為低電平直到讀週期結束;若要送出1則釋放匯流排為高電平。
主機在一開始拉低匯流排1微秒後釋放匯流排,然後在包括前面的拉低匯流排電平1微秒在內的15微秒時間內完成對匯流排進行取樣檢測,取樣期內匯流排為低電平則確認為0,取樣期內匯流排為高電平則確認為1,完成乙個讀時序過程,至少需要60μs才能完成。
ds18b20單線通訊功能是分時完成的,有嚴格的時序概念,如果出現序列混亂,1-wire器件將不影響主機,因此讀寫時序很重要。系統對ds18b20的各種操作必須按協議進行,根據ds18b20的協議規定,微控制器控制ds18b20完成溫度的轉換必須經過以下4個步驟:
1)每次讀寫前對ds18b20進行復位初始化。復位要求主cpu將資料線下拉500μs,然後釋放,ds18b20收到訊號後等待16μs-60μs左右,然後發出60μs-240μs的存在低脈衝,主cpu收到此訊號後表示復位成功。
2)傳送一條rom指令
3)傳送儲存器指令
1、讓ds18b20進行一次溫度轉換的具體操作如下:
a – 主機先做個復位操作;
b – 主機再寫跳過rom的操作(cch)命令;
c – 然後主機接著寫轉換溫度的操作指令,後面釋放匯流排至少1秒,讓ds18b20完成轉換操作。需要注意的是每個命令位元組在寫的時候都是低位元組先寫,例如cch的二進位制為11001100,在寫到匯流排上時要從低位開始寫,寫的順序是「0、0、1、1、0、0、1、1」,整個操作的匯流排狀態如圖所。
2、讀取ram的溫度資料,同樣,這個操作也要按照三個步驟:
a – 主機發出復位操作並接受ds18b20的應答(存在)脈衝;
b – 主機發出跳過對rom操作的命令(cch);
c – 主機發出讀取ram的命令(beh),隨後主機依次讀取ds18b20發出的從第0-第8,共九個位元組的資料。如果只想讀取溫度資料,那在讀完第0和第1個資料後就不再理會後面ds18b20發出的資料即可,同樣讀取資料也是低位在前,整個操作的匯流排狀態如圖所示。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*dev_t等的定義*/
#include
/*包含copy_to_user和copy_from_user的標頭檔案*/
#include
/*包含暫存器操作函式的標頭檔案*/
#include
/*延時定義*/
#include
/*包含函式device_create 結構體class等標頭檔案*/
#include
/*錯誤診斷和輸出需要的標頭檔案*/
#include
#define gpa0con 0x1140_0000
//gpa0con暫存器的實體地址
#define gpa0dat 0x1140_0004
//gpa0dat暫存器的實體地址
#define ds18b20_io (exynos4_gpa0(7))
static
int *gpa0con;
static
int *gpa0dat;
struct cdev cdev;
dev_t devno;
void ds18b20_reset(void)
else*/
}/*寫乙個位元組*/
/*寫「1」時隙:
保持匯流排在低電平1微秒到15微秒之間
然後再保持匯流排在高電平15微秒到60微秒之間
理想狀態: 1微秒的低電平然後跳變再保持60微秒的高電平
寫「0」時隙:
保持匯流排在低電平15微秒到60微秒之間
然後再保持匯流排在高電平1微秒到15微秒之間
理想狀態: 60微秒的低電平然後跳變再保持1微秒的高電平
*/void write_data (unsigned
char dat)
gpio_set_value(ds18b20_io,1);
}/*讀乙個位元組*/
/* 讀「1」時隙:
若匯流排狀態保持在低電平狀態1微秒到15微秒之間
然後跳變到高電平狀態且保持在15微秒到60微秒之間
就認為從ds18b20讀到乙個「1」訊號
理想情況: 1微秒的低電平然後跳變再保持60微秒的高電平
讀「0」時隙:
若匯流排狀態保持在低電平狀態15微秒到30微秒之間
然後跳變到高電平狀態且保持在15微秒到60微秒之間
就認為從ds18b20讀到乙個「0」訊號
理想情況: 15微秒的低電平然後跳變再保持46微秒的高電平
*/unsigned
char read_data(void)
return val;
}/*開啟檔案函式*/
static
int ds18b20_open(struct inode *inide,struct file *flip)
printk(kern_emerg "open ds18b20\n");
return0;}
/*讀檔案函式*/
static ssize_t ds18b20_read(struct file *flip,char __user *buff,size_t count,loff_t *f_ops)
static
int ds18b20_release(struct inode *inode, struct file *filp)
static
struct file_operations ds18b20_ops=;
static
int __init first_init(void)
static
void __exit first_exit()
module_init(first_init);
module_exit(first_exit);
module_license("dual bsd/gpl");
使用者測試程式
#include //標準輸入輸出
#include //open和creat函式需要的標頭檔案
#include //open和creat函式需要的標頭檔案
#include //open和creat函式需要的標頭檔案
#include //close,read,write函式需要的標頭檔案
#include //ioctl函式需要的標頭檔案
int main()
else
}close(fd);
return
0;}
itop 4412之裝置註冊
1.裝置註冊需要用到結構體 2.裝置註冊流程 ifdef config led ctl struct platform device s3c device led ctl endif config led ctl bool enable led config default y help enabl...
iTop4412驅動開發之九 I2C應用程式
第一種方式 當主機板外接i2c裝置時,可直接使用cpu的i2c介面卡,在應用層即可直接控制裝置。include printf include exit include strlen bzero include include include include include include inclu...
51微控制器之DS18B20
一文讀懂ds18b20溫度感測器及程式設計 對於新手而言,ds18b20基本概念僅做了解,最重要的是利用微控制器對ds18b20進行程式設計,讀取溫度資訊,並把讀取到的溫度資訊利用數碼管,lcd1602或者上位機進行顯示 ds18b20是常用的數字溫度感測器,其輸出的是數碼訊號,具有體積小,硬體開銷...