【通信協議】1-Wire 單總線

一、1-Wire相關介紹

  • 1-Wire由 美國Dallas(達拉斯) 公司推出
  • 採用單根信號線,既傳輸時鐘又傳輸數據,而且數據傳輸是雙向的
  • 單總線的數據傳輸速率一般爲16.3Kbit/s,最大可達142 Kbit/s,通常情況下采用100Kbit/s以下的速率傳輸數據
  • 1-Wire線端口爲漏極開路構或三態門的端口,因此一般需要加上拉電阻Rp,通常選用5K~10KΩ
  • 1-Wire數據傳輸的次序爲從最低位到最高位,與I2C不同

1.典型命令序列:

  • (1)初始化:單總線上所有傳輸過程都需要以初始化開始
  • (2)ROM命令:在主機檢測到從機的應答脈衝後,就可以發出ROM命令
  • (3)功能命令:每個單總線器件都有自己的專用指令,需要參照各自的數據手冊

2.典型電路圖:

在這裏插入圖片描述

二、1-Wire通信過程

1.初始化

在這裏插入圖片描述

  • 初始化過程 = 復位脈衝 + 從機應答脈衝
    • 主機通過拉低單總線480 ~ 960 us產生復位脈衝,然後釋放總線,進入接收模式。主機釋放總線時,會產生低電平跳變爲高電平的上升沿
    • 單總線器件檢測到上升沿之後,延時15 ~ 60 us,單總線器件拉低總線60 ~ 240 us來產生應答脈衝。主機接收到從機的應答脈衝說明單總線器件就緒,初始化過程完成。

2.寫操作

在這裏插入圖片描述

  • 寫間隙有兩種,包括寫0的時間隙和寫1的時間隙
    • 當數據線拉低後,在15 ~ 60 us的時間窗口內對數據線進行採樣。如果數據線爲低電平,就是寫0,如果數據線爲高電平,就是寫1。
    • 主機要產生一個寫1時間隙,就必須把數據線拉低,在寫時間隙開始後的15 us內允許數據線拉高(即在0~15us內釋放總線)。主機要產生一個寫0時間隙,就必須把數據線拉低並保持60 us

3.讀操作

在這裏插入圖片描述

  • 與寫操作一樣,讀操作至少需要60us,在兩次獨立的讀操作直接至少需要1us的恢復時間,所有的讀操作都是由主機拉低總線並保持至少1us後,再釋放總線開始
  • 讀操作,主機拉低總線1us,隨後釋放總線,若發送“1”,則保持總線爲高電平;若發送“0”,則拉低總線並在該週期結束後釋放總線

三、1-Wire程序(以DS18B20爲例)

DS18B20功能命令

在這裏插入圖片描述

命令 命令代碼
跳過ROM CCH
啓動轉換 44H
讀取暫存器 BEH
//DQ爲 單總線IO口
//復位初始化 若返回值爲0,則存在單總線設備
unsigned char DS18B20_RST(void)
{
	unsigned char Check;//檢測是否存在DS18B20單總線設備
	DQ = 0delay_us(480);
	DQ = 1;
	delay_us(60);
	Check = DQ; //若爲0,則接收到DS18B20應答信號
	delay_us(480);
	return Check;
}

//DS18B20寫一個字節
void DS18B20_Write_Byte(unsigned char data)
{
	unsigned char i = 0;
	for(i = 0;i < 8 ;i++)
	{

		DQ = 0;
		delay_us(1);
		DQ = data & 0x01;
		delay_us(60);
		data >>= 1;   
		DQ= 1;	//然後釋放總線,至少1us給總線恢復時間才能接着寫入第二個數值
		_nop_();_nop_();

	}
}

//DS18B20讀取一個字節
unsigned char DS18B20_Read_Byte(void)
{
	unsigned char i = 0;
	unsigned char temp = 0;
	for(i = 0;i < 8;i++)
	{
		_nop_();_nop_();
		DQ = 0;
		_nop_();_nop_();
		DQ = 1;//釋放總線
		_nop_();_nop_();
		temp = DQ << 7;//暫存放置在高位
		data |= temp;  //得到數據
		data >> 1;     //依次移位
		delay_us(60);
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章