)
介紹CAN總線Controller Area Network Bus控制器局域網(wǎng)總線。CAN總線構(gòu)建的是一種局域網(wǎng)網(wǎng)絡(luò)每一個(gè)掛載在CAN總線的設(shè)備都可以利用這個(gè)局域網(wǎng)去發(fā)送自己的消息也可以接收局域網(wǎng)的各種消息每個(gè)設(shè)備都是平等的都在共享這個(gè)局域網(wǎng)的通信資源。不存在什么主從關(guān)系。CAN總線是由BOSCH公司開(kāi)發(fā)的一種簡(jiǎn)潔易用、傳輸速度快、易擴(kuò)展、可靠性高的串行通信總線廣泛應(yīng)用于汽車(chē)、嵌入式、工業(yè)控制等領(lǐng)域。can總線特征兩根通信線CAN_H、CAN_L線路少無(wú)需共地差分信號(hào)通信抗干擾能力強(qiáng)若線路產(chǎn)生干擾則一般兩根線的電壓都會(huì)同時(shí)出現(xiàn)波動(dòng)但是兩根線的電壓差值仍然是不變的所以用電壓差值來(lái)傳遞數(shù)據(jù)可以極大的避免干擾高速CANISO11898125k~1Mbps, 傳輸距離40 m本課程側(cè)重學(xué)習(xí)的是高速CAN低速CANISO1151910k~125kbps, 傳輸距離1 km異步無(wú)需時(shí)鐘線通信速率由設(shè)備各自約定半雙工不可以同時(shí)發(fā)送和接收可掛載多設(shè)備多設(shè)備同時(shí)發(fā)送數(shù)據(jù)時(shí)通過(guò)仲裁判斷先后順序11位/29位報(bào)文ID用于區(qū)分消息功能同時(shí)決定優(yōu)先級(jí)高速can:低速can:差分信號(hào)can_High和can_Low走的是一對(duì)差分信號(hào)傳統(tǒng)的單端信號(hào)傳輸一根信號(hào)線和一根地線差分傳輸是一種信號(hào)傳輸?shù)募夹g(shù)差分傳輸在這兩根線上都傳輸信號(hào)這兩個(gè)信號(hào)的振幅相同相位相反信號(hào)接收端比較這兩個(gè)電壓的差值來(lái)判斷發(fā)送端發(fā)送的邏輯狀態(tài)。在電路板上差分走線必須是等長(zhǎng)、等寬、緊密靠近、且在同一層面的兩根線。優(yōu)點(diǎn)抗干擾能力強(qiáng)干擾噪聲一般會(huì)等值、同時(shí)的被加載到兩根信號(hào)線上而其差值為0即噪聲對(duì)信號(hào)的邏輯意義不產(chǎn)生影響。差分走線必須是等長(zhǎng)、等寬、緊密靠近就是為了讓外界干擾同等的附加在這兩根線上最后的差值為0缺點(diǎn)差分信號(hào)一定要走兩根等長(zhǎng)、等寬、緊密靠近、且在同一層面的線。對(duì)電路板比較小走線比較緊張的情況下給布線帶來(lái)挑戰(zhàn)。can差分信號(hào)的邏輯電平高速can邏輯1隱性電平can_High can_Low 2.5V標(biāo)準(zhǔn)電壓差為-0.5 0.05之間邏輯0顯性電平can_High - can_Low 2.0V標(biāo)準(zhǔn)電壓差為1.5 3.0之間低速can邏輯1隱性can_High - can_Low -1.5標(biāo)準(zhǔn)電壓差為-0.3 ∞邏輯0顯性can_High - can_Low 3.0標(biāo)準(zhǔn)電壓差為0.3 ∞can總線協(xié)議幀can總線的報(bào)文種類(lèi)CAN總線是廣播類(lèi)型的總線。這意味著所有節(jié)點(diǎn)都可以偵聽(tīng)到所有傳輸?shù)膱?bào)文。無(wú)法將報(bào)文單獨(dú)發(fā)送給指定節(jié)點(diǎn)所有節(jié)點(diǎn)都將始終捕獲所有報(bào)文。但是CAN硬件能夠提供本地過(guò)濾功能讓每個(gè)節(jié)點(diǎn)對(duì)報(bào)文有選擇性地做出響應(yīng)。這段話的意思是當(dāng)一個(gè)節(jié)點(diǎn)發(fā)送數(shù)據(jù)時(shí)所有的節(jié)點(diǎn)都能得知這個(gè)數(shù)據(jù)但是會(huì)有一個(gè)本地過(guò)濾功能讓指定的節(jié)點(diǎn)來(lái)接收數(shù)據(jù)。五中不同的報(bào)文類(lèi)型數(shù)據(jù)幀數(shù)據(jù)幀是最常見(jiàn)的報(bào)文類(lèi)型用于發(fā)送單元向接收單元發(fā)送數(shù)據(jù)。遠(yuǎn)程幀遙控幀遠(yuǎn)程幀用于接收單元向具有相同id的發(fā)送單元請(qǐng)求發(fā)送數(shù)據(jù)。不帶數(shù)據(jù)僅僅就是發(fā)送一個(gè)求數(shù)據(jù)的請(qǐng)求錯(cuò)誤幀錯(cuò)誤幀當(dāng)檢測(cè)出錯(cuò)誤時(shí)向其他單元通知錯(cuò)誤的幀。過(guò)載幀接收設(shè)備通知其尚未做好接收準(zhǔn)備過(guò)載幀并不常用因?yàn)楫?dāng)今的CAN控制器會(huì)非常智能化地避免使用過(guò)載幀幀間隔用于將數(shù)據(jù)幀及遙控幀與前面的幀分離開(kāi)來(lái)的幀其中錯(cuò)誤幀、過(guò)載幀、幀間隔都是由硬件自動(dòng)完成的沒(méi)有辦法用軟件來(lái)控制。對(duì)于一般使用者來(lái)說(shuō)只需要掌握數(shù)據(jù)幀與遙控幀。數(shù)據(jù)幀和遙控幀有標(biāo)準(zhǔn)格式與擴(kuò)展格式。標(biāo)準(zhǔn)格式有11位標(biāo)識(shí)符擴(kuò)展格式有29位標(biāo)識(shí)符。數(shù)據(jù)幀介紹標(biāo)準(zhǔn)幀幀起始1位總線空閑時(shí)發(fā)送總裁段標(biāo)識(shí)符位11位可以理解為節(jié)點(diǎn)ID高位在前遠(yuǎn)程發(fā)送請(qǐng)求位區(qū)分是數(shù)據(jù)幀還是遠(yuǎn)程幀顯性信號(hào)0代表數(shù)據(jù)幀控制段IDE位1位 區(qū)分標(biāo)準(zhǔn)格式還是拓展格式顯性電平代表標(biāo)準(zhǔn)格式R0位保留位以后使用DLC段4位 用于表示本報(bào)文中的數(shù)據(jù)有多少個(gè)字節(jié)。數(shù)據(jù)段64位。8個(gè)字節(jié)CRC段CRC校驗(yàn)碼15位 用于校驗(yàn)傳輸是否正確界定符隱性位表示CRC校驗(yàn)的結(jié)束同時(shí)釋放總線等待接收方拉低ACK段ACK確認(rèn)位發(fā)送方發(fā)送完之后接收方會(huì)將總線置顯性0表示接收到了信息。界定符隱性位用于跟后面的分開(kāi)同時(shí)接收方釋放總線幀結(jié)束7個(gè)隱性位表示幀的結(jié)束拓展幀擴(kuò)展幀與標(biāo)準(zhǔn)幀的不同在于仲裁段和控制段其他完全一樣。遙控幀遙控幀就是發(fā)送一個(gè)請(qǐng)求沒(méi)有數(shù)據(jù)。錯(cuò)誤幀總線上所有設(shè)備都會(huì)監(jiān)督總線的數(shù)據(jù)一旦發(fā)現(xiàn)“位錯(cuò)誤”或“填充錯(cuò)誤”或“CRC錯(cuò)誤”或“格式錯(cuò)誤”或“應(yīng)答錯(cuò)誤” 這些設(shè)備便會(huì)發(fā)出錯(cuò)誤幀來(lái)破壞數(shù)據(jù)同時(shí)終止當(dāng)前的發(fā)送設(shè)備錯(cuò)誤幀分主動(dòng)錯(cuò)誤幀和被動(dòng)錯(cuò)誤幀主動(dòng)錯(cuò)誤幀是將總線拉低被動(dòng)錯(cuò)誤幀是將總線拉高根據(jù)線與的特性主動(dòng)錯(cuò)誤幀會(huì)破壞原有的數(shù)據(jù)被動(dòng)錯(cuò)誤幀不會(huì)破壞原有的數(shù)據(jù)。過(guò)載幀當(dāng)接收方收到大量數(shù)據(jù)而無(wú)法處理時(shí)其可以發(fā)出過(guò)載幀延緩發(fā)送方的數(shù)據(jù)發(fā)送以平衡總線負(fù)載避免數(shù)據(jù)丟失幀間隔幀間隔是在數(shù)據(jù)幀/遙控幀與前面的幀分開(kāi)幀間隔也分主動(dòng)錯(cuò)誤與被動(dòng)錯(cuò)誤主動(dòng)錯(cuò)誤是上方的有三個(gè)幀間隔被動(dòng)錯(cuò)誤是下方的三個(gè)幀間隔后還有八個(gè)延遲傳送。位填充位填充規(guī)則發(fā)送方每發(fā)送5個(gè)相同電平后自動(dòng)追加一個(gè)相反電平的填充位接收方檢測(cè)到填充位時(shí)會(huì)自動(dòng)移除填充位恢復(fù)原始數(shù)據(jù)例如作用當(dāng)發(fā)送方發(fā)送一連串相同的電平時(shí)會(huì)對(duì)接收方的接受造成干擾將正常數(shù)據(jù)流與“錯(cuò)誤幀”和“過(guò)載幀”區(qū)分開(kāi)標(biāo)志“錯(cuò)誤幀”和“過(guò)載幀”的特異性can總線仲裁CAN總線處于空閑狀態(tài)的時(shí)候最先發(fā)送消息的單元獲得發(fā)送權(quán)。多個(gè)單元同時(shí)開(kāi)始發(fā)送時(shí)從仲裁段報(bào)文id的第一位開(kāi)始進(jìn)行仲裁。連續(xù)輸出顯性電平最多的單元可以繼續(xù)發(fā)送即首先出現(xiàn)隱性電平的單元失去對(duì)總線的占有權(quán)變?yōu)榻邮铡?即報(bào)文id小的優(yōu)先級(jí)高)。因?yàn)槲覀兊闹俨枚问歉呶辉谇暗恼l(shuí)先出現(xiàn)0誰(shuí)的優(yōu)先級(jí)就高競(jìng)爭(zhēng)失敗會(huì)自動(dòng)檢測(cè)總線空閑在第一時(shí)間再次嘗試發(fā)送。can的位時(shí)序介紹位同步是為了解決時(shí)序同步的機(jī)制這里一幀包含了四位同步段的時(shí)間往往被看做是這一幀的時(shí)間單元后面三段的時(shí)間都需要是同步段時(shí)間的整數(shù)倍同步段ss的大小固定是1Tq若通訊節(jié)點(diǎn)檢測(cè)到總線上信號(hào)的跳變沿被包含在 SS段的范圍之內(nèi)則表示節(jié)點(diǎn)與總線的時(shí)序是同步的。這段看不懂不用管了傳播時(shí)間段CAN總線上數(shù)據(jù)的傳輸會(huì)受到各種物理延遲。比如發(fā)送單元的發(fā)送延遲、總線上信號(hào)的傳播延遲、接收單元的輸入延遲等。PTS段就是用來(lái)補(bǔ)償這些因素產(chǎn)生的時(shí)間延遲。這樣降低波特率來(lái)實(shí)現(xiàn)穩(wěn)定的功能相位緩沖段1主要是來(lái)補(bǔ)償邊沿階段的誤差。它的時(shí)間長(zhǎng)度在重新同步階段的時(shí)候可以被自動(dòng)加長(zhǎng)。PBS1段的初始大小可以為1~8Tq。相位緩沖段2另一個(gè)相位緩沖段也是用來(lái)補(bǔ)償邊沿階段誤差的他的時(shí)間長(zhǎng)度在重新同步階段會(huì)被縮短。位同步CAN總線沒(méi)有時(shí)鐘線總線上的所有設(shè)備通過(guò)約定波特率的方式確定每一個(gè)數(shù)據(jù)位的時(shí)長(zhǎng)發(fā)送方以約定的位時(shí)長(zhǎng)每隔固定時(shí)間輸出一個(gè)數(shù)據(jù)位接收方以約定的位時(shí)長(zhǎng)每隔固定時(shí)間采樣總線的電平輸入一個(gè)數(shù)據(jù)位理想狀態(tài)下接收方能依次采樣到發(fā)送方發(fā)出的每個(gè)數(shù)據(jù)位且采樣點(diǎn)位于數(shù)據(jù)位中心附近硬同步因?yàn)閏an總線沒(méi)有時(shí)鐘線他們傳輸數(shù)據(jù)是按照雙方約定好的波特率來(lái)實(shí)現(xiàn)的。當(dāng)發(fā)送方率先發(fā)送報(bào)文隨后接收方接收到SOF的下降沿后接收方會(huì)直接把自己的位時(shí)序周期撥動(dòng)到ss的位置與發(fā)送方的時(shí)序保持一致??梢灶?lèi)比為右邊的鐘表每一時(shí)刻所有的節(jié)點(diǎn)都必須指向同一位置。再同步我們的理想狀態(tài)下是接收方在數(shù)據(jù)中心采樣但是這只是一種理想的狀態(tài)我們難免會(huì)因?yàn)橐恍┯绊憣?dǎo)致我們的采樣點(diǎn)不在數(shù)據(jù)中心位所以我們有一個(gè)解決方法就是我們?cè)谝粋€(gè)跳變沿開(kāi)始計(jì)時(shí)到采樣時(shí)刻如果時(shí)間短的話那就讓后面采樣慢一點(diǎn)。以此類(lèi)推。仲裁不同時(shí)發(fā)這時(shí)設(shè)備1正在發(fā)送數(shù)據(jù)然后設(shè)備2檢測(cè)到有設(shè)備正在發(fā)送數(shù)據(jù)所以說(shuō)設(shè)備2進(jìn)入等待狀態(tài)。等待下一次總線空閑總線空閑當(dāng)檢測(cè)到11位隱性電平時(shí)就認(rèn)為此時(shí)總線是空閑狀態(tài)。一旦有設(shè)備正在發(fā)數(shù)據(jù)總線就會(huì)變成活躍狀態(tài)必然不會(huì)出現(xiàn)11個(gè)隱性電平。同時(shí)發(fā)總線空閑時(shí)來(lái)了兩個(gè)設(shè)備來(lái)爭(zhēng)奪那么ID號(hào)小的優(yōu)先級(jí)高的先發(fā)送ID號(hào)大的優(yōu)先級(jí)低后發(fā)送。這里有兩個(gè)特點(diǎn)就是1.總線的線與特性2.回讀機(jī)制。因?yàn)檫@兩個(gè)特性正是硬件自身判斷ID號(hào)大小的關(guān)鍵。兩個(gè)設(shè)備同時(shí)來(lái)的設(shè)備1和設(shè)備2發(fā)送起始位都是顯性0將總線拉低他們分別回讀后發(fā)現(xiàn)與自身一樣就進(jìn)行下一位的判斷。隨后通過(guò)判斷前幾位兩個(gè)設(shè)備對(duì)總線的操作都是一樣的回讀也與自身一樣。直到紅色時(shí)刻。單元1發(fā)送隱性1拉高總線單元2發(fā)送顯性0拉低總線。因?yàn)榭偩€線與的特性所以總線呈現(xiàn)出拉低的狀態(tài)單元1回讀后發(fā)現(xiàn)與自身不一樣那他就放棄總線的爭(zhēng)奪等到下一次的總線空閑再去爭(zhēng)奪。錯(cuò)誤類(lèi)型錯(cuò)誤共有5種 位錯(cuò)誤、填充錯(cuò)誤、CRC錯(cuò)誤、格式錯(cuò)誤、應(yīng)答錯(cuò)誤當(dāng)這些發(fā)送單元和接收單元檢測(cè)到以上的錯(cuò)誤是會(huì)產(chǎn)生錯(cuò)誤通知。錯(cuò)誤幀產(chǎn)生后這幀數(shù)據(jù)就會(huì)報(bào)廢。數(shù)據(jù)傳輸也會(huì)終止。等錯(cuò)誤幀結(jié)束后總線就會(huì)回歸空閑。大家誰(shuí)想發(fā)數(shù)據(jù)誰(shuí)就開(kāi)始一個(gè)新的幀??偩€上的每個(gè)設(shè)備都是一個(gè)獨(dú)立的檢察官。但是有一個(gè)新的問(wèn)題如果有一個(gè)設(shè)備壞了那么他收到的數(shù)據(jù)不管是不是錯(cuò)誤的他都會(huì)認(rèn)為是錯(cuò)誤的就會(huì)一直發(fā)送錯(cuò)誤幀干擾其他設(shè)備的運(yùn)行。所以就引出了錯(cuò)誤狀態(tài)我們的設(shè)備狀態(tài)都被分為主動(dòng)錯(cuò)誤狀態(tài)和被動(dòng)錯(cuò)誤狀態(tài)主動(dòng)錯(cuò)誤狀態(tài)的設(shè)備檢測(cè)到錯(cuò)誤就發(fā)送主動(dòng)錯(cuò)誤相反被動(dòng)錯(cuò)誤狀態(tài)的設(shè)備檢測(cè)到錯(cuò)誤就發(fā)被動(dòng)錯(cuò)誤狀態(tài)。因?yàn)橹鲃?dòng)錯(cuò)誤狀態(tài)能打斷總線上的數(shù)據(jù)所以當(dāng)一個(gè)設(shè)備發(fā)生主動(dòng)錯(cuò)誤狀態(tài)的次數(shù)越來(lái)越多時(shí)總線就會(huì)覺(jué)得這個(gè)設(shè)備會(huì)不會(huì)壞了就把他變成被動(dòng)錯(cuò)誤狀態(tài)。變成被動(dòng)錯(cuò)誤狀態(tài)后如果還頻繁產(chǎn)生錯(cuò)誤就把他轉(zhuǎn)入總線關(guān)閉狀態(tài)不讓他參與通信。每個(gè)設(shè)備內(nèi)部會(huì)有一個(gè)TEC發(fā)送錯(cuò)誤計(jì)數(shù)值和REC接收錯(cuò)誤計(jì)數(shù)值的值TEC是設(shè)備作為發(fā)送方每次檢測(cè)到一個(gè)錯(cuò)誤后會(huì)1成功發(fā)送一幀數(shù)據(jù)后會(huì)-1。相反REC也是當(dāng)設(shè)備作為接收方時(shí)檢測(cè)到一個(gè)錯(cuò)誤REC就會(huì)1接收到一幀數(shù)據(jù)后會(huì)-1.設(shè)備在主動(dòng)狀態(tài)下TEC或REC的值大于127后會(huì)被轉(zhuǎn)入被動(dòng)錯(cuò)誤狀態(tài)。被動(dòng)錯(cuò)誤狀態(tài)下TEC的值大于255后被轉(zhuǎn)入總線關(guān)閉狀態(tài)。STM32 can外設(shè)can基本結(jié)構(gòu)這里的CAN_TX和CAN_RX與我們芯片上的GPIO相連。當(dāng)接收到數(shù)據(jù)后我們的發(fā)送和接收控制器會(huì)自動(dòng)根據(jù)過(guò)濾器的配置進(jìn)行過(guò)濾然后發(fā)送數(shù)據(jù)時(shí)我們可以通過(guò)發(fā)送和接受控制器來(lái)設(shè)置要發(fā)送的報(bào)文ID標(biāo)識(shí)符過(guò)濾器