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