CAN總線原理詳解

一、什麼是CAN總線?

CAN(Controller Area Network)控制器局域網,是一種基於串行異步通信的總線標準。在汽車、工業領域等廣泛應用。CAN總線的結構是由多個節點組成的網絡。節點通過總線進行數據和控制信息的交換。在CAN總線中,每個節點都可以發送和接收信息。

二、CAN總線的工作原理

CAN總線採用分布式控制方式,節點之間相互獨立,不存在主從關係。在通信過程中,一個節點將信息發送到總線上,其他節點可以接收到這個信息。CAN總線採用CSMA/CD(載波監聽多路接入/碰撞檢測)技術,即在發送數據前先監聽總線,如果沒有其他節點正在使用總線,就可以發送數據;如果多個節點同時發送數據,就會發生碰撞。碰撞檢測機制可以檢測到碰撞,並在一段時間內重新嘗試發送。

三、CAN總線的幀格式

CAN總線數據幀可以分為標準幀和擴展幀,最長為8個字節。CAN總線幀可以包含以下幾個組成部分:

  • 起始位(SOF):表示一個幀的開始。
  • 標識符(ID):識別一個幀的唯一標誌,用於區分不同的節點之間的信息。
  • 遠程傳輸請求(RTR):用於請求其他節點發送數據。
  • 數據長度碼(DLC):定義數據幀中的有效數據長度。
  • 數據(Data):包含傳輸的有效數據。
  • 幀間隔(IFS):表示一個傳輸的結束。

四、CAN總線的應用

CAN總線在汽車和工業領域應用廣泛,可以用來傳輸控制信息、數據和狀態信號,如引擎轉速、車速、剎車開關等。同時,由於CAN總線結構簡單、容錯能力強、數據傳輸可靠,因此還被應用到航空航天、鐵路等領域。

五、CAN總線的代碼示例

#include
#include
#include

void CAN_Init()
{
  //初始化CAN控制寄存器
  CANCTR |= (1<<INIT); 
  while( !(CANCTR & (1<<INI)) );  //等待初始化完成

  //設置CAN波特率
  CANBT1 = 0x00;
  CANBT2 = 0x04;
  CANBT3 = 0x13;

  //禁用自動重發
  CANCTR &= ~(1<<ARC);
 
  //啟用中斷
  CANIE |= (1<<RXIE)|(1<<TXIE)|(1<<ERIE);
  
  //設置接收過濾器
  CANIDM1 = 0x00;
  CANIDM2 = 0x00;
  CANIDM3 = 0x07;
  CANIDM4 = 0x00;
  
  //設置標識符
  CANIDT1 = 0x00;
  CANIDT2 = 0x00;
  CANIDT3 = 0x01;
  CANIDT4 = 0x00;

  //打開CAN
  CANCTR &= ~(1<<SLEEP);
  CANCTR &= ~(1<<INIT);
}

void CAN_Send(uint8_t* data)
{
  //等待發送緩存為空
  while( (!(CANSR & (1<<TXOK))) || (!(CANSR & (1<<TXRQ))) );
  
  //寫入數據
  CANDATA1 = data[0];
  CANDATA2 = data[1];
  CANDATA3 = data[2];
  CANDATA4 = data[3];
  CANDATA5 = data[4];
  CANDATA6 = data[5];
  CANDATA7 = data[6];
  CANDATA8 = data[7];

  //寫入數據長度
  CANCDMOB = (1<<CONMOB1)|(1<<DLC3)|(1<<DLC1);
  while(CANCDMOB & (1<<CONMOB1));
}

uint8_t CAN_Receive()
{
  uint8_t data;
  
  //等待數據接收完成
  while(!(CANSR & (1<<RXOK)));
  
  //讀取數據
  data = CANDATA1;
  
  //釋放緩存
  CANCDMOB = (1<<CONMOB0);
  
  return data;
}

int main()
{
  uint8_t data[8];

  //初始化CAN總線
  CAN_Init();
  
  //發送數據
  data[0] = 0x01;
  data[1] = 0x02;
  data[2] = 0x03;
  data[3] = 0x04;
  data[4] = 0x05;
  data[5] = 0x06;
  data[6] = 0x07;
  data[7] = 0x08;
  CAN_Send(data);
  
  //接收數據
  uint8_t receive_data = CAN_Receive();
  
  return 0;
}

原創文章,作者:FXOB,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/146427.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FXOB的頭像FXOB
上一篇 2024-10-31 15:29
下一篇 2024-10-31 15:29

相關推薦

  • Harris角點檢測算法原理與實現

    本文將從多個方面對Harris角點檢測算法進行詳細的闡述,包括算法原理、實現步驟、代碼實現等。 一、Harris角點檢測算法原理 Harris角點檢測算法是一種經典的計算機視覺算法…

    編程 2025-04-29
  • 瘦臉算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉算法 Python 實現的原理和方法,包括該算法的意義、流程、代碼實現、優化等內容。 一、算法意義 隨着科技的發展,瘦臉算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • 神經網絡BP算法原理

    本文將從多個方面對神經網絡BP算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP算法簡介 BP算法是一種常用的神經網絡訓練算法,其全稱為反向傳播算法。BP算法的基本思想是通過正…

    編程 2025-04-29
  • GloVe詞向量:從原理到應用

    本文將從多個方面對GloVe詞向量進行詳細的闡述,包括其原理、優缺點、應用以及代碼實現。如果你對詞向量感興趣,那麼這篇文章將會是一次很好的學習體驗。 一、原理 GloVe(Glob…

    編程 2025-04-27
  • 編譯原理語法分析思維導圖

    本文將從以下幾個方面詳細闡述編譯原理語法分析思維導圖: 一、語法分析介紹 1.1 語法分析的定義 語法分析是編譯器中將輸入的字符流轉換成抽象語法樹的一個過程。該過程的目的是確保輸入…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分布式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變量讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25

發表回復

登錄後才能評論