電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 107|回復(fù): 0
收起左側(cè)

CAN、CANopen協(xié)議棧詳解【硬核,慎點(diǎn)】

[復(fù)制鏈接]

270

主題

270

帖子

2223

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
2223
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-10-23 11:00:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
第一章 CAN協(xié)議棧詳解本章目錄
  • 前言
  • 一、CAN簡(jiǎn)介
  • 二、CAN的發(fā)展歷史
  • 三、CAN的電氣特性
  • 四、CAN協(xié)議棧
  •     4.1、CAN協(xié)議棧解析
  •     4.2、CAN收發(fā)過程
  •     4.3、CAN錯(cuò)誤處理
  •     4.4、CAN波特率
  •     4.5、CAN過濾
  • 總結(jié)
    本章介紹了CAN協(xié)議棧的發(fā)展歷史、電氣特性、基礎(chǔ)理論、標(biāo)準(zhǔn)協(xié)議棧解析等干貨知識(shí)點(diǎn)。
    一、CAN簡(jiǎn)介CAN包含兩個(gè)部分,分別是CAN總線和CAN總線協(xié)議。
    CAN總線:
    控制器局域網(wǎng)總線(CAN,Controller Area Network)是一種用于實(shí)時(shí)應(yīng)用的串行通訊協(xié)議總線,它是使用兩根信號(hào)總線(雙絞線的形式)來傳輸信號(hào),是世界上應(yīng)用最廣泛的現(xiàn)場(chǎng)總線之一。最初,CAN被設(shè)計(jì)作為汽車環(huán)境中的微控制器通訊,在車載各電子控制裝置ECU之間交換信息,形成汽車電子控制網(wǎng)絡(luò)。比如:發(fā)動(dòng)機(jī)管理系統(tǒng)、變速箱控制器、儀表裝備、電子主干系統(tǒng)中,均嵌入CAN控制裝置。一個(gè)由CAN 總線構(gòu)成的單一網(wǎng)絡(luò)中,理論上可以掛接無(wú)數(shù)個(gè)節(jié)點(diǎn)。實(shí)際應(yīng)用中,節(jié)點(diǎn)數(shù)目受網(wǎng)絡(luò)硬件的電氣特性所限制。CAN 可提供高達(dá)1Mbit/s的數(shù)據(jù)傳輸速率,這使實(shí)時(shí)控制變得非常容易。另外,硬件的錯(cuò)誤檢定特性也增強(qiáng)了CAN的抗電磁干擾能力。CAN總線協(xié)議:
    CAN總線協(xié)議是 ISO國(guó)際標(biāo)準(zhǔn)化的串行通信協(xié)議:CAN協(xié)議用于汽車中各種不同元件之間的通信,以此取代昂貴而笨重的配電線束。該協(xié)議的健壯性使其用途延伸到其他自動(dòng)化和工業(yè)應(yīng)用。CAN協(xié)議的特性包括完整性的串行數(shù)據(jù)通訊、提供實(shí)時(shí)支持、傳輸速率高達(dá)1Mb/s、同時(shí)具有11位的尋址以及檢錯(cuò)能力。CAN總線協(xié)議是一個(gè)載波偵聽(CSMA)、基于報(bào)文優(yōu)先級(jí)碰撞檢測(cè)和仲裁(CD+AMP)的多路訪問協(xié)議:
  • CSMA:意思是總線上的每一個(gè)節(jié)點(diǎn)在企圖發(fā)送報(bào)文前,必須要監(jiān)聽總線,當(dāng)總線處于空閑時(shí),才可發(fā)送。
  • CD+AMP:意思是通過預(yù)定編程好的報(bào)文優(yōu)先級(jí)逐位仲裁來解決碰撞,報(bào)文優(yōu)先級(jí)位于每個(gè)報(bào)文的標(biāo)識(shí)域。更高級(jí)別優(yōu)先級(jí)標(biāo)識(shí)的報(bào)文總是能獲得總線訪問權(quán),即:標(biāo)識(shí)符中最后保持邏輯高電平的會(huì)繼續(xù)傳輸,因?yàn)樗哂懈邇?yōu)先級(jí)。二、CAN的發(fā)展歷史
  • 1980年代初期,由于沒有可滿足汽車工程師的總線協(xié)議,人們開始開發(fā)新的串行總線。
  • 1986年2月,在底特律舉行SAE會(huì)議上CAN總線誕生,稱之為Automotive Serial Controller Area Network。
  • 1991年,博世發(fā)布CAN2.0規(guī)范,分CAN 2.0A(具有11位標(biāo)識(shí)符)和CAN 2.0B(具有29位標(biāo)識(shí)符)。
  • 1993年,ISO組織發(fā)布CAN標(biāo)準(zhǔn)IS0 11898: IS0 11898-1涵蓋數(shù)據(jù)鏈路層,IS0 11898-2涵蓋高速CAN的CAN物理層(經(jīng)典CAN速度1Mbps,CAN FD 5Mbps) ,IS0 11898-3 涵蓋低速,容錯(cuò)CAN的物理層 (速度125Kbps),后續(xù)還推出了ISO 11898 -4 -5和-6標(biāo)準(zhǔn)。
  • 2012年,博世發(fā)布CAN FD 1.0,速度2Mbps,使用CAN FD-SiC (加強(qiáng)版CAN PHY)可以做到5-8Msps。以STM32H7為例,帶的CANFD是支持經(jīng)典CAN的CAN2.0A和CAN2.0B,以及CANFD V1.0規(guī)范,兼容ISO 11898-1 : 2015和ISO11898 -4。
  • 2018年12月,開始推出第三代CAN數(shù)據(jù)鏈路層協(xié)議CAN XL,速度提升至10Mbsp。
  • 2022年11月、博世推出下一代CAN IP核CAN XL,速度高達(dá)20Mbps。


    三、CAN的電氣特性
  • CAN總線測(cè)試階段,至少一端的終端120Q終端電阻不可以省略。
  • CAN是差分通信,總線電平分為顯性電平和隱性電平兩種?偩上執(zhí)行邏輯上的線“與”:顯性電平為0,隱性電平為1。顯性電平具有主導(dǎo)性,只有所有節(jié)點(diǎn)都輸出隱性電平時(shí)總線上才是隱性。
  • 測(cè)量發(fā)現(xiàn)CAN僅接一端的終端電阻,結(jié)束的時(shí)候波形會(huì)有個(gè)抬高。
  • 通信速度和最大長(zhǎng)度理論值,主要是經(jīng)典CAN,所有節(jié)點(diǎn)操作必須在同一個(gè)CAN波特率下。
  • 在測(cè)試階段,測(cè)試軟件應(yīng)用層時(shí),由于STM32芯片大部分都是雙CAN,所以可以通過特別操作,不使用CAN PHY芯片也可以實(shí)現(xiàn)CAN通訊,不過這個(gè)不是差分電平。



    [/ol]四、CAN協(xié)議棧CAN協(xié)議棧的幀類型包括數(shù)據(jù)幀、遠(yuǎn)程幀、錯(cuò)誤幀、過載幀和幀間隔。
    4.1、CAN協(xié)議棧解析
  • 數(shù)據(jù)幀發(fā)送單元向接收單元傳送數(shù)據(jù)的幀。



    ① 起始段:表示數(shù)據(jù)幀開始的段。
    SOF:幀起始(1位),顯性(0)表示報(bào)文的開始,并用于同步總線上的節(jié)點(diǎn)。
    ② 仲裁段:表示該幀優(yōu)先級(jí)的段。標(biāo)識(shí)符:標(biāo)識(shí)符(11位),標(biāo)準(zhǔn)格式具有11位標(biāo)識(shí)符,用來確定報(bào)文的優(yōu)先級(jí)。此域的數(shù)值越小,優(yōu)先級(jí)越高。
    RTR:遠(yuǎn)程發(fā)送請(qǐng)求位(1位),當(dāng)需要從另一個(gè)節(jié)點(diǎn)請(qǐng)求信息(遙控幀)時(shí),此位為顯性(0)。
    所有節(jié)點(diǎn)都能接收這個(gè)請(qǐng)求,但是幀標(biāo)識(shí)符確定被指定的節(jié)點(diǎn)。響應(yīng)數(shù)據(jù)幀同樣被所有節(jié)點(diǎn)接收,可以被有興趣的節(jié)點(diǎn)使用。
    ③ 控制段:表示數(shù)據(jù)的字節(jié)數(shù)及保留位的段。IDE:標(biāo)志符擴(kuò)展位(1位),為顯性(0)時(shí)使用標(biāo)準(zhǔn)格式,為隱性(1)時(shí)表示這是擴(kuò)展格式。
    r0:保留位(1位),必須全部以顯性電平發(fā)送,但接收方可以接收任意電平。
    DLC:數(shù)據(jù)長(zhǎng)度代碼(4位),表示傳輸數(shù)據(jù)的字節(jié)數(shù)目,一幀最多傳輸8字節(jié)用戶數(shù)據(jù)。
    ④ 數(shù)據(jù)段:數(shù)據(jù)的內(nèi)容,經(jīng)典CAN支持0-8字節(jié),CANFD支持0-64字節(jié)。⑤ 校驗(yàn)段:檢查幀的傳輸錯(cuò)誤的段。
    CRC:經(jīng)典CAN是15bit+1個(gè)bit的CRC界定符 (用于位分隔),CANFD是17或者21bit+1個(gè)界定符。
    CRC Delimiter:置“1”。
    CRC的計(jì)算范圍包括起始段,仲裁段,控制段,數(shù)據(jù)段,接收方以同樣的算法計(jì)算CRC值并進(jìn)行比較,不一致會(huì)通報(bào)錯(cuò)誤。
    ⑥ 應(yīng)答段:表示確認(rèn)正常接收的段。ACK:包含應(yīng)答位和應(yīng)答界定符(2位)。
    發(fā)送節(jié)點(diǎn)的報(bào)文幀中,ACK兩位是隱性位,當(dāng)接收器正確地接收到有效的報(bào)文,接收器會(huì)在應(yīng)答位期間向發(fā)送節(jié)點(diǎn)發(fā)送一個(gè)顯性位,表示應(yīng)答。
    如果接收器發(fā)現(xiàn)這幀數(shù)據(jù)有錯(cuò)誤,則不向發(fā)送節(jié)點(diǎn)發(fā)送ACK應(yīng)答,發(fā)送節(jié)點(diǎn)會(huì)稍后重傳這幀數(shù)據(jù)。
    ⑦ 結(jié)束段:表示數(shù)據(jù)幀結(jié)束的段。EOF:幀結(jié)束標(biāo)志位(7位),全部為隱性位。如果這7位出現(xiàn)顯性位,則會(huì)引起填充錯(cuò)誤。
    IFS:幀間隔標(biāo)志位(7位),CAN控制器將接收到的幀正確的放入消息緩沖區(qū)是需要一定時(shí)間的,幀間隔可以提供這個(gè)時(shí)間。
  • 遠(yuǎn)程幀:接收單元向具有相同ID的發(fā)送單元請(qǐng)求數(shù)據(jù)的幀。
    遙控用于接收單元向具有相同 ID 的發(fā)送單元請(qǐng)求數(shù)據(jù)的幀,CANFD沒有遙控幀,只有經(jīng)典CAN有遠(yuǎn)程幀。遠(yuǎn)程幀相比數(shù)據(jù)幀沒有數(shù)據(jù)段。需要注意的是,目前CAN官方建議不再使用遠(yuǎn)程幀。
    擴(kuò)展格式相對(duì)于標(biāo)準(zhǔn)格式改動(dòng)的內(nèi)容如下:
    ①SRR:代替遠(yuǎn)程請(qǐng)求位,為隱性。所以當(dāng)標(biāo)準(zhǔn)幀與擴(kuò)展幀發(fā)送相互沖突并且擴(kuò)展幀的基本標(biāo)識(shí)符與標(biāo)準(zhǔn)幀的標(biāo)識(shí)符相同時(shí),標(biāo)準(zhǔn)幀優(yōu)先級(jí)高于擴(kuò)展幀。②IDE :為隱性位表示標(biāo)志位擴(kuò)展幀,18位擴(kuò)展標(biāo)識(shí)符緊跟著IDE位。③18位標(biāo)識(shí)符:增加18位標(biāo)識(shí)符。④r1:保留位。
  • 錯(cuò)誤幀:當(dāng)檢測(cè)出錯(cuò)誤時(shí)向其他單元通知錯(cuò)誤的幀。
    接收節(jié)點(diǎn)或者發(fā)送節(jié)點(diǎn)檢測(cè)出錯(cuò)誤時(shí),通知錯(cuò)誤的幀。
    主動(dòng)錯(cuò)誤標(biāo)志:6個(gè)bit的顯性位;被動(dòng)錯(cuò)誤標(biāo)志:6個(gè)bit的隱性位;錯(cuò)誤界定符:8個(gè)bit隱性位。
  • 過載幀:接收單元表明其自身尚未做好準(zhǔn)備的幀。
  • 幀間隔:將數(shù)據(jù)幀及遙控幀與前面的幀分離開來的幀。
    [/ol]4.2、CAN收發(fā)過程
  • 發(fā)送過程
    ① 設(shè)置發(fā)送節(jié)點(diǎn)的ID,DLC,數(shù)據(jù)等。
    ② 設(shè)置CAN控制器,啟動(dòng)發(fā)送幀。
    ③ 任何節(jié)點(diǎn),在總線空閑時(shí),都可以啟動(dòng)發(fā)送幀。
    ④ 除了啟動(dòng)數(shù)據(jù)發(fā)送的節(jié)點(diǎn),其余所有節(jié)點(diǎn)都在等待接收數(shù)據(jù)。
    ⑤ 如果多個(gè)節(jié)點(diǎn)同時(shí)啟動(dòng)數(shù)據(jù)發(fā)送,將進(jìn)行仲裁,ID值小的優(yōu)先處理,ID值大的停止發(fā)送,進(jìn)入接收狀態(tài)。
    ⑥ 此時(shí),僅有一個(gè)節(jié)點(diǎn)發(fā)送數(shù)據(jù),否則還有其它節(jié)點(diǎn)發(fā)送數(shù)據(jù)將造成異常。
    ⑦ 當(dāng)發(fā)送節(jié)點(diǎn)完成消息發(fā)送,將等待應(yīng)答bit被拉低為0,表示接收節(jié)點(diǎn)正常收到數(shù)據(jù)了。
    ⑧ 發(fā)送節(jié)點(diǎn)的數(shù)據(jù)已經(jīng)送達(dá)接收節(jié)點(diǎn),繼續(xù)發(fā)送頓數(shù)據(jù)中的結(jié)束段,之后發(fā)送節(jié)點(diǎn)將進(jìn)入接收狀態(tài)或者繼續(xù)發(fā)送下一幀數(shù)據(jù)。接收節(jié)點(diǎn)將處理收到的數(shù)據(jù)。
    ⑨ 此時(shí),任何數(shù)據(jù)都可以發(fā)送數(shù)據(jù),如果沒有節(jié)點(diǎn)發(fā)送數(shù)據(jù),總線將進(jìn)入空閑狀態(tài)。
    ⑩ 如果沒有收到應(yīng)答,將按照CAN錯(cuò)誤方式處理 。
  • 接收過程
    ① 所有節(jié)點(diǎn),除了發(fā)送數(shù)據(jù)的節(jié)點(diǎn)和處于總線關(guān)閉狀態(tài)的節(jié)點(diǎn),都處于監(jiān)聽狀態(tài)。
    ② CAN數(shù)據(jù)將按照前面說的CAN發(fā)送過程進(jìn)行數(shù)據(jù)發(fā)送。
    ③ 所有處于監(jiān)聽狀態(tài)的節(jié)點(diǎn)都將收到數(shù)據(jù),如果被認(rèn)為是沒有錯(cuò)誤的有效 CAN 消息,監(jiān)聽節(jié)點(diǎn)將應(yīng)答。
    ④ 如果接收節(jié)點(diǎn)設(shè)置了CAN過濾器,將根據(jù)過濾設(shè)置濾掉不需要的消息。
    [/ol]4.3、CAN錯(cuò)誤處理
    檢測(cè)到幀錯(cuò)誤處理:
  • 接收錯(cuò)誤的節(jié)點(diǎn)將拉低 (顯性電平0) 總線至少6個(gè)bit。
  • 超過5個(gè)bit相同極性,將觸發(fā)位填充,這個(gè)是硬件完成的,不需要用戶操作。
  • 錯(cuò)誤幀以通知發(fā)送給所有節(jié)點(diǎn),這個(gè)是硬件完成的。
  • 發(fā)送總線放棄當(dāng)前幀,8 bit的 TEC 發(fā)送錯(cuò)誤計(jì)數(shù)器寄存器的值加X。
  • 如果此TEC 等于0xFF,則發(fā)送節(jié)點(diǎn)將 BUSOFF (總線關(guān)閉) 并使自己脫離總線。
  • 如果不是,則嘗試重傳消息,該消息必須與其他消息一起再次經(jīng)過優(yōu)先級(jí)處理。
  • 所有其他節(jié)點(diǎn)放棄讀取當(dāng)前幀,REC接收錯(cuò)誤計(jì)數(shù)器寄存器的值加X。
  • 任何有消息排隊(duì)的節(jié)點(diǎn)現(xiàn)在都將啟動(dòng)發(fā)送,其它的節(jié)點(diǎn)進(jìn)去監(jiān)聽。
  • 如果每次傳輸一個(gè)幀或接收一幀成功,相應(yīng)的 TEC 和 REC 寄存器遞減 (通常只遞減 1)。
    [/ol]4.4、CAN波特率
    CANFD波特率計(jì)算,含仲裁階段可變波特率和數(shù)據(jù)階段可變波特率,而經(jīng)典CAN只有一種波特率。
    4.5、CAN過濾
    標(biāo)識(shí)符過濾器是用于接收的,發(fā)送的時(shí)候無(wú)需設(shè)置過濾器,根據(jù)發(fā)送端發(fā)送來的幀數(shù)據(jù),通過標(biāo)識(shí)符過濾器就可以設(shè)置僅接收需要接收的幀數(shù)據(jù)有效降低CPU多余的處理時(shí)間。
  • 經(jīng)典CAN支持標(biāo)識(shí)符列表模式和屏蔽位模式。
  • CANFD支持范圍過濾器 (Range filter) 、專用ID的過濾器 (Filter for dedicated IDs)和經(jīng)典位屏蔽過濾器 (Classic bit mask filter)。

    [/ol]總結(jié)本章介紹了CAN協(xié)議棧的發(fā)展歷史、電氣特性、基礎(chǔ)理論、標(biāo)準(zhǔn)協(xié)議棧解析等干貨知識(shí)點(diǎn)。
    第二章 CANopen協(xié)議棧詳解本章目錄前言
    一、CANopen簡(jiǎn)介二、CANopen的發(fā)展歷史三、CANopen ID四、CANopen協(xié)議?蚣芪、PDO六、SDO    6.1、快速SDO報(bào)文格式:    6.2、普通SDO報(bào)文格式:        6.2.1 普通SDO的讀操作報(bào)文格式        6.2.2 普通SDO的寫操作報(bào)文格式七、NMT八、時(shí)間戳協(xié)議九、同步協(xié)議十、緊急報(bào)文協(xié)議總結(jié)
    CANopen是基于CAN(控制器局域網(wǎng))總線的一種高級(jí)通信協(xié)議,被廣泛應(yīng)用于自動(dòng)化和嵌入式系統(tǒng)中。本章旨在提供詳細(xì)的CANopen相關(guān)知識(shí)、最佳實(shí)踐和實(shí)際應(yīng)用案例。包括但不限于CANopen標(biāo)準(zhǔn): 對(duì)CANopen規(guī)范進(jìn)行深入講解,包括但不限于通信對(duì)象(COB-ID)的管理,進(jìn)程數(shù)據(jù)對(duì)象(PDO)、服務(wù)數(shù)據(jù)對(duì)象(SDO)和網(wǎng)絡(luò)管理(NMT)等核心概念。一、CANopen簡(jiǎn)介CANopen是基于Can的應(yīng)用層協(xié)議,其報(bào)文分為過程數(shù)據(jù)對(duì)象 (PDO) 和服務(wù)數(shù)據(jù)對(duì)象(SDO)CANopen本身的設(shè)計(jì)目的就是實(shí)現(xiàn)小網(wǎng)絡(luò)、控制信號(hào)的實(shí)時(shí)通訊,所以為了節(jié)約時(shí)間開銷,最大限度保證實(shí)時(shí)性,CANopen作了一些定義:報(bào)文傳輸采用CAN標(biāo)準(zhǔn)幀格式,即11bit的ID域,以盡量減小傳輸時(shí)間;網(wǎng)絡(luò)控制報(bào)文均采用數(shù)據(jù)最小字節(jié)數(shù)。比如心跳報(bào)文,只有1個(gè)字節(jié)數(shù)據(jù);實(shí)時(shí)更新的過程數(shù)據(jù)無(wú)需接收方報(bào)文應(yīng)答,即采用生產(chǎn)消費(fèi)模型,降低總線負(fù)載;需要接收方確認(rèn)的配置參數(shù)一般都是采用快速單字傳輸,即1個(gè)報(bào)文最大傳送1個(gè)32位的參數(shù)變量,避免分幀引起的實(shí)時(shí)性降低。[/ol]
    從 OSI 的 7 層網(wǎng)絡(luò)模型的角度來看同,CAN(Controller Area Network)現(xiàn)場(chǎng)總線僅僅定義了第 1 層(物理層,見 ISO11898-2 標(biāo)準(zhǔn))、第 2 層(數(shù)據(jù)鏈路層,見 ISO11898-1 標(biāo)準(zhǔn));而在實(shí)際設(shè)計(jì)中,這兩層完全由硬件實(shí)現(xiàn),設(shè)計(jì)人員無(wú)需再為此開發(fā)相關(guān)軟件(Software)或固件(Firmware),只要了解如何調(diào)用相關(guān)的接口和寄存器,即可完成對(duì) CAN 的控制。

    CAN 總線的工業(yè)自動(dòng)化應(yīng)用中,由于設(shè)備的互通互聯(lián)的需求越來越多,所以需要一個(gè)開放的、標(biāo)準(zhǔn)化的高層協(xié)議:這個(gè)協(xié)議支持各種 CAN 廠商設(shè)備的互用性、互換性,能夠?qū)崿F(xiàn)在 CAN 網(wǎng)絡(luò)中提供標(biāo)準(zhǔn)的、統(tǒng)一的系統(tǒng)通訊模式,提供設(shè)備功能描述方式,執(zhí)行網(wǎng)絡(luò)管理功能。其中包括:應(yīng)用層(Application layer):為網(wǎng)絡(luò)中每一個(gè)有效設(shè)備都能夠提供一組有用的服務(wù)與協(xié)議。通訊描述(Communication profile):提供配置設(shè)備、通訊數(shù)據(jù)的含義,定義數(shù)據(jù)通訊方式。設(shè)備描述(Device proflile):為設(shè)備(類)增加符合規(guī)范的行為。[/ol]
    二、CANopen的發(fā)展歷史

    1994年CiA聯(lián)盟(CAN in Automation ) 發(fā)布CANopen首版CiA301,CANopen的成功不是一個(gè)大供應(yīng)商推動(dòng)的,而是眾多中小企業(yè)推動(dòng)的。早期的CANopen,CAN遠(yuǎn)程還受到青睞,并且節(jié)點(diǎn)保護(hù)也是基于遠(yuǎn)程幀設(shè)計(jì),后來被心跳報(bào)文取代,現(xiàn)在的CiA規(guī)范已經(jīng)不建議使用遠(yuǎn)程幀。CiA301是CANopen最重要的最重要的基礎(chǔ)協(xié)議,第一個(gè)版本已經(jīng)定義了PDO (過程數(shù)據(jù)對(duì)象)和SDO(服務(wù)數(shù)據(jù)對(duì)象)引入了PDO的同步傳輸以及網(wǎng)絡(luò)管理(NMT) 和緊急消息。后來在CiA301基礎(chǔ)之上,針對(duì)各個(gè)行業(yè)推出一大批子協(xié)議,[/ol]
    三、CANopen ID這里的CAN-ID也叫COB-ID(Communication Objectldentifier, 通信對(duì)象編號(hào))。Node-ID節(jié)點(diǎn)ID,最大128個(gè),范圍0-127。[/ol]

    根據(jù)不同的功能碼,預(yù)定的CAN-ID如下:


    四、CANopen協(xié)議?蚣


    五、PDOPDO簡(jiǎn)介:過程數(shù)據(jù),即單向傳輸,無(wú)需接收節(jié)點(diǎn)回應(yīng) CAN 報(bào)文來確認(rèn),從通訊術(shù)語(yǔ)上來說是于“生產(chǎn)消費(fèi)”模型,數(shù)據(jù)長(zhǎng)度被限制為 1~8 字節(jié)。最多只要 1 就可以把一條信息或者一個(gè)變量傳遞結(jié)束。

    PDO協(xié)議:節(jié)點(diǎn)的PDO共定義8個(gè)數(shù)據(jù)對(duì)象,TPDO 和 RPDO 分別有4個(gè),如下圖所示:

    PDO數(shù)據(jù)對(duì)象有三個(gè)重要參數(shù),分別為通訊參數(shù),映射參數(shù),數(shù)據(jù)存放。RPDO 通訊參數(shù) 1400h to15FFh,映射參數(shù) 1600h to 17FFh,數(shù)據(jù)存放為 2000h 之后廠商 自定義區(qū)域: TPDO 通訊參數(shù) 1800h to19FFh,映射參數(shù) 1A00h to 1BFFh,數(shù)據(jù)存放為 2000h 之后廠商自定義區(qū)域。所有的 PDO 傳送數(shù)據(jù)必須透過對(duì)象宇典映像到對(duì)應(yīng)的索引區(qū)上。
    PDO通訊參數(shù):

    ①Number of entries 參數(shù)條目數(shù)量: 即本索引中有幾條參數(shù);②COB-ID: 即這個(gè) PDO 發(fā)出或者接收的對(duì)應(yīng) CAN ID;③發(fā)送類型:即這個(gè) PDO 發(fā)送或者接收的傳輸形式,通常使用循環(huán)同步和異步制造商特定事件較多;④Inhibit time 生產(chǎn)禁止約束時(shí)間(1/10ms): 約束 PDO 發(fā)送的最小間隔,避免導(dǎo)致總線負(fù)載劇烈增加,比如數(shù)字量輸入過快,導(dǎo)致狀態(tài)改變發(fā)送的 TPDO 頻繁發(fā)送總線負(fù)載加大,所以需要一個(gè)約束時(shí)間來進(jìn)行“濾波”,這個(gè)時(shí)間單位為 0.lms;⑤Event timer 事件定時(shí)器觸發(fā)的時(shí)間(單位 ms):定時(shí)發(fā)送的 PDO,它的定時(shí)時(shí)間如果這個(gè)時(shí)間為 0,則這個(gè) PDO 為事件改變發(fā)送;⑥SYNC start value 同步起始值:同步傳輸?shù)?PDO,收到諾干個(gè)同步包后,才進(jìn)行發(fā)送,這個(gè)同步起始值就是同步包數(shù)量。比如設(shè)置為 2,即收到 2 個(gè)同步包后才進(jìn)行發(fā)送。
    PDO映射:[/ol]為了更加直觀地表現(xiàn)映射,將參數(shù)、應(yīng)用數(shù)據(jù)、CAN 報(bào)文數(shù)據(jù)聯(lián) 合起來展示,不同的映射采用不同的顏如下圖所示:


    六、SDOSDO簡(jiǎn)介:服務(wù)數(shù)據(jù),主要用于 CANopen 主站對(duì)從節(jié)點(diǎn)的參數(shù)配置。為每個(gè)消息都生成一個(gè)應(yīng)答,確保數(shù)據(jù)傳輸?shù)臏?zhǔn)確性,在一個(gè)CANopen 系統(tǒng)中,通常 CANopen 從節(jié)點(diǎn)作為 SDO 服務(wù)器,CANopen 主節(jié)點(diǎn)作為客戶端。

    SDO協(xié)議:SDO 分為快速 SDO 協(xié)議和普通SDO協(xié)議,快速SDO數(shù)據(jù)長(zhǎng)度最大4個(gè)字節(jié),普通SDO沒有最大限制。其報(bào)文格式如下圖所示,由命令碼、索引、子索引和數(shù)據(jù)組成。

    節(jié)點(diǎn)的SDO定義如下圖所示:

    SDO 客戶端通過索引和子索引,能夠訪問 SDO 服務(wù)器上的對(duì) 象字典。這樣 CANopen 主節(jié)點(diǎn)可以訪問從節(jié)點(diǎn)的任意對(duì)象字典項(xiàng)的參數(shù),并且 SDO 也可以 傳輸任何長(zhǎng)度的數(shù)據(jù)。發(fā)送方 (客戶端)發(fā)送 CAN-ID 為600h+Node-ID 的報(bào)文,Node-D 為接收方(服務(wù)器) 的節(jié)點(diǎn)地址,數(shù)據(jù)長(zhǎng)度均為 8 字節(jié),實(shí)際數(shù)據(jù)小于8字節(jié)時(shí),用0補(bǔ)齊到8字節(jié)。
    [/ol]
    快速SDO報(bào)文格式:快速SDO的讀報(bào)文格式如下圖所示:

    快速SDO的寫報(bào)文格式如下圖所示:

    說明:圖中的符號(hào)”-“表示數(shù)據(jù)不予考慮,使用0進(jìn)行填充。
    普通SDO報(bào)文格式:普通SDO傳輸?shù)挠行?shù)據(jù)長(zhǎng)度大于4個(gè)字節(jié),采用分段式傳輸方式,讀和寫均分成了三個(gè)階段:初始報(bào)文(在傳輸數(shù)據(jù)之前確認(rèn)要傳輸?shù)臄?shù)據(jù)長(zhǎng)度),傳輸過程報(bào)文(按照傳輸規(guī)格把數(shù)據(jù)進(jìn)行分段傳輸);結(jié)束報(bào)文(數(shù)據(jù)分段的最后一段數(shù)據(jù))。
    ①普通SDO的讀操作報(bào)文格式分段讀初始報(bào)文:獲取從站(服務(wù)器)指定索引對(duì)象的讀取數(shù)據(jù)長(zhǎng)度,與快速傳輸?shù)淖x指令一致使用0x40指令(這里同時(shí)也就說明分段讀取是由從設(shè)備的返回?cái)?shù)據(jù)所決定的,這里返回的是0x41指今而不是快速傳輸中的0x43、47等指令) 。

    分段讀傳輸過程報(bào)文:在傳輸過程中,主站(客戶端先發(fā)送指今0x60的報(bào)文開始讀傳輸,同時(shí)從站(服務(wù)器)響應(yīng)0x00指令的報(bào)文上傳一段數(shù)據(jù),下一主站發(fā)送0x70指令的報(bào)文,這時(shí)從站響應(yīng)0x10指令的報(bào)文繼續(xù)上傳下一段數(shù)據(jù),然后又會(huì)再次按照0x60-00、0x70-10的順序接著下傳輸后續(xù)的數(shù)據(jù),每次7個(gè)字節(jié),最后的一段數(shù)據(jù)將會(huì)進(jìn)入結(jié)束報(bào)文階段。只要總數(shù)據(jù)大小不超過7也會(huì)一開始直接進(jìn)入結(jié)束階段。

    分段讀結(jié)束報(bào)文:在上一個(gè)階段中,數(shù)據(jù)是按照0x60-00、0x70-10的順序進(jìn)行交替?zhèn)鬏,?dāng)發(fā)送到最后一段數(shù)據(jù)時(shí),主站并不知道是到達(dá)最后一段了,所以主站發(fā)送的“0x60或70“指令保持不變,而其對(duì)應(yīng)從站的響應(yīng)指令”0x00或10“替換成對(duì)應(yīng)的結(jié)束指令。

    ②普通SDO的寫操作報(bào)文格式分段寫初始報(bào)文:通知從站(服務(wù)器)指定索引對(duì)象的寫入數(shù)據(jù)長(zhǎng)度,使用0x21指令發(fā)送這個(gè)長(zhǎng)度值。

    分段寫傳輸過程報(bào)文:在傳輸過程中,主站(客戶端先發(fā)送指今0x00的報(bào)文開始讀傳輸,同時(shí)從站(服務(wù)器)響應(yīng)0x20指令的報(bào)文上傳一段數(shù)據(jù),下一主站發(fā)送0x10指令的報(bào)文,這時(shí)從站響應(yīng)0x30指令的報(bào)文繼續(xù)上傳下一段數(shù)據(jù):然后又會(huì)再次按照0x00-20、0x10-30的順序接著往下傳輸后續(xù)的數(shù)據(jù),每次7個(gè)字節(jié)。最后的一段數(shù)據(jù)將會(huì)進(jìn)入結(jié)束報(bào)文階段。只要總數(shù)據(jù)大小不超過7也會(huì)一開始直接進(jìn)入結(jié)束階段。

    分段寫結(jié)束報(bào)文:在上一個(gè)階段中,數(shù)據(jù)是按照0x00-20、0x10-30的順序進(jìn)行交替?zhèn)鬏,?dāng)發(fā)送到最后一段數(shù)據(jù)時(shí),主站會(huì)把“0x00或10“指令替換成對(duì)應(yīng)的結(jié)束指令,而其對(duì)應(yīng)的從站響應(yīng)指令”0x20或30“保持不變。

    [/ol]
    七、NMT網(wǎng)絡(luò)管理NMT(NetworkManagement)采用的主從方式,主機(jī)節(jié)點(diǎn)可以向從節(jié)點(diǎn)發(fā)送和請(qǐng)求數(shù)據(jù)。同一個(gè)網(wǎng)絡(luò)中只能有一個(gè)主節(jié)點(diǎn),一個(gè)或者多個(gè)從節(jié)點(diǎn)。

    NMT節(jié)點(diǎn)狀態(tài)切換:

    各種狀態(tài)下支持的報(bào)文操作:

    上線報(bào)文:

    心跳報(bào)文:

    NMT報(bào)文:[/ol]


    八、時(shí)間戳協(xié)議NMT主機(jī)發(fā)送自身的時(shí)鐘,為網(wǎng)絡(luò)各個(gè)節(jié)點(diǎn)提供公共的時(shí)間參考。


    九、同步協(xié)議該報(bào)文對(duì)象主要實(shí)現(xiàn)整個(gè)網(wǎng)絡(luò)的同步傳輸,一般同步報(bào)文由 NMT 主機(jī)發(fā)出。

    同步窗口時(shí)間:索引1007h 約束了同步發(fā)送后,從節(jié)點(diǎn)發(fā)送PDO 的時(shí)效,即在這個(gè)時(shí)間內(nèi)發(fā)送的 PDO 才有效超過時(shí)間的 PDO將被丟棄。通訊循環(huán)周期:索引1006h 規(guī)定了同步頓的循環(huán)周期。
    十、緊急報(bào)文協(xié)議當(dāng)設(shè)備內(nèi)部發(fā)生錯(cuò)誤,觸發(fā)該對(duì)象,發(fā)送設(shè)備內(nèi)部錯(cuò)誤代碼,提示 NMT 主站。緊急報(bào)文屬于診斷性報(bào)文,一般不會(huì)影響 CANopen 通訊。


    總結(jié)CANopen是基于CAN(控制器局域網(wǎng))總線的一種高級(jí)通信協(xié)議,被廣泛應(yīng)用于自動(dòng)化和嵌入式系統(tǒng)中。本章旨在提供詳細(xì)的CANopen相關(guān)知識(shí)、最佳實(shí)踐和實(shí)際應(yīng)用案例。包括但不限于CANopen標(biāo)準(zhǔn): 對(duì)CANopen規(guī)范進(jìn)行深入講解,包括但不限于通信對(duì)象(COB-ID)的管理,進(jìn)程數(shù)據(jù)對(duì)象(PDO)、服務(wù)數(shù)據(jù)對(duì)象(SDO)和網(wǎng)絡(luò)管理(NMT)等核心概念。
    end

    一口Linux

    關(guān)注,回復(fù)【1024】海量Linux資料贈(zèng)送
    精彩文章合集
    文章推薦
    ?【專輯】ARM?【專輯】粉絲問答?【專輯】所有原創(chuàng)?【專輯】linux入門?【專輯】計(jì)算機(jī)網(wǎng)絡(luò)?【專輯】Linux驅(qū)動(dòng)?【干貨】嵌入式驅(qū)動(dòng)工程師學(xué)習(xí)路線?【干貨】Linux嵌入式所有知識(shí)點(diǎn)-思維導(dǎo)圖
  • 發(fā)表回復(fù)

    本版積分規(guī)則

    關(guān)閉

    站長(zhǎng)推薦上一條 /1 下一條


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表