文章分兩部分,一是CAN的詳解,二是常見問題匯總;文章長(zhǎng),但是都是重點(diǎn)精華,往有幫助~
(參考的是火哥的STM32有關(guān)CAN協(xié)議的文檔)
一、CAN的詳解
1. 物理層
- CAN總線:成為汽車計(jì)算機(jī)控制系統(tǒng)和嵌入式工業(yè)控制局域網(wǎng)的標(biāo)準(zhǔn)總線。
- CAN是異步通訊,只有CAN_High和CAN_Low兩條信號(hào)線,且這兩條信號(hào)線是差分信號(hào)線,以差分信號(hào)的形式通訊;
- CAN是半雙工的,在同一時(shí)刻,一個(gè)通訊節(jié)點(diǎn)發(fā)送消息,其他節(jié)點(diǎn)只能接收消息;
- CAN物理層的形式分為閉環(huán)總線和開環(huán)總線,閉環(huán)總線是高速短距離的,長(zhǎng)度最長(zhǎng)40m,通信速度最高10Mbps;開環(huán)總線是低速遠(yuǎn)距離的,長(zhǎng)度最長(zhǎng)1km,通信速度最高125kbps。開環(huán)閉環(huán)的區(qū)別在于差分信號(hào)線是不是連在一起的。
- CAN總線可以掛載多個(gè)節(jié)點(diǎn):
- 差分信號(hào):兩根信號(hào)線的幅度相同,相位相反,通過電壓差代表電平1和0;差分信號(hào)優(yōu)點(diǎn):抗干擾能力強(qiáng),因?yàn)橛型饨缭肼暩蓴_時(shí),會(huì)同時(shí)耦合到這兩條信號(hào)線上,由于接收端只關(guān)心信號(hào)的差值,因此噪聲可以抵消。
- 邏輯電平為1是隱性電平,CAN_High和CAN_Low電壓都是2.5v,壓差為0;邏輯電平為0顯性電平,CAN_High電壓3.5v和CAN_Low電壓1.5v,壓差2v。
2. 協(xié)議層
- CAN中,每個(gè)數(shù)據(jù)位又分為多個(gè)段,包括:SS、PTS、PBS1、PBS2;一個(gè)數(shù)據(jù)位由8~25個(gè)Tq表示,這個(gè)段的作用是保證讓該節(jié)點(diǎn)與總線的時(shí)序同步,確保通訊正常;
- 通訊波特率由Tq的時(shí)間長(zhǎng)度,以及每位有多少個(gè)Tq決定:
- CAN協(xié)議是如何通訊的?對(duì)數(shù)據(jù)、操作命令(如讀/寫)以及同步信號(hào)進(jìn)行打包,打包后的這些內(nèi)容稱為報(bào)文。具體:在原始數(shù)據(jù)段的前面加上傳輸起始標(biāo)簽、片選(識(shí)別)標(biāo)簽和控制標(biāo)簽,在數(shù)據(jù)的尾段加上 CRC 校驗(yàn)標(biāo)簽、應(yīng)答標(biāo)簽和傳輸結(jié)束標(biāo)簽,把這些內(nèi)容按特定的格式打包好,就可以用一個(gè)通道表達(dá)各種信號(hào)了,這樣的報(bào)文就被稱為 CAN 的“數(shù)據(jù)幀”。
- CAN有5種數(shù)據(jù)幀,每種數(shù)據(jù)幀的用途不一樣:
- 具體介紹數(shù)據(jù)幀:數(shù)據(jù)幀以一個(gè)顯性位(邏輯 0)開始,以 7 個(gè)連續(xù)的隱性位(邏輯 1)結(jié)束,在它們之間,分別有仲裁段、控制段、數(shù)據(jù)段、 CRC 段和 ACK 段。
- 幀起始,以顯性電平開始,用于通知各個(gè)節(jié)點(diǎn)將有數(shù)據(jù)傳輸;
- 仲裁段:通過仲裁ID來決定優(yōu)先級(jí),優(yōu)先級(jí)高的ID先把數(shù)據(jù)發(fā)出去,利用隱性和顯性電平作為仲裁,誰先出現(xiàn)隱性電平,誰就先失去對(duì)總線的占有權(quán)。標(biāo)準(zhǔn)格式ID是11位,擴(kuò)展格式ID為29位。
- 控制段中的DLC段,表示報(bào)文數(shù)據(jù)段有多少個(gè)字節(jié)。
- 數(shù)據(jù)段有0到8個(gè)字節(jié)組成。
- CRC段是校驗(yàn)位,接收節(jié)點(diǎn)算出的 CRC 碼跟接收到的 CRC 碼不同, 則它會(huì)向發(fā)送節(jié)點(diǎn)反饋出錯(cuò)信息,利用錯(cuò)誤幀請(qǐng)求它重新發(fā)送。
- ACK段是應(yīng)答段,發(fā)送節(jié)點(diǎn)發(fā)送的是隱性位,而接收節(jié)點(diǎn)則發(fā)送顯性位以示應(yīng)答。
- 幀結(jié)束,由7個(gè)隱性位表示結(jié)束。
3. STM32有關(guān)CAN的配置
- CAN 控制內(nèi)核包含了各種控制寄存器及狀態(tài)寄存器,如主控制寄存器 CAN_MCR 及位時(shí)序寄存器 CAN_BTR。
- 主控制寄存器 CAN_MCR 負(fù)責(zé)管理 CAN 的工作模式,如自動(dòng)喚醒、自動(dòng)離線;
- 位時(shí)序寄存器 CAN_BTR 用于配置測(cè)試模式、波特率以及各種位內(nèi)的段參數(shù);
①測(cè)試模式包括:正常模式、靜默模式、回環(huán)模式及靜默回環(huán)模式;
- 正常模式下就是一個(gè)正常的 CAN 節(jié)點(diǎn),可以向總線發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。
- 靜默模式只可向總線發(fā)送數(shù)據(jù)1,不能發(fā)送數(shù)據(jù)0,可從總線接收數(shù)據(jù),用于監(jiān)測(cè),它可以用于分析總線上的流量;
- 回環(huán)模式,輸入端只接收自己發(fā)送端的內(nèi)容,不接收來自總線上的內(nèi)容。使用回環(huán)模式可以進(jìn)行自檢;
- 回環(huán)靜默模式,輸入端只接收自己發(fā)送端的內(nèi)容,不接收來自總線上的內(nèi)容,用于自檢;
②位時(shí)序:
STM32 的 CAN 外設(shè)位時(shí)序中只包含 3 段,分別是同步段 SYNC_SEG、位段 BS1 及位段 BS2,采樣點(diǎn)位于 BS1 及 BS2 段的交界處;這個(gè)位時(shí)序?qū)?yīng)了CAN一個(gè)數(shù)據(jù)位的不同段,即N*Tq=一個(gè)數(shù)據(jù)位;
③計(jì)算波特率:
一個(gè)數(shù)據(jù)位的Tq是等于同步段、BS1和BS2段這三個(gè)段Tq的總和,CAN1和CAN2掛載在APB1上,位時(shí)序寄存器可以分頻時(shí)鐘,Tq=分頻數(shù)/36MHz,CAN的波特率=1/N*Tq。
二、STM32對(duì)CAN的發(fā)送郵箱
- 3個(gè)發(fā)送郵箱,最多可以緩存 3 個(gè)待發(fā)送的報(bào)文;
- 當(dāng)我們要使用 CAN 外設(shè)發(fā)送報(bào)文時(shí),把報(bào)文的各個(gè)段分解,按位置寫入到這些寄存器中;
三、STM32對(duì)CAN的接收郵箱FIFO:它一共有 2 個(gè)接收 FIFO,每個(gè) FIFO 中有 3 個(gè)郵箱,即最多可以緩存 6 個(gè)接收到的報(bào)文;
- 通過中斷或狀態(tài)寄存器知道接收 FIFO 有數(shù)據(jù)后,我們?cè)僮x取這些寄存器的值即可把接收到的報(bào)文加載到 STM32 的內(nèi)存中。
- 接收?qǐng)?bào)文時(shí),通過檢測(cè)標(biāo)志位獲知接收 FIFO 的狀態(tài),若收到報(bào)文,可調(diào)用庫(kù)函數(shù)CAN_Receive 把接收 FIFO 中的內(nèi)容讀取到預(yù)先定義的接收類型結(jié)構(gòu)體中,然后再訪問該結(jié)構(gòu)體即可利用報(bào)文了。
四、驗(yàn)收篩選器:有 14個(gè)篩選器組,每個(gè)篩選器組有 2 個(gè)寄存器。
發(fā)送節(jié)點(diǎn)將報(bào)文廣播給所有接收器時(shí),接收節(jié)點(diǎn)會(huì)根據(jù)報(bào)文標(biāo)識(shí)符的值來確定軟件是否需要該消息,為了簡(jiǎn)化軟件的工作, STM32 的 CAN 外設(shè)接收?qǐng)?bào)文前會(huì)先使用驗(yàn)收篩選器檢查,只接收需要的報(bào)文到 FIFO 中;
- 篩選器工作的時(shí)候,可以調(diào)整篩選 ID 的長(zhǎng)度及過濾模式
(1) 標(biāo)識(shí)符列表模式,它把要接收?qǐng)?bào)文的 ID 列成一個(gè)表,要求報(bào)文 ID 與列表中的某一個(gè)標(biāo)識(shí)符完全相同才可以接收,可以理解為白名單管理。
(2) 掩碼模式,它把可接收?qǐng)?bào)文 ID 的某幾位作為列表,這幾位被稱為掩碼,可以把它理解成關(guān)鍵字搜索,只要掩碼(關(guān)鍵字)相同,就符合要求,報(bào)文就會(huì)被保存到接收 FIFO。
4. STM32軟件編程
(1)配置GPIO,開時(shí)鐘,設(shè)定好對(duì)應(yīng)的引腳,對(duì)應(yīng)到TX和RX;
- TX推挽輸出、RX浮空輸入,引腳復(fù)用功能重映射。
(2)配置CAN初始化結(jié)構(gòu)體,即配置工作模式,先開時(shí)鐘;
(3)配置篩選器
(4)配置發(fā)送報(bào)文:包括使用擴(kuò)展還是標(biāo)準(zhǔn)的ID,選擇擴(kuò)展還是標(biāo)準(zhǔn)模式,發(fā)送是數(shù)據(jù)還是其他內(nèi)容,設(shè)置數(shù)據(jù)的長(zhǎng)度,設(shè)置將要發(fā)送的數(shù)據(jù):
(5)在中斷中接收?qǐng)?bào)文,因此要分為以下兩個(gè)步驟
- 配置NVIC結(jié)構(gòu)體,設(shè)置好優(yōu)先級(jí),包括優(yōu)先級(jí)組、搶占優(yōu)先級(jí)、子優(yōu)先級(jí);
- 在中斷服務(wù)函數(shù)中,接收?qǐng)?bào)文時(shí),通過檢測(cè)標(biāo)志位獲知接收 FIFO 的狀態(tài),若收到報(bào)文,可調(diào)用庫(kù)函數(shù)CAN_Receive 把接收 FIFO 中的內(nèi)容讀取到預(yù)先定義的接收類型結(jié)構(gòu)體中,然后再訪問該結(jié)構(gòu)體即可利用報(bào)文了。(注意:必須要在中斷內(nèi)調(diào)用 CAN_Receive 函數(shù)讀取接收FIFO 的內(nèi)容,因?yàn)橹挥羞@樣才能清除該 FIFO 的接收中斷標(biāo)志,如果不在中斷內(nèi)調(diào)用它清除標(biāo)志的話,一旦接收到報(bào)文, STM32 會(huì)不斷進(jìn)入中斷服務(wù)函數(shù),導(dǎo)致程序卡死)
二、CAN的常見問題
1、Can總線有什么了解?可以從物理層、協(xié)議層再到STM32對(duì)CAN三個(gè)方面去介紹。
2、仲裁機(jī)制?以ID來區(qū)別優(yōu)先級(jí),若有兩個(gè)節(jié)點(diǎn)同時(shí)發(fā)送數(shù)據(jù),那么由于是半雙工,在一個(gè)時(shí)間只能一個(gè)節(jié)點(diǎn)發(fā)送數(shù)據(jù),那么就要比較這兩個(gè)節(jié)點(diǎn)的ID,誰的ID先出現(xiàn)隱性電平,即高電平,誰就失去了對(duì)CAN發(fā)送數(shù)據(jù)的控制權(quán)。
3、can總線,波特率?(與Tq的大小,即與時(shí)鐘大小有關(guān);一個(gè)數(shù)據(jù)位包括的Tq的個(gè)數(shù)有關(guān))幀?(了解到的是數(shù)據(jù)幀,包括起始幀、仲裁幀、控制幀、數(shù)據(jù)幀、校驗(yàn)幀、應(yīng)答幀、結(jié)束幀)報(bào)文?(具體:在原始數(shù)據(jù)段的前面加上傳輸起始標(biāo)簽、片選(識(shí)別)標(biāo)簽和控制標(biāo)簽,在數(shù)據(jù)的尾段加上 CRC 校驗(yàn)標(biāo)簽、應(yīng)答標(biāo)簽和傳輸結(jié)束標(biāo)簽,把這些內(nèi)容按特定的格式打包好,就可以用一個(gè)通道表達(dá)各種信號(hào)了,這樣的報(bào)文就被稱為 CAN 的“數(shù)據(jù)幀”)
4、can的傳輸距離,分為開環(huán)和閉環(huán),閉環(huán)是高速近距離:10Mbps傳輸40m,開環(huán)是低速遠(yuǎn)距離:125kbps傳輸1km。
5、CAN初始化配置步驟?看軟件編程那里
6、CAN發(fā)送數(shù)據(jù)格式?
總結(jié)就是:包括使用擴(kuò)展還是標(biāo)準(zhǔn)的ID,選擇擴(kuò)展還是標(biāo)準(zhǔn)模式,發(fā)送是數(shù)據(jù)還是其他東西,設(shè)置數(shù)據(jù)的長(zhǎng)度,設(shè)置將要發(fā)送的數(shù)據(jù)。
7、CAN總線是一種多主方式的串行通訊總線,基本設(shè)計(jì)規(guī)范要求有高的位速率,高抗電子干擾性,并且能夠檢測(cè)出產(chǎn)生的任何錯(cuò)誤。文章來源:http://www.zghlxwxcb.cn/news/detail-715844.html
8、CAN總線原理:CAN總線以廣播的方式從一個(gè)節(jié)點(diǎn)向另一個(gè)節(jié)點(diǎn)發(fā)送數(shù)據(jù),當(dāng)一個(gè)節(jié)點(diǎn)發(fā)送數(shù)據(jù)時(shí),該節(jié)點(diǎn)的CPU把將要發(fā)送的數(shù)據(jù)和標(biāo)識(shí)符發(fā)送給本節(jié)點(diǎn)的CAN芯片,并使其進(jìn)入準(zhǔn)備狀態(tài);一旦該CAN芯片收到總線分配,就變?yōu)榘l(fā)送報(bào)文狀態(tài),該CAN芯片將要發(fā)送的數(shù)據(jù)組成規(guī)定的報(bào)文格式發(fā)出。此時(shí),網(wǎng)絡(luò)中其他的節(jié)點(diǎn)都處于接收狀態(tài),所有節(jié)點(diǎn)都要先對(duì)其進(jìn)行接收,通過檢測(cè)來判斷該報(bào)文是否是發(fā)給自己的。文章來源地址http://www.zghlxwxcb.cn/news/detail-715844.html
到了這里,關(guān)于CAN協(xié)議詳解+常見問題匯總,吐血整理?。?!的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!