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