|
SPI實(shí)現(xiàn)單總線硬件控制器的理論研究和實(shí)現(xiàn)方法(菜農(nóng))
轉(zhuǎn)載本帖應(yīng)注明雁塔菜地: http://blog.ednchina.com/hotpower/
本例程未經(jīng)過(guò)實(shí)戰(zhàn)檢驗(yàn),若應(yīng)用于產(chǎn)品而出錯(cuò)者,菜農(nóng)不負(fù)任何責(zé)任,特此聲明.
菜農(nóng)HotPower@126.com 2008.2.29(四年等一回的日子) 于雁塔菜地
常用的單總線有2大類: 1-Wire和HDQ16
1-Wire和HDQ16都采用單線數(shù)據(jù)雙向通訊,特別是有些1-Wire系列器件甚至不需電源。
單總線和I2C,SPI相比接線簡(jiǎn)單,但時(shí)序要求很嚴(yán)格,一般采用IO模擬定時(shí)器輔助的方法.
做主機(jī)其缺點(diǎn)還不太明顯,若作為從機(jī)設(shè)備時(shí),IO模擬一般還需外部中斷協(xié)助.
最大特點(diǎn)是CPU占有率太高.甚至根本無(wú)法實(shí)現(xiàn).故雙機(jī)之間很少采用單總線通訊,
更別指望一主多從或多主多從通訊.
SPI實(shí)現(xiàn)單總線硬件控制器的接線方法很簡(jiǎn)單,為防止MOSI和單總線線與,可加二極管防止。
這樣加上拉電阻并短接MISO后即構(gòu)成單總線1-Wire或HDQ16.
一.單總線時(shí)序的研究:
單總線一般由3大時(shí)序構(gòu)成(簡(jiǎn)化):
1.總線復(fù)位
因?yàn)樵诳臻e時(shí),總線由上拉電阻拉到高電平,這個(gè)狀態(tài)很有"物理意義"---對(duì)從機(jī)充電.
此時(shí)從機(jī)實(shí)際是在等待或休眠狀態(tài),故必須要由外部喚醒.
為保證從機(jī)的喚醒和聯(lián)接的可靠及加速單線通訊的速率,故需長(zhǎng)時(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ù)操作過(guò)程的開(kāi)始.
由于總線被下拉導(dǎo)致通訊而阻塞(線與),故本時(shí)序只能作為主機(jī)操作過(guò)程.讀回?cái)?shù)據(jù)恒為0.
3.寫'1'
這個(gè)操作實(shí)際是寫'1'和讀'0'及讀'1'三個(gè)時(shí)序的綜合.
因?yàn)門XD的開(kāi)漏輸出,故單總線實(shí)際就是51的準(zhǔn)雙向IO. 只有在此期間方可讀取從機(jī)數(shù)據(jù)。
將寫'0'和寫'1'時(shí)序進(jìn)一步合并后,即可實(shí)現(xiàn)單總線讀寫一體化操作.
二.SPI時(shí)序的研究:
SPI時(shí)序很簡(jiǎn)單,一般都支持4種模式. 主要由SS,SCK的開(kāi)始電平狀態(tài)。
這里我們只能采用模式3即SPI空閑時(shí),SS,SCK都為高電平。
由于要將SPI做單總線控制器,故不需要SS,SCK這2個(gè)硬件信號(hào)!!!但軟件必須設(shè)置SPI主機(jī)模式3。
這對(duì)于MCS/ARM/DSP等基本類同。以下只以SPI模式3舉例,而且是在主機(jī)模式下。
1.協(xié)議開(kāi)始
SPI本身是以SS的跳變開(kāi)始一幀信號(hào)數(shù)據(jù)的傳輸?shù)模瑪?shù)據(jù)位數(shù)一般為8位和16位。
但有的DSP的McBSP可以在128位內(nèi)進(jìn)行選擇。
從以下的分析中可以看出位數(shù)和分辨率的關(guān)系的。
即SS下降沿啟動(dòng)SPI時(shí)序.
2.數(shù)據(jù)發(fā)送和接收
在SCK節(jié)拍下,SCK的下降沿一般發(fā)送數(shù)據(jù),在上升沿接收數(shù)據(jù)。也有在同邊沿收發(fā)數(shù)據(jù)的。
這要看具體硬件配置了.
3.協(xié)議結(jié)束
在傳送數(shù)據(jù)期間,SS跳變到初始狀態(tài)后都會(huì)強(qiáng)行結(jié)束一幀數(shù)據(jù)的收發(fā).
即SS上升沿結(jié)束SPI時(shí)序.
三.SPI和1-Wire/Hdq16的不同點(diǎn)和共同之處
從以上分析可以看出它們的共同之處:
1.空閑狀態(tài)到工作狀態(tài)的切換都是采用拉低總線來(lái)喚醒從機(jī)以實(shí)現(xiàn)同步.(起始位S)
2.每位數(shù)據(jù)都是由一定寬度的高低電平組成.并嚴(yán)格保持一定的有效時(shí)間.(數(shù)據(jù)串D0D1..DX)
3.釋放總線結(jié)束表示數(shù)據(jù)的結(jié)束.(停止位P)
最大的不同在于"每幀"SPI是多位(5,6,7,8等)數(shù)據(jù)位,而單總線為一位數(shù)據(jù).
當(dāng)SPI數(shù)據(jù)位串為連續(xù)的0或1時(shí),就可組成一位單總線的數(shù)據(jù)位!!!
即該方法是用數(shù)據(jù)位數(shù)的寬度來(lái)湊夠單總線的時(shí)序脈寬.
四.實(shí)現(xiàn)方法舉例(硬件只要MOSI,MISO)
SPI和UART的不同在于它沒(méi)有起始位和停止位的高低電平的固定變化.
故控制數(shù)據(jù)位模擬高低電平更加隨意.但分辨率可能受到損失(8位SPI數(shù)據(jù)不如UART的一幀高)
以下只分析單總線DS18B20的實(shí)現(xiàn)方法,HDQ16等其他單總線類同
由于單總線的復(fù)位/應(yīng)答周期需要480+480=960uS,故每位SPI數(shù)據(jù)需要960/8=120uS即BPS=8333
由于從機(jī)的應(yīng)答脈寬為60~240uS,故可能收不到應(yīng)答信號(hào),不過(guò)在UART的104uS實(shí)戰(zhàn)中是可以收到的.
總之SPI湊數(shù)算法簡(jiǎn)單,即單總線需要的周期/SPI-幀收發(fā)的位數(shù)
注意SPI一般先發(fā)送最高位.而UART一般先發(fā)送最低位.
例N=8)BPS=8300 T="120".48us (1-Wire復(fù)位/應(yīng)答時(shí)序)
0x0f ->00001111 即4T個(gè)0,4T個(gè)1 波形: 低電平481.92uS, 高電平481.92uS 周期:963.84uS
例N=8)BPS=133300 T="7".501us (1-Wire寫'1'/讀'0'/讀'1'時(shí)序)
0x7f ->01111111 即1T個(gè)0,7T個(gè)1 波形: 低電平7.501uS, 高電平52.507uS 周期:60.008uS
例N=8)BPS=133300 T="7".501us (1-Wire寫'0'時(shí)序)
0x01 ->00000001 即7T個(gè)0,1T個(gè)1 波形: 低電平52.507uS, 高電平7.501uS 周期:60.008uS
五.程序?qū)崿F(xiàn)方法(待續(xù))
5.單總線的協(xié)議硬件控制器終成正果
由于采用了SPI作為單總線的協(xié)議硬件控制器,故在傳送期間不怕中斷,時(shí)序不會(huì)錯(cuò)亂. |
|