国产精品免费无遮挡无码永久视频-国产高潮视频在线观看-精品久久国产字幕高潮-国产精品99精品无码视亚

電子工程網(wǎng)

標(biāo)題: 通用異步串口實(shí)現(xiàn)單總線硬件控制器的研究和實(shí)現(xiàn)方法(菜農(nóng)) [打印本頁]

作者: hotpower    時(shí)間: 2009-4-2 22:27
標(biāo)題: 通用異步串口實(shí)現(xiàn)單總線硬件控制器的研究和實(shí)現(xiàn)方法(菜農(nóng))
通用異步串口實(shí)現(xiàn)單總線硬件控制器的研究和實(shí)現(xiàn)方法(菜農(nóng))

轉(zhuǎn)載本帖應(yīng)注明雁塔菜地: http://blog.ednchina.com/hotpower/
菜農(nóng)HotPower@126.com  2008.2.29(四年等一回的日子) 于雁塔菜地

常用的單總線有2大類: 1-Wire和HDQ16

1-Wire和HDQ16都采用單線數(shù)據(jù)雙向通訊,特別是有些1-Wire系列器件甚至不需電源。
單總線和I2C,SPI相比接線簡單,但時(shí)序要求很嚴(yán)格,一般采用IO模擬定時(shí)器輔助的方法.

做主機(jī)其缺點(diǎn)還不太明顯,若作為從機(jī)設(shè)備時(shí),IO模擬一般還需外部中斷協(xié)助.
最大特點(diǎn)是CPU占有率太高.甚至根本無法實(shí)現(xiàn).故雙機(jī)之間很少采用單總線通訊,
更別指望一主多從或多主多從通訊.

在TI的HDQ16數(shù)據(jù)文檔中,有文介紹用通用異步串口實(shí)現(xiàn)單總線硬件控制器.
但感覺只是理論推導(dǎo),實(shí)際有處重大(犯罪的)錯(cuò)誤,故感覺沒經(jīng)過實(shí)戰(zhàn)論證.
也懷疑作者故意隱瞞重點(diǎn)。
因?yàn)橄虏ㄌ芈蕿?7600,8位數(shù)據(jù)位,2個(gè)停止位時(shí),根本不可能產(chǎn)生190uS以上的低電平.
11*17.3uS=190.3uS不錯(cuò),可停止是高電平,故只能(1+8)*17.3uS=155.7uS.
即使使用的UART可以提供16位數(shù)據(jù),依然不能成立,為何看完此文后便知.

通用異步串口實(shí)現(xiàn)單總線硬件控制器的接線方法很簡單,為防止TXD和RXD線與,
TI采用非門加MOS管實(shí)現(xiàn)TXD漏極開路,菜農(nóng)采用二極管.結(jié)果一樣.

這樣加上拉電阻并短接RXD后即構(gòu)成單總線1-Wire或HDQ16.

一.單總線時(shí)序的研究:

單總線一般由3大時(shí)序構(gòu)成(簡化):
1.總線復(fù)位
因?yàn)樵诳臻e時(shí),總線由上拉電阻拉到高電平,這個(gè)狀態(tài)很有"物理意義"---對(duì)從機(jī)充電.
此時(shí)從機(jī)實(shí)際是在等待或休眠狀態(tài),故必須要由外部喚醒.

為保證從機(jī)的喚醒和聯(lián)接的可靠及加速單線通訊的速率,故需長時(shí)間的復(fù)位(拉低電平).
使其復(fù)位周期和數(shù)據(jù)周期拉大距離以便區(qū)分。

HDQ16的總線復(fù)位周期由190uS的低電平和45uS的高電平組成,在高電平期間不需從機(jī)應(yīng)答.
1-Wire的總線復(fù)位周期由480uS的低電平和480uS的高電平組成,在高電平期間可從機(jī)應(yīng)答.

1-Wire與HDQ16的最大不同在于總線復(fù)位周期里包含從機(jī)的應(yīng)答時(shí)序.

2.寫'0'
在空閑中總線被下拉(同步)就表示啟動(dòng)單總線的數(shù)據(jù)操作過程的開始.
由于總線被下拉導(dǎo)致通訊而阻塞(線與),故本時(shí)序只能作為主機(jī)操作過程.讀回?cái)?shù)據(jù)恒為0.

