| 通用異步串口實(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 |




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