iTop4412之DS18B20驅動開發

2021-07-26 03:14:12 字數 4358 閱讀 6303

執行序列

通過單線匯流排埠訪問 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是常用的數字溫度感測器,其輸出的是數碼訊號,具有體積小,硬體開銷...