[硬件驱动] CAN接口
CAN接口的介紹:
CAN總線可分為: 高速CAN,低速CAN ,單線CAN。
1.在速度方面高速CAN的傳輸速率(波特率)在125K~~1Mbps 。低速CAN的速率在125Kbps以下,低速CAN具更好的容錯性。單線CAN波特率在33K~~83Kbps.
2.這三種總線之間的最主要區別是物理層。以傳輸介質和線的數量說,單線CAN只需1條導線,低速容錯CAN和高速CAN通過雙絞線傳輸。雙絞線能有效減少外部電磁場對信息內部電平的干擾。?還有電平的邏輯的區別,定義邏輯為1稱作隱性,邏輯為0稱作顯性。這個區別可從以下幾種情況來說明:空閑時、有效時、睡眠時、喚醒時。這里假設收發器的電源為標準的5V和12V。?
當雙線CAN的兩個導線處于靜止狀態,兩個電平是一樣的,大約2.5伏,這個靜電平狀態就是隱形狀態,也稱隱性電平,也就是沒有任何干擾的時候的狀態稱為隱性狀態。當有信號修改時,CAN_High 線上的電壓值變高了,一般來說會升高至少1v;而CAN_Low 線上的電壓值會降低一個同樣值,也是1v。那么此時,CAN_High 就是 2.5v+1v=3.5v,它就處于激活狀態了。而CAN_Low 降為2.5v-1v=1.5v。
?
? 2.1 空閑時 (隱性位)
2.2 有效時 (顯性位)
2.3 睡眠時?
2.4 喚醒時?
3.CAN工作原理?
當 CAN 總線上的某一個節點或站發送數據時,它以報文的形式廣播給網絡中所有節點,對每個節點來說,無論數據是否是發給自己的,都對其接收。
每組報文開頭的11 位字符為標識符,定義了報文的優先級,這種報文格式成為面向內容的編制方案。同一系統中標識符是唯一的,當幾個站同時競爭總線讀取時,這種配置十分重要。
CAN 的報文格式有兩種,不同之處其實就是識別符長度不同,具有11 位識別符的幀稱為標準幀,而還有29 位識別符的幀為擴展幀,CAN 報文有以下4 個不同的幀類型。分別是:
(1) 數據幀:發送幀的節點設備,發送這個幀的目的是為了將某些消息傳遞給其他節點設備(最常用的幀類型)(幀中的仲裁域中的節點序號,是發送幀的節點設備本身的ID號。)
(2) 遠程幀:發送幀的節點設備,發送這個幀的目的是呼叫其他節點設備發送數據(較為常用的幀類型)(幀中的仲裁域的節點序號,是呼叫節點設備的ID號。數據域無內容。)
(3) 錯誤幀:因為通信中,因為各種因素干擾太多了,總會有可能產生錯誤,那么出現錯誤怎么辦?
 發送幀的節點設備,發送這個幀的目的是發現總線上的幀有錯誤,提醒總線上的其他設備。(比較少用)
(4) 過載幀:因為通信時,總是兩方或者多方通信,所以,發送數據的那一方不知道接收的那一方準備好了沒有,所以,過載幀的作用就是接收方(接收節點設備)告訴發送方,接收方還沒有準備好接收下一幀的工作,請緩一會。
(5)間隔幀:幀間隔就是上述四種幀的中間,都要有這個幀間隔,去隔離。以達到容易每個幀的類型。如果每個幀都直接連接在一起,變成一坨一坨的數據堆,接收方會非常難解讀的。所以幀間隔好比我們文字中的標點符號中的句號一樣,起到讓通信密文更加易懂。
/**
 ?* struct can_frame - basic CAN frame structure
 ?* @can_id:??CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition
 ?* @can_dlc: frame payload length in byte (0 .. 8) aka data length code
 ?*???????????N.B. the DLC field from ISO 11898-1 Chapter 8.4.2.3 has a 1:1
 ?*???????????mapping of the 'data length code' to the real payload length
 ?* @data:????CAN frame payload (up to 8 byte)
 ?*/
 struct can_frame {
 ?canid_t can_id;??/* 32 bit CAN_ID + EFF/RTR/ERR flags */
 ?__u8????can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */
 ?__u8????data[CAN_MAX_DLEN] __attribute__((aligned(8)));
 };
can_id定義如下所示,是一個無符號的32位整形數
typedef __u32 canid_t;
can_id數據組織形式如下
/*
 ?* Controller Area Network Identifier structure
 ?*
 ?* bit 0-28?: CAN identifier (11/29 bit)
 ?* bit 29?: error message frame flag (0 = data frame, 1 = error message)
 ?* bit 30?: remote transmission request flag (1 = rtr frame)
 ?* bit 31?: frame format flag (0 = standard 11 bit, 1 = extended 29 bit)
 ?*/
0-28位為標識符,如果是擴展幀,則高11位為標準ID
29位標識是數據幀還是錯誤消息
30位說明是否是遠程幀
31位說明是標準幀還是擴展幀。
以下是在處理can_frame時用到的掩碼和標識符:
/* special address description flags for the CAN_ID */
 #define CAN_EFF_FLAG 0x80000000U /* EFF/SFF is set in the MSB */
 #define CAN_RTR_FLAG 0x40000000U /* remote transmission request */
 #define CAN_ERR_FLAG 0x20000000U /* error message frame */
/* valid bits in CAN ID for frame formats */
 #define CAN_SFF_MASK 0x000007FFU /* standard frame format (SFF) */
 #define CAN_EFF_MASK 0x1FFFFFFFU /* extended frame format (EFF) */
 #define CAN_ERR_MASK 0x1FFFFFFFU /* omit EFF, RTR, ERR flags */
 ?
總結
以上是生活随笔為你收集整理的[硬件驱动] CAN接口的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 读John Stuart Mill的《功
- 下一篇: eclipse下载完成了但是打不开
