昨晚很榮幸邀請到李工在RT-Thread微信群進(jìn)行RT-Thread上的CAN驅(qū)動(dòng)和應(yīng)用講座。小編整理了講座內(nèi)容,特發(fā)出講義以供享用。
講師:李起偉,任職于煤炭科學(xué)技術(shù)研究院有限公司,助理研究員,碩士,現(xiàn)主要從事嵌入式系統(tǒng)與煤礦安全監(jiān)測監(jiān)控系統(tǒng)的研究工作
分享主題:RT-Thread上的CAN驅(qū)動(dòng)和應(yīng)用
大家晚上好,今天跟大家探討一下RTT上的CAN驅(qū)動(dòng)和應(yīng)用相關(guān)一些內(nèi)容,主要有三個(gè)方面,第一項(xiàng)介紹一下CAN總線的基礎(chǔ)知識(shí),主要是一些幀格式的介紹。第二項(xiàng)是RTT上的CAN驅(qū)動(dòng)的一個(gè)編寫,這部分內(nèi)容主要介紹一些CAN設(shè)備的讀和寫以及中斷處理函數(shù)的驅(qū)動(dòng)編寫,中斷處理函數(shù)主要說一下接收部分的處理。最后一項(xiàng)就是介紹一下CAN數(shù)據(jù)的處理現(xiàn)場的編寫,整個(gè)內(nèi)容都寫得比較淺,然后在咱們這個(gè)探討內(nèi)容結(jié)束之后,我給大家發(fā)一個(gè)CAN總線的基礎(chǔ)教程,然后另外我寫的這部分驅(qū)動(dòng)包括處理現(xiàn)場也是我在實(shí)際產(chǎn)品當(dāng)中應(yīng)用的,隨后我把這部分內(nèi)容的代碼然后整理一下,之后也放出來。
我們就開始第一部分的內(nèi)容,,說一下CAN的這個(gè)特性吧,在這個(gè)CAN的介紹當(dāng)中會(huì)有跟這個(gè)modbus總線會(huì)有一些簡單的對比,那么CAN總線它是一個(gè)多主站的結(jié)構(gòu),在總線上掛的這個(gè)所有的節(jié)點(diǎn),他們的節(jié)點(diǎn)地位都是平等的,就是所有的節(jié)點(diǎn)都可以向總線當(dāng)中主動(dòng)地發(fā)送數(shù)據(jù),不需要等待其他的節(jié)點(diǎn)的就是跟他發(fā)命令說我才可以往上發(fā),這一點(diǎn)是跟modbus的區(qū)別,就是說modbus總線,他是一主多從的,在總線上只有一個(gè)主節(jié)點(diǎn),其他節(jié)點(diǎn)都是從機(jī),從機(jī)只能被動(dòng)地根據(jù)主機(jī)的命令做出相應(yīng)的回復(fù)或者是動(dòng)作,當(dāng)然這些節(jié)點(diǎn)再往總線上發(fā)送數(shù)據(jù)的時(shí)候會(huì)有一個(gè)優(yōu)先級的問題。
在CAN總線當(dāng)中,它有一個(gè)種CAN總線仲裁的機(jī)制,它主要是通過報(bào)文ID來實(shí)現(xiàn)的,那么在CAN總線當(dāng)中執(zhí)行的是“線與”操作,0是屬于顯性電平,1是隱性電平。這樣的話進(jìn)行限于之后報(bào)名ID越小,那么他在總線競爭當(dāng)中優(yōu)先級也就越高,報(bào)文ID或者說是這個(gè)標(biāo)識(shí)符與這個(gè)節(jié)點(diǎn)的ID或者節(jié)點(diǎn)序號,這是兩個(gè)完全不同的概念,就是在這個(gè)報(bào)名ID當(dāng)中其實(shí)可以包,因?yàn)樗跀U(kuò)展的幀當(dāng)中有29位,可以包含很多有意義的內(nèi)容,你都可以幫放在這個(gè)標(biāo)識(shí)符當(dāng)中。
在這個(gè)標(biāo)識(shí)符當(dāng)中,我們可以把發(fā)送節(jié)點(diǎn)的序號類型、接受節(jié)點(diǎn)的序號類型甚至安裝位置等一系列信息都包含在那里,所以說標(biāo)識(shí)符它在一定程度上就描述數(shù)據(jù)的含義,這樣的話就在某些特定應(yīng)用當(dāng)中可以對標(biāo)識(shí)符進(jìn)行過濾,就是說我需要的我才接受,不需要的我就可以過濾掉,然后這樣的話CPU呢不需要進(jìn)行參與一些操作,完全由CAN控制器就可以完成了。
modbus總線一些協(xié)議棧也可以對報(bào)文進(jìn)行過濾,但是這是需要CPU進(jìn)行參與的,這樣的話就會(huì)占用CPU,也就是說當(dāng)modbus總線上有數(shù)據(jù)的時(shí)候,所有節(jié)點(diǎn)都是要參與的,這樣的話一旦modbus總線上有數(shù)據(jù),所有的節(jié)點(diǎn)當(dāng)前正在執(zhí)行的任務(wù)都會(huì)被打斷,所以這樣的話也是CAN總線跟modbus總線的區(qū)別,或者是一點(diǎn)優(yōu)勢吧。
因?yàn)镃AN總線是是一種差分電平,所以它使用那個(gè)雙絞線作為它的總線傳輸介質(zhì),在1Mbps的情況下,總線長度一般會(huì)小于40米,我們看這個(gè)U線這張圖,從現(xiàn)在傳輸速率跟它的傳輸距離在一定程度上是成反比例關(guān)系的,而我們在實(shí)際應(yīng)用當(dāng)中,曾經(jīng)做到過在5Kbps的情況下達(dá)到了7到8公里,而且還是一種多分叉多分枝這種結(jié)構(gòu)。總線結(jié)構(gòu)比較復(fù)雜,而不是我們通常見的一條總線或母線,節(jié)點(diǎn)都單獨(dú)的掛在這個(gè)總線路線上,在實(shí)際運(yùn)用當(dāng)中,這種情況其實(shí)很少見。
說一下CAN協(xié)議的版本,那么目前主要就是2.0B,是可以兼容11位和29位兩種ID的報(bào)文,就是說標(biāo)準(zhǔn)幀和擴(kuò)展幀都可以兼容,具體的協(xié)議內(nèi)容大家可以去查閱一下相關(guān)的文檔,這里就不再多說。
CAN總線當(dāng)中主要的幀格式主要數(shù)據(jù)幀和遠(yuǎn)程偵。數(shù)據(jù)幀也分兩種,就是標(biāo)準(zhǔn)幀和擴(kuò)展幀,遠(yuǎn)程偵同樣有對應(yīng)的標(biāo)準(zhǔn)幀和擴(kuò)展幀。
對這兩種幀格式來簡單地介紹一下,標(biāo)準(zhǔn)幀和擴(kuò)展幀主要區(qū)別就是在幀ID的位數(shù)上,標(biāo)準(zhǔn)幀是11位ID,擴(kuò)展幀是29位ID。我們看標(biāo)準(zhǔn)幀,它有一個(gè)隱性電平幀起始,之后是11位的幀ID,然后是一個(gè)RTR位,RTR位的意思是什么呢?遠(yuǎn)程傳送請求位,那這位是0就是數(shù)據(jù)幀,1的話就代表遠(yuǎn)程幀,顯性電平,也就是說數(shù)據(jù)幀的優(yōu)先級要高于遠(yuǎn)程幀,那么在進(jìn)行總線仲裁的時(shí)候,數(shù)據(jù)幀獲得總線的控制權(quán)。用來區(qū)別標(biāo)準(zhǔn)幀和擴(kuò)展幀的這位叫做標(biāo)識(shí)符擴(kuò)展位。0代表標(biāo)準(zhǔn)幀,1代表擴(kuò)展幀。這樣的話,當(dāng)標(biāo)準(zhǔn)幀和擴(kuò)展幀在進(jìn)行爭奪總線的時(shí)候,那肯定是標(biāo)準(zhǔn)幀獲得總線控制權(quán)。
DLC位代表數(shù)據(jù)長度,一共四位,有效值是0—8,9到15沒有效,他代表數(shù)據(jù)場,指后面的數(shù)據(jù)場里面一共有多少個(gè)字節(jié)能夠被傳送。再然后是15位CRC位,因?yàn)檫@個(gè)CRC校驗(yàn)的起始是從幀開始一直到數(shù)據(jù)場的結(jié)束,整個(gè)這一串的位數(shù)參加這個(gè)CRC校驗(yàn)。CRC檢驗(yàn)完事之后是一個(gè)DR位,這位叫做CRC界定服務(wù),到這里就表示CRC校驗(yàn)完事了,后面就是應(yīng)答場。對于我們這個(gè)用戶來說,在實(shí)際的編程應(yīng)用當(dāng)中,我們用戶一般的需要做的其實(shí)是仲裁場以及控制場和數(shù)據(jù)場,上其他的CRC場場、ASK場均結(jié)束。一般不需要用戶進(jìn)行參與,這些都是由CAN控制器來自動(dòng)完成的。
我們再來看擴(kuò)展幀。擴(kuò)展幀首先前面的11位幀ID先不,后面看RTR位后面。SR位與RTR位是在同一個(gè)位置上,RTR位叫做遠(yuǎn)程傳送請求位,SR位叫做遠(yuǎn)程請求替代位,后面的部分就跟標(biāo)準(zhǔn)一樣,這個(gè)就不再多。真正的RRT位被移送到了29位的幀ID的后面,那么SR位或者是RTR位在標(biāo)準(zhǔn)幀或者是在擴(kuò)展幀當(dāng)中,它也有高電平還是低電平。那么在標(biāo)準(zhǔn)幀當(dāng)中同樣的位RTR一定是顯性電平,而在擴(kuò)展幀當(dāng)中這個(gè)一定是隱性電平。
再一下,遠(yuǎn)程幀。遠(yuǎn)程幀同樣分為兩種,就是根據(jù)這ID的位數(shù)不同,分為標(biāo)準(zhǔn)遠(yuǎn)程幀和擴(kuò)展遠(yuǎn)程幀,我們看一下圖上的這個(gè)RTR位,在這他就是一個(gè)隱形電平,就明他是一個(gè)遠(yuǎn)程幀, 遠(yuǎn)程偵和數(shù)據(jù)幀的主要區(qū)別就是在于除了這個(gè)RTR位之外,還有一個(gè)區(qū)別遠(yuǎn)程幀沒有數(shù)據(jù)場,是不帶數(shù)據(jù)的。
遠(yuǎn)程偵在總線的主要作用是什么呢?就是我們知道CAN總線是多主的,就是大家都是平等的,向總線上各自發(fā)送數(shù)據(jù),這個(gè)就像我們在微信群里聊天一樣,有人一直往這個(gè)群體方式發(fā)送一些消息。但是假如其中有人覺得你發(fā)送的消息不是我想要的,或者不滿足我的要求那么怎么辦呢?我就會(huì)主動(dòng)給你請求數(shù)據(jù),那么我就向你發(fā)送這個(gè)遠(yuǎn)程偵那。至于你向誰請求數(shù)據(jù)、請求的是什么數(shù)據(jù),那我可以都可以包含在幀ID當(dāng)中,而且也只能包含在幀ID當(dāng)中,因?yàn)檫@個(gè)遠(yuǎn)程偵當(dāng)中他沒有數(shù)據(jù)場,你所有的數(shù)據(jù)的意義只能在幀I當(dāng)中,也基本上就相當(dāng)于你的那個(gè)數(shù)據(jù)的個(gè)性化定制吧。
在這點(diǎn)與modbus的0X03和0X06呢比較類似,相當(dāng)于取多個(gè)或單個(gè)寄存器的數(shù)據(jù)命令,指主動(dòng)的索取數(shù)據(jù)。這條命令,舉一個(gè)應(yīng)用的場合吧。比方在火災(zāi)預(yù)警的場合,一般現(xiàn)實(shí)的過程當(dāng)中鑒定火災(zāi)的幾個(gè)要素:一個(gè)是溫度,一個(gè)是煙霧,另外一個(gè)是一氧化碳的濃度。煙霧傳感器、一氧化碳傳感器還有溫度傳感器,他們都是同樣掛在一條CAN主線當(dāng)中,假如現(xiàn)在監(jiān)測到煙霧傳感器煙霧濃度變大了,但是我們知道目前的煙霧傳感器有一個(gè)最大問題對水蒸氣特別敏感,即使水蒸氣濃度很高,煙霧傳感器就會(huì)誤報(bào)警。那么為了確認(rèn)當(dāng)前確實(shí)是煙霧傳感器誤報(bào)警,還是確實(shí)發(fā)生了火災(zāi),那么我們就要及時(shí)看到當(dāng)前一氧化碳的濃度以及溫度的情況。這時(shí)候我可以主動(dòng)發(fā)送一個(gè)遠(yuǎn)程偵來索取一氧化碳傳感器的數(shù)據(jù)以及溫度傳感器的數(shù)據(jù),通過這幾個(gè)傳感器的數(shù)據(jù)進(jìn)行綜合的比較,或者是按照一定的算法,我們就可以知道現(xiàn)在是否確實(shí)發(fā)生了火災(zāi),還是煙霧傳感器進(jìn)行了誤報(bào)警。這樣就可以防止一些不必要的誤報(bào)警,因?yàn)檎`報(bào)警會(huì)有很多的問題。關(guān)于CAN的幀格式的一些介紹就簡單介紹到這里。
下面就進(jìn)入到RT-Thread上的CAN驅(qū)動(dòng)的編寫部分,一些剛接觸到RTT的一些朋友,可能覺得這個(gè)學(xué)這個(gè)驅(qū)動(dòng)比較困難,或者是不知道無從下手。
其實(shí)你看一下就是RTT上面現(xiàn)有的一些設(shè)備的驅(qū)動(dòng),比方串口的、SPI的等等一些現(xiàn)有設(shè)備的驅(qū)動(dòng),仔細(xì)揣摩一下,自帶這個(gè)驅(qū)動(dòng)都寫得很規(guī)范,大家可以完全可以借鑒和模仿,那么這個(gè)驅(qū)動(dòng)其實(shí)主要實(shí)現(xiàn)在這個(gè)圖片上列出來這七個(gè)函數(shù),我們能把這些函數(shù)都實(shí)現(xiàn)了,并且把設(shè)備注冊到這個(gè)系統(tǒng)內(nèi)核當(dāng)中,這個(gè)設(shè)備的驅(qū)動(dòng)也就基本完成。我今天講的這個(gè)CAN的驅(qū)動(dòng)是在1.2.3版本的串口驅(qū)動(dòng)上改寫的,當(dāng)時(shí)的這個(gè)串口驅(qū)動(dòng)跟現(xiàn)在還是有很大區(qū)別的,一會(huì)大家可以看一下。
-
CAN總線
+關(guān)注
關(guān)注
145文章
1968瀏覽量
132004 -
rt_thread
+關(guān)注
關(guān)注
2文章
13瀏覽量
14721
原文標(biāo)題:RT-Thread上的CAN驅(qū)動(dòng)和應(yīng)用講稿(含錄音文件、PPT、源碼下載)
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
RT-Thread上CAN實(shí)踐

RT-Thread NUC97x 移植 LVGL
在RT-Thread Studio上配置rtthread CANFD驅(qū)動(dòng)來控制M3508電機(jī)

RT-Thread上SPI的細(xì)節(jié)內(nèi)容

RT-Thread Studio驅(qū)動(dòng)SD卡

RT-Thread全球技術(shù)大會(huì):螢石EZloT SDK對RT-Thread的支持以及多芯片平臺(tái)管理策略

RT-Thread全球技術(shù)大會(huì):RT-Thread上的單元測試框架與運(yùn)行測試用例

RT-Thread全球技術(shù)大會(huì):在RT-Thread上編寫測試用例

RT-Thread全球技術(shù)大會(huì):RT-Thread對POSIX的實(shí)現(xiàn)情況介紹

基于RT-Thread的CAN電機(jī)驅(qū)動(dòng)板設(shè)計(jì)(一)需求分析與硬件設(shè)計(jì)

評論