3.寫'1'
這個(gè)操作實(shí)際是寫'1'和讀'0'及讀'1'三個(gè)時(shí)序的綜合.
因?yàn)門XD的開漏輸出,故單總線實(shí)際就是51的準(zhǔn)雙向IO. 只有在此期間方可讀取從機(jī)數(shù)據(jù)。

將寫'0'和寫'1'時(shí)序進(jìn)一步合并后,即可實(shí)現(xiàn)單總線讀寫一體化操作.

二.串口時(shí)序的研究:
串口一般也由3大時(shí)序構(gòu)成:

1.總線復(fù)位(同步)
在空閑中總線被下拉(同步)就表示啟動(dòng)串口的數(shù)據(jù)操作過程的開始.即常說的"起始位S".
它也標(biāo)志了雙方異步過程的同步開始.雙方的計(jì)時(shí)器也開始計(jì)時(shí)工作.

2.讀寫數(shù)據(jù)
由于無硬件同步信號(hào),故雙方必須對(duì)每個(gè)數(shù)據(jù)位的周期進(jìn)行事先約定。數(shù)據(jù)串D0D1..DX

3.總線釋放(停止)
為了下次(幀)通訊,必須釋放總線。從而留給從機(jī)處理時(shí)間,寬度可調(diào).
MCU一半都有1,2位停止位,1.5位很少.即常說的"停止位P".

三.UART和1-Wire/Hdq16的不同點(diǎn)和共同之處
從以上分析可以看出它們的共同之處:
1.空閑狀態(tài)到工作狀態(tài)的切換都是采用拉低總線來喚醒從機(jī)以實(shí)現(xiàn)同步.(起始位S)
2.每位數(shù)據(jù)都是由一定寬度的高低電平組成.并嚴(yán)格保持一定的有效時(shí)間.(數(shù)據(jù)串D0D1..DX)
3.釋放總線結(jié)束表示數(shù)據(jù)的結(jié)束.(停止位P)

最大的不同在于"每幀"UART是多位(5,6,7,8等)數(shù)據(jù)位,而單總線為一位數(shù)據(jù).
當(dāng)UART數(shù)據(jù)位串為連續(xù)的0或1時(shí),就可組成一位單總線的數(shù)據(jù)位!!!
即該方法是用數(shù)據(jù)位數(shù)的寬度來湊夠單總線的時(shí)序脈寬.

四.實(shí)現(xiàn)方法舉例(起始位S為低電平,停止位P為高電平,N為數(shù)據(jù)位數(shù),B為停止為數(shù))

S=0,P=1,N=5,B=2)BPS=38400 T="34".6us (HDQ16復(fù)位時(shí)序)
0x00 ->S 00000    PP   即6T個(gè)0,2T個(gè)1 波形: 低電平207uS,  高電平69.2uS  周期:276.2uS

S=0,P=1,N=6,B=1)BPS=38400 T="34".6us (HDQ16復(fù)位時(shí)序)
0x00 ->S 000001   P    即6T個(gè)0,2T個(gè)1 波形: 低電平207uS,  高電平69.2uS  周期:276.2uS

S=0,P=1,N=8,B=2)BPS=38400 T="34".6us (HDQ16復(fù)位時(shí)序)
0x00 ->S 00000111 PP  即6T個(gè)0,5T個(gè)1 波形: 低電平207uS,   高電平173uS   周期:380.6uS

S=0,P=1,N=8,B=2)BPS=38400 T="34".6us (HDQ16復(fù)位時(shí)序)
0x00 ->S 00000000 PP  即9T個(gè)0,2T個(gè)1 波形: 低電平311.4uS, 高電平69.2uS  周期:380.6uS

S=0,P=1,N=8,B=2)BPS=57600 T="17".3us (HDQ16寫'1'/讀'0'/讀'1'時(shí)序)
0xfe ->S 01111111 PP  即2T個(gè)0,9T個(gè)1  波形: 低電平34.6uS, 高電平155.7uS 周期:190.3uS

S=0,P=1,N=8,B=2)BPS=57600 T="17".3us (HDQ16寫'0'時(shí)序)
0xc0 ->S 00000011 PP  即7T個(gè)0,4T個(gè)1  波形: 低電平121.1uS,高電平69.2uS  周期:190.3uS

S=0,P=1,N=8,B=1)BPS=9600 T="104us"  (1-Wire復(fù)位/應(yīng)答時(shí)序)
0xf0 ->S 00001111 P   即5T個(gè)0,5T個(gè)1  波形: 低電平520uS,  高電平520uS   周期:1040uS

S=0,P=1,N=6,B=1)BPS=115200 T="8".68us (1-Wire寫'1'/讀'0'/讀'1'時(shí)序)
0x3f ->S 111111   P  即1T個(gè)0,7T個(gè)1   波形: 低電平8.68uS, 高電平60.76uS 周期:69.44uS

S=0,P=1,N=6,B=1)BPS=115200 T="8".68us (1-Wire寫'0'時(shí)序)
0x3f ->S 000000   P  即7T個(gè)0,1T個(gè)1   波形: 低電平60.76uS, 高電平8.68uS 周期:69.44uS

五.程序?qū)崿F(xiàn)方法(以硬件調(diào)試通過的HDQ16為例)

1.結(jié)構(gòu)配置
LPC_Uart_Config_t Uart1Config = {BD57600, WordLength8, true, false, ParitySelOdd,
                  false, true, FIFORXLEV2, IER_RBR | IER_RLS,
                  POLLING_MODE,};
2.HDQ16復(fù)位時(shí)序
void HDQStart (void);

void HDQStart (void)
{
LPC_INT8U ch;
  Uart1Config.BaudRate = BD38400;//改寫波特率用于發(fā)送復(fù)位信號(hào)
  UART_Init(UART1);//串口初始化
  UART_PutCharByPolling(UART1, 0);//發(fā)送低電平311.4uS,  高電平69.2uS
  ch = UART_GetCharByPolling(UART1);//清空并監(jiān)測(cè)應(yīng)答或干擾信號(hào)等
  Uart1Config.BaudRate = BD57600;//改寫波特率用于發(fā)送接收數(shù)據(jù)
  UART_Init(UART1);//串口初始化
}

3.串口收發(fā)一體化程序代碼

LPC_INT8U HDQReadWriteByte (LPC_INT8U data)
{
LPC_INT8U i, ch;
LPC_INT8U value = 0;
  for (i = 0; i < 8; i ++)
  {
    if (data & 1)
    {
      UART_PutCharByPolling(UART1, 0xfe);//1
    }
    else
    {
      UART_PutCharByPolling(UART1, 0xc0);//0
    }
    ch = UART_GetCharByPolling(UART1);
    data >>= 1;
    value >>= 1;
    if (ch > 0xf8)
    {
      value |= 0x80;
    }
  }
  return value;
}

LPC_INT8U HDQReadWriteWord (LPC_INT16U data)
{
LPC_INT8U i, ch;
LPC_INT16U value;
  for (i = 0; i < 16; i ++)
  {
    if (data & 1)
    {
      UART_PutCharByPolling(UART1, 0xfe);//1
    }
    else
    {
      UART_PutCharByPolling(UART1, 0xc0);//0
    }
    ch = UART_GetCharByPolling(UART1);
    data >>= 1;
    value >>= 1;
    if (ch > 0xf8)
    {
      value |= 0x8000;
    }
  }
  return value;
}

4.讀寫應(yīng)用數(shù)據(jù)
LPC_INT16U  HDQReadWriteData (LPC_INT8U command)
{
//LPC_INT8U valuel;
//LPC_INT8U valueh;
LPC_INT16U value;
  HDQStart();//190us
  HDQReadWriteByte(command);
//  valuel = HDQReadWriteByte(0xff);//收發(fā)一體化程序讀要寫'1'
//  valueh = HDQReadWriteByte(0xff);//收發(fā)一體化程序讀要寫'1'
//  value = (valueh << 8) | valuel;
  value = HDQReadWriteWord(0xffff);//收發(fā)一體化程序讀要寫'1'
  return value;
}

5.單總線的協(xié)議硬件控制器終成正果
LPC_INT16U data = 0;
  data = HDQReadWriteData(0x1c);//讀用戶系列號(hào)

由于采用了串口作為單總線的協(xié)議硬件控制器,故在傳送期間不怕中斷,時(shí)序不會(huì)錯(cuò)亂.
這里主要列舉了菜農(nóng)本人硬件通過的HDQ16,近日將對(duì)1-Wire系列進(jìn)行硬件測(cè)試.

同理可知,SPI硬件模塊也作為單總線的協(xié)議硬件控制器,MOSI-TX,MISO-RX

作者: hotpower    時(shí)間: 2009-4-2 22:29
暈!!!看看那幾個(gè)搗蛋的
作者: Qiven20    時(shí)間: 2009-7-11 09:03





歡迎光臨 電子工程網(wǎng) (http://m.4huy16.com/) Powered by Discuz! X3.4