免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 回復 發帖

CAN BUS筆記

CAN BUS收發
實驗50mS持續發送,自身可收到別人發送的訊息,實驗40mS也可以,30mS收不到
相關參數記錄 UART 115200,CAN 250K




CAN總線的採樣位和同步跳轉寬度

採樣位:對採樣動作進行設置的標誌位,採樣位可以設置爲多次或一次。串列傳輸速率較低時建議將採樣位設置爲一次,串列傳輸速率高時設置爲多次,串列傳輸速率高低以100kbps作爲分界。

同步跳轉寬度:用於相容不同串列傳輸速率的總線,除了本身設定的 串列傳輸速率,還能接收一個上下容差範圍內的串列傳輸速率。其設置爲SJW[1:0],計算公式爲tsjw = 系統時鐘 × (2×sjw1+sjw2+1)

例題:假設我SJA1000 CAN控制器所擁有的晶體頻率爲16MHz,系統時鐘Tscl爲6.25微妙,SJW.1同SJW.0都被置一,請求出同步跳轉寬度位域的時間是?

Tsjw = Tscl * ( 2*SJW.1 + SJW.0 + 1 )
= 6.25微妙 * (2+1+1)
= 6.25微妙 * 4
= 25微妙
同步跳轉寬度位域時間與總線串列傳輸速率上下限容差值關係爲:
總線下屆容差  <    總線串列傳輸速率      <      總線上限容差
1(Tbit +  Tsjw )   <   1/(Tbit)     <    1/(Tbit - Tsjw)
---------------------
採樣點:採樣點不能太靠前也不能太靠後,否則如果剛好處於一個位的上升沿或者下降沿區間,會造成識別錯誤,所以根據CIA105的規範,採樣點在87.5%左右比較合適。但是一般我們可根據實際情況選取75%~85%之間;
----------------------
CAN 2.0A-只規定了標準消息格式(擴展消息會被認為是錯誤)
CAN 2.0B active-能處理標準和擴展消息格式
CAN 2.0B passive-處理標準消息,忽略擴展消息

------------------------

*使用18F25K80 MCU 支援CANTX/CANRX,配合MCP2561(CAN物理層晶片)實現CAN BUS.通訊上由MCP2561的CANH與CANL和實際的CAN BUS做連接,MCU與MCP2561是彼此使用CANTX/CANR做溝通

*Recessive(1) 隱性 CANH與CANL同準位

*Dominant(0) 顯性 CANH與CANL不同準位(CANH往上增,CANL往下降)

*確認顯性為0或1,並確認顯性時CANTX是高態還是低態?


*MCU中的MODE0~2所代表的應用?
Mode 0:Legacy mode(傳統模式)
Mode 1:Enhanced Legacy mode with DeviceNet support  支援DeviceNet的增強行傳統模式
Mode 2:FIFO mode with DeviceNet support 支援DeviceNet的FIFO模式



*了解CAN 1.2,CAN2.0A,CAN2.0B Passive,CAN2.0B Active差異

*何謂DeviceNet?

*最高鮑率1Mb/s

*0-8字節數據長度?(確認只能傳送最高8byte?
CAN BUS資料封包1次只能傳8 BYTE資料,
針對大於8時必須進行資料切割與重組機制


*以下序列說明了在使用ECAN模組來發送或接收報文之
前,必須執行的初始化步驟。根據應用的需求,可以增
加或刪除一些步驟。
1. 初始化 RX 和 TX CAN 的 LAT 和 TRIS 位。
2. 確保 ECAN 模組處於配置模式。
3. 選擇 ECAN 工作模式。
4. 設置串列傳輸速率寄存器。
5. 設置篩檢程式和遮罩寄存器。
6. 將ECAN模組設置為正常模式或應用邏輯所需的
任何其他模式。


*CAN 模組支援以下框架類型:
標準資料幀,擴展資料幀,遠程幀,錯誤幀,超載幀接收
可否實作?其差異是資料格式上或是應用?
標準資料幀:ID為11bit報文
擴展資料幀:ID為29bit報文
遠程幀:要求符合ID的設備進行回傳資料,傳送需求遠程幀時資料段與長度都為0


*CANCON 控制暫存器
1xx = 請求配置模式
011 = 請求監聽模式
010 = 請求環回模式
001 = 禁止 / 休眠模式
000 = 請求正常模式
了解其差異

環回:主要用於開發,且訊號於MCU內部處理,不會傳出訊號.

禁止/休眠模式:CAN模塊暫停工作

監聽模式:可接收所有報文(包括帶有錯誤的報文),處於該狀態時模組不會發送任何報文,包括錯
誤標誌或應答信號。通過使用篩檢程式和遮罩器,可以僅
允許特定報文裝入接收寄存器;或者,也可以將篩檢程式
遮罩器設置為全零,以允許帶有任意識別字的報文通
過。此模式設備不屬於節點.

正常模式:在該模
式下,器件會主動監視所有匯流排報文並產生應答位和錯
誤幀等。




*CANSTAT 狀態暫存器,於設定完需求的模式後(CANCON暫存器設定),於CANSTAT暫存器中確認是否完成,若無則等待到完成.
000 = 請求正常模式OPMODE<2:0>:工作模式狀態位元 (1)
111 = 保留
110 = 保留
101 = 保留
100 = 配置模式
011 = 監聽模式
010 = 環回模式
001 = 禁止 / 休眠模式
000 = 正常模式


*發送資料(實測結果)
1.
2.使用CANSendMessage 函數(ID,BUFFER,資料長度)
3.確認TXB0CON.TXREQ~TXB2CON.TXREQ緩衝是否為空)
0若不為空則確認1,若1仍不為空則確認2,若2仍不為空則跳出程式
4.設置WIN暫存器切到快速存取區,之後直接使用快速存取暫存器(RXB0CON)

4.設置傳送優先等級00~11共4種 RXB0CON

5.設置報文格式(ID與標準格式或擴充格式)

6.設置是否為遠程幀RXB0DLC

7.將傳送資料塞入RXBnDm (m=0~7)

8.將TXBnCON.TXREQ設1,進行資料傳送


--------------------------------------------------------------------
*接收資料MASK運用
Masker 是指設為 "1" 的位元將會被檢查,如果 Masker 設為 0x000 就表示所有位元將不檢查,這時就算是設了 Filter 也沒用,所有的資料都會被收進來。

如果 masker 設為 0xFF0,代表 b0~b3 將不檢查,Filter 也將不管這四個位元值為何。 b4~b11 將會被檢查且須符合 Filter 裡 b4~b11 的設定值。例如: 此時 Filter 設為 0x3A0,那能被接收的 Message ID 的範圍為 0x3A0 ~0x3AF。 若 Masker Filter 設為 0x3FF,那能被接收的 Message ID 的就只有一個 0x3A0 。

Canbus ID過濾器和掩碼


CANBUS B幀由四個字節的標頭(包含29位標識符)組成,後跟最多8個數據字節。

接收節點將檢查該標識符以決定其是否相關(例如,等待ID 00001567的幀)。它可以通過軟件來實現(使用C if 或case 語句);
實際上,Canbus接口包含使用接收過濾器和掩碼值來過濾掉不需要的消息的固件,以執行此任務。

濾波器掩碼 用於確定將接收到的幀的標識符中的哪些位與濾波器進行比較

如果屏蔽位設置為零,則無論過濾器位的值如何,都將自動接受相應的ID位。

如果掩碼位設置為1,則將對應的ID位與過濾器位的值進行比較;如果它們匹配,則接受該幀,否則拒絕該幀。


例1.我們只接受ID為00001567(十六進制值)的幀

將過濾器設置為00001567,將遮罩設置為1FFFFFFF
當幀到達時,將其ID與過濾器進行比較,並且所有位都必須匹配;與ID 00001567不匹配的任何幀都將被拒絕


例2.我們只接受ID為00001560到0000156F的幀

將過濾器設置為00001560,將掩碼設置為1FFFFFF0
當幀到達時,將其ID與過濾器進行比較,除位0至3以外的所有位都必須匹配;任何幀,其他幀均被拒絕

例3.我們只接受ID為00001560至00001567的幀

將過濾器設置為00001560,將遮罩設置為1FFFFFF8
當幀到達時,將其ID與過濾器進行比較,除位0至2外的所有位都必須匹配;任何幀,其他幀均被拒絕


例子4.我們希望接受任何框架

將過濾器設置為0
將遮罩設為0

接受所有框架

實際上,Canbus接口往往具有許多過濾器和掩碼,因此可以接受ID的組合,例如,執行許多不同任務的模塊。

------------------------------------------------------------------

實驗mask=0 ,不在乎id為0或1
filter=1或0的結果


如果系統啟動期間僅有1個節點掛在匯流排上,此節點發出報文後,將得不到應答,檢查出錯誤並重複該報文,此時該節點可以變為錯誤認可節點,但不會因此關閉匯流排。

如果節點獨自在總線上並嘗試傳輸,會發生什麼情況?
答:當然,該節點將贏得仲裁,並樂於進行消息傳輸。但是當需要確認的時候……沒有節點會在ACK時隙內發送顯性位,因此發送器將檢測到ACK錯誤,發送錯誤標誌,將其發送錯誤計數器增加8並開始重新傳輸。這將發生16次;則發送器將變為被動錯誤。根據錯誤限制演算法中的特殊規則,如果節點是被動錯誤且錯誤是ACK錯誤,則不會進一步增加發送錯誤計數器。因此,該節點將繼續永遠傳輸,至少直到有人確認該消息為止。
不管發送ID為何,即使與第2節點ID不同也沒關係,只要總線上有2或以上節點就不會發生持續傳送訊息發生(因為無人回應)


------------------------------------------------------------------------------------------


typedef union {
    uint8_t msgfields;
    struct{
        uint8_t idType:1;       // 1 bit (Standard Frame or Extended Frame)
        uint8_t frameType:1;    // 1 bit (Data Frame or RTR Frame)
        uint8_t dlc:4;          // 4 bit (No of data bytes a message frame contains)
        uint8_t formatType:1;   // 1 bit (CAN 2.0 Format or CAN_FD Format)
        uint8_t brs:1;          // 1 bit (Bit Rate Switch)
    };
} CAN_MSG_FIELD;

typedef struct
{
    uint32_t msgId;          // 29 bit (SID: 11bit, EID:18bit)
    CAN_MSG_FIELD field;     // CAN TX/RX Message Object Control
    uint8_t *data;           // Pointer to message data
} CAN_MSG_OBJ;   



  msg.msgId = 0x1FFFF;
  msg.field.formatType = CAN_2_0_FORMAT;
  msg.field.brs = CAN_NON_BRS_MODE;
  msg.field.frameType = CAN_FRAME_DATA;
  msg.field.idType = CAN_FRAME_EXT;
  msg.field.dlc = DLC_8;
  msg.data = data;
返回列表