與DS1620數(shù)字溫度傳感器IC的通信通過簡單的3線接口實(shí)現(xiàn)。此接口與摩托羅拉 SPI 之間存在許多差異?接口。然而,只需對(duì)DS1620進(jìn)行一些小的硬件和軟件修改,就可以有效地集成到基于SPI的系統(tǒng)中。
介紹
DS1620數(shù)字溫度計(jì)和恒溫器提供9位溫度讀數(shù),指示器件溫度。DS1620具有三路熱報(bào)警輸出,還可用作恒溫器。溫度設(shè)置和溫度讀數(shù)均通過簡單的1620線接口與DS3通信。
但是,許多摩托羅拉處理器上的SPI接口不能直接與DS3上的1620線接口通信。首先,進(jìn)出DS1620的數(shù)據(jù)流僅由一個(gè)引腳(DQ)多路復(fù)用,而SPI需要兩個(gè)獨(dú)立的信號(hào)(MOSI、MISO)。
其次,大多數(shù)SPI接口僅限于8位數(shù)據(jù)傳輸,使得DS9之間發(fā)送和接收1620位溫度讀數(shù)變得復(fù)雜。此外,DS1620的接口首先傳輸LSB,而SPI是MSB優(yōu)先的通信協(xié)議。
最后,RST條與CS-bar(片選)信號(hào)不同,因?yàn)镽ST條從傳輸(協(xié)議)的開始到所有數(shù)據(jù)傳輸?shù)慕Y(jié)束(例如,讀取溫度值時(shí)傳輸?shù)牡?位)必須很高。
盡管存在所有這些限制,我們還是可以找到一個(gè)相當(dāng)簡單的方案,允許SPI接口與DS1620通信。本應(yīng)用筆記介紹了該技術(shù)。
SPI 接口
圖1所示電路可通過與DS1620接口的SPI總線來控制數(shù)據(jù)流方向。如果需要,該電路可以集成到小型PAL中。
DIR信號(hào)的目的是在向DS1620發(fā)送數(shù)據(jù)或從DS1620接收數(shù)據(jù)之間進(jìn)行選擇。當(dāng)DIR為低電平時(shí),DS<>接收數(shù)據(jù);如果DIR很高,則SPI控制器正在讀取數(shù)據(jù)。
電阻是防止MOSI線路上的三態(tài)緩沖器輸出與DS1620的DQ引腳之間發(fā)生爭用所必需的,因?yàn)镈S1620收到READ命令協(xié)議后,其DQ引腳會(huì)在幾百納秒內(nèi)改變輸入到輸出的方向。這個(gè)時(shí)間太短,控制DIR信號(hào)的微處理器無法采取行動(dòng)。
在同一SPI總線上連接多個(gè)外設(shè)時(shí),當(dāng)DS1620無法訪問時(shí),MISO信號(hào)必須三態(tài),以防止與其他外設(shè)的MISO信號(hào)爭用。這就是為什么RST條形信號(hào)在確定數(shù)據(jù)方向的邏輯中是必要的。
注意,SPI時(shí)鐘直接連接到DS1620的CLK引腳。軟件必須注意SPI時(shí)鐘的極性和相位,以符合DS1620的CLK時(shí)序要求。
圖1.SPI 至 DS1620 接口電路。
界面軟件
雖然接口的硬件相對(duì)簡單,但SPI/DS1620接口的其余部分必須由軟件處理。以下示例給出了從DS1620讀取溫度的方法。該代碼段假設(shè)DS1620已經(jīng)初始化,配置寄存器設(shè)置正確,溫度轉(zhuǎn)換已經(jīng)啟動(dòng)。有關(guān)這些工作模式的詳細(xì)信息,請(qǐng)參見DS1620數(shù)據(jù)資料。
unsigned char mirror(unsigned char value) { unsigned char i; unsigned char value_mirrored = 0x00; for (i=0;i<=7;i++) { value_mirrored = value_mirrored | (((value>>i)&0x01)<<(7-i)); } return (value_mirrored); }
發(fā)送協(xié)議后,DIR從低電平變?yōu)楦唠娖剑ìF(xiàn)在表示讀取傳輸),因?yàn)镈S1620已準(zhǔn)備好發(fā)送9位值。請(qǐng)注意,RST 欄仍然很高。SPI控制器讀取9位值的前9位(LSB優(yōu)先)。軟件必須“鏡像”收到的字節(jié)。第 1620 位(后跟七個(gè)虛擬位)通過進(jìn)行另一個(gè) READ 傳輸并保持 DIR 和 RST 欄不變來拉出。當(dāng)收到第二個(gè)字節(jié)時(shí),軟件再次鏡像它并將RST條拉低,終止與DS<>的通信。
#define RST_bit 0 /* PB0 */ #define RST_port PORTB #define DIR_bit 1 /* PB1 */ #define DIR_port PORTB #define READ_TEMP_CMD 0xAA unsigned int read_temp(void) { unsigned char temp_value_lo; unsigned char temp_value_hi; DIR_port = DIR_port & ~(1<審核編輯:郭婷
-
溫度傳感器
+關(guān)注
關(guān)注
48文章
2892瀏覽量
155789 -
接口
+關(guān)注
關(guān)注
33文章
8447瀏覽量
150720 -
SPI
+關(guān)注
關(guān)注
17文章
1688瀏覽量
91202
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論