- 論壇徽章:
- 0
|
本人軟件出身,硬件不怎么會(huì),準(zhǔn)備在arm開(kāi)發(fā)板上驅(qū)動(dòng)ds18b20傳感器,這是網(wǎng)上找的單片機(jī)對(duì)DS18B20操作流程:
1、 復(fù)位:首先復(fù)位,由單片機(jī)給DS18B20單總線(xiàn)至少480uS的低電平信號(hào)。當(dāng)DS18B20接到此復(fù)位信號(hào)后則會(huì)在15~60uS后回發(fā)一個(gè)芯片的存在脈沖。
2、存在脈沖:在復(fù)位后,單片機(jī)將數(shù)據(jù)單總線(xiàn)拉高,在15~60uS后接收一個(gè)60~240uS的低電平信號(hào)存在脈沖。通信雙方達(dá)成了基本的協(xié)議,之后是單片機(jī)與DS18B20間的數(shù)據(jù)通信。如果復(fù)位低電平的時(shí)間不足或是單總線(xiàn)的電路斷路都不會(huì)接到存在脈沖,在設(shè)計(jì)時(shí)要注意意外情況的處理。
3、單片機(jī)發(fā)送ROM指令:雙方達(dá)成協(xié)議之后將進(jìn)行交流,ROM指令共有5條,一個(gè)工作周期發(fā)一條,ROM指令分別是讀ROM數(shù)據(jù)、指定匹配芯片、跳躍ROM、芯片搜索、報(bào)警芯片搜索。ROM指令為8位長(zhǎng)度,功能是對(duì)片內(nèi)的64位光刻ROM進(jìn)行操作。其主要目的是為了分辨一條總線(xiàn)上掛接的多個(gè)器件并作處理。
4、單片機(jī)發(fā)送存儲(chǔ)器操作指令:在ROM指令發(fā)送給18B20之后,接著(不間斷)發(fā)送存儲(chǔ)器操作指令。操作指令同樣為8位,共6條,分別是寫(xiě)RAM數(shù)據(jù)、讀RAM數(shù)據(jù)、將RAM數(shù)據(jù)復(fù)制到EEPROM、溫度轉(zhuǎn)換、將EEPROM中的報(bào)警值復(fù)制到RAM、工作方式切換。存儲(chǔ)器操作指令的功能是命令18B20工作,是芯片控制的關(guān)鍵。
5、執(zhí)行或數(shù)據(jù)讀寫(xiě):一個(gè)存儲(chǔ)器操作指令結(jié)束后進(jìn)行指令執(zhí)行或數(shù)據(jù)的讀寫(xiě),此操作視存儲(chǔ)器操作指令而定。如執(zhí)行溫度轉(zhuǎn)換指令則單片機(jī)必須等待18B20執(zhí)行其指令,一般轉(zhuǎn)換時(shí)間為500uS。如執(zhí)行數(shù)據(jù)讀寫(xiě)指令則需要嚴(yán)格遵循18B20的讀寫(xiě)時(shí)序來(lái)操作。
以下是參考其他人arm驅(qū)動(dòng)ds18b20的例子,看到讀溫度函數(shù)就不懂了,求助各位講解:
void tmreset (void)
{
s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C_GPIO_SFN(1));
gpio_set_value(S3C64XX_GPE(0), 1);
udelay(100);
gpio_set_value(S3C64XX_GPE(0), 0);
udelay(600);
gpio_set_value(S3C64XX_GPE(0), 1);
udelay(100);
s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C_GPIO_SFN(0));
}
void tmwbyte (unsigned char dat)
{
unsigned char j;
s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C_GPIO_SFN(1));
for (j=1;j<=8;j++)
{
gpio_set_value(S3C64XX_GPE(0), 0);
udelay(1);
if((dat&0x01)==1)
{
gpio_set_value(S3C64XX_GPE(0), 1);
}
else
{
}
udelay(60);
gpio_set_value(S3C64XX_GPE(0), 1);
udelay(15);
dat = dat >> 1;
}
gpio_set_value(S3C64XX_GPE(0), 1);
}
unsigned char tmrbyte (void)
{
unsigned char i,u=0;
for (i=1;i<=8;i++)
{
s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C_GPIO_SFN(1));
gpio_set_value(S3C64XX_GPE(0), 0);
udelay(1);
u >>= 1;
gpio_set_value(S3C64XX_GPE(0), 1);
s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C_GPIO_SFN(0));
if( gpio_get_value(S3C64XX_GPE(0))) u=u|0x80;
udelay(60);
}
return (u);
}
void DS18B20PRO(void)
{
unsigned char a,b;
tmreset();
udelay(420);
tmwbyte(0xcc);
tmwbyte(0x44);
mdelay(750);
tmreset ();
udelay(400);
tmwbyte (0xcc);
tmwbyte (0xbe);
a = tmrbyte ();
b= tmrbyte ();
sdata = a/16+b*16;
}
static ssize_t s3c6410_18b20_read(struct file *filp, char *buf, size_t len, loff_t *off)
{
DS18B20PRO();
*buf=sdata;
return 1;
}
目前是以下兩個(gè)問(wèn)題:
1.為什么原操作方法是:“首先復(fù)位,由單片機(jī)給DS18B20單總線(xiàn)至少480uS的低電平信號(hào)”,但是具體操作時(shí)先輸出了高電平信號(hào),并有延時(shí)(幾乎所有的操作都這樣)?
2.void tmwbyte (unsigned char dat)函數(shù)不理解,操縱方法是:“當(dāng)DS18B20接到此復(fù)位信號(hào)后則會(huì)在15~60uS后回發(fā)一個(gè)芯片的存在脈沖”,具體操作時(shí)函數(shù)內(nèi)為什么要有循環(huán)?以及函數(shù)的大體意思。
跪謝大神~~~~ |
|