用到C8051F500的CAN總線,雖然有F500的CAN總線相關官方代碼,但是由于對CAN總線的協(xié)議不太了解,故先對CAN總線做一個深入認識。
首先,從CAN總線的背景應用分析:基于CAN的監(jiān)控系統(tǒng)包括以下幾個部分:
(1)上位PC機收集總線上傳輸?shù)乃行畔?對系統(tǒng)的運行狀態(tài)進行監(jiān)控,檢測所有設備的運行參數(shù)的調(diào)整及越限時的聲光報警等功能。并通過CAN接口卡接入網(wǎng)絡之中。
(2)智能測控單元(下位機系統(tǒng))包括智能傳感器、智能執(zhí)行器和智能控制器等,它們被安裝在測控現(xiàn)場,用于直接獲取現(xiàn)場設備的參數(shù)或者執(zhí)行相應操作和功能。
總結(jié):此次的CAN總線背景需求是為了解決一個小型局域網(wǎng)內(nèi)的上位機與下位機的通信,上位機需要全稱監(jiān)視現(xiàn)場檢測的節(jié)點的所有信息,并能對意外情況作出及時的處理。而CAN總線在當中只不過是對上下微機起到一個數(shù)據(jù)傳遞的作用,只是基于CAN總線的數(shù)據(jù)傳遞能保證數(shù)據(jù)傳輸?shù)目垢蓴_性和穩(wěn)定性。
第二部分,對CAN總線的工作流程的認識:
CAN處理器有32個消息對象,可以配置為發(fā)送或者接收數(shù)據(jù)。輸入數(shù)據(jù),消息對象,標識掩碼存儲在CAN的消息RAM中。所有數(shù)據(jù)發(fā)送和接受過濾的協(xié)議處理全部由CAN控制器完成,不用單片機干預。CAN寄存器和消息處理器為CAN控制器和單片機之間提供數(shù)據(jù)傳送和狀態(tài)通知的接口。也就是說,單片機與CAN總線的通信是通過消息處理器以及CAN的寄存器來通信的。單片機不直接跟CAN總線進行通信。其中,消息處理器與單片機的通信方式是中斷申請的方式。(或許存在查詢方式)。常用的訪問寄存器有CAN的控制寄存器,CAN的測試寄存器,CAN的狀態(tài)寄存器等。
第三部分:CAN的工作流程
3-1:軟件的初始化
可以通過CAN的控制寄存器的Init位來對CAN總線進行初始化,初始化之后,總線處于空閑狀態(tài),所有在CAN總線上傳輸?shù)南⒍紝⒈煌V埂AN總線的輸出CAN_TX位是recessive隱性電平。設置Init位不會改變已經(jīng)設置的寄存器的值。
CPU需要設置位定時寄存器和每個消息對象來對CAN控制器進行初始化。如果不需要一個消息對象做控制基本模式(即直接控制模式,不經(jīng)過CAN的RAM直接到CPU接口),只需將其MsgVal(消息有效位)設置為無效即可。否則,全部消息對象將被初始化。
初始化CAN控制器一般步驟如下:
1,將SFAPAGE寄存器設置為CAN0_PAGE;
2,將CAN0CN寄存器中的INIT和CCE位置高;
3,設置位定時寄存器和BRP擴展寄存器中的時序參數(shù);
4,舒適化每個消息對象或?qū)⑵銶sgVal設置為NOT VALID;
5,將INIT位清零。
3-2:CAN 消息傳輸
一旦CAN初始化完成之后,CAN的核心變保持和CAN總線同步并開始消息傳輸,在通過了消息處理器過濾之后,接受到的消息將被儲存到適當?shù)南ο笾?。所有的消息都被存在消息對象中,包括所有的仲裁位,DLC和8個數(shù)據(jù)字節(jié)。CPU可以在任何適合通過接口寄存器對消息進行讀和寫的操作。CPU可以對要傳輸?shù)臄?shù)據(jù)進行更新,如果有消息對象中部分消息長期存在,這時只要對數(shù)據(jù)字節(jié)進行更新,便可通過設置TxRqst(發(fā)送控制位)和NewDat(新數(shù)據(jù)位)來開始傳輸。如果多個傳輸?shù)南⒈环峙浣o同一個消息對象,所有的消息對象需要在請求消息的傳輸前進行設置。
3-3: 出錯自動重傳
3-4:測試模式
通過將CAN控制寄存器中的Test設為1,進入測試模式。在測試模式下,測試寄存器中的Tx1,Tx0,LBaxk,Silent以及Basic位均是科協(xié)的。Rx位見識引腳CAN_RX的狀態(tài),并且本身只能讀。Test置零后,測試寄存器所有功能被禁止。
3-5:沉默模式
3-6:會送模式
這個模式主要用作自我檢測使用。為了同外部磁極保持獨立,CAN核在會送模式下忽略確認錯誤。在這個模式下,CAN核在Tx輸出和Rx輸入之間實施內(nèi)部反饋。CAN核并不關心CAN_RX引腳上的實際值。
3-7:會送和沉默模式的結(jié)合
3-8:基本模式
若把測試寄存器中的Basic位設為1,CAN核便工作在基本模式下。在這個模式下,CAN模塊在沒有消息存儲器的情況下工作,即不用消息隊列暫存交換的數(shù)據(jù)。在基本模式下,需要用到IF1和IF2命令請求寄存器。
IF1寄存器用作傳輸緩存。當IF1寄存器的Busy寫1時,IF1寄存器中的內(nèi)容被請求進行傳輸。將Busy位設置為1可以將IF1寄存器鎖定,表明傳輸將要進行。一旦總線空閑,IF1寄存器就被裝入CAN核的移位寄存器并開始進行傳輸。傳輸完成以后,Busy位被置零,IF1寄存器解除鎖定狀態(tài)。當IF1寄存器處于鎖定狀態(tài),可以在任何時間通過將IF1寄存器中的Busy位復位來放棄將要進行的傳輸。
IF2寄存器用作接收緩存。在接收到消息以后,移位寄存器中的內(nèi)容在不需要任何過濾的情況下存入IF2寄存器,另外,在消息傳輸期間,IF2寄存器可以監(jiān)視移位寄存器中的當前內(nèi)容。每次可通過將IF2寄存器中的Busy位置高來初始化對消息對象的讀操作。而移位寄存器中的內(nèi)容被存入IF2寄存器中。
在基本模式下,不能取得消息對象相關的控制和狀態(tài)位以及IFx命令掩碼寄存器的控制位的值。命令請求寄存器的消息數(shù)目也無法求的。IF2消息控制寄存器的NewDat位和MsgLst保持他們的功能。DLC3-0會顯示收到的DLC,其他的控制位會被視為0。在基本模式下準備輸出位CAN_WAIT_B無效。
3-9: 對CAN_TX引腳的軟件控制
CAN的傳輸引腳CAN_TX有四個可用的輸出功能。除了它默認功能連續(xù)數(shù)據(jù)輸出外,它能驅(qū)動CAN采樣信號去見識CAN核的位定時。而且它還能驅(qū)動持續(xù)的顯性值或者隱性值。將最后兩個功能與刻度CAN接受引腳結(jié)合,用于檢驗CAN總線的物理層。
通過設置測試寄存器的Tx1和Tx0位,可以對CAN_TX引腳的輸出模式進行選擇。