衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

開發者分享:輕松搞起CANFD

331062281 ? 來源:先楫半導體HPMicro ? 2023-08-01 10:28 ? 次閱讀

一、概述

先楫的CANFD外設,有兩個CANFD的IP,其中HPM6700系列,HPM6400系列、HPM6300系列使用的是CAN,包括了經典CAN和CANFD。而HPM6200系列則使用的MCAN系列,同樣也包括了經典CAN和CANFD。兩個CANFD有所差異,hpm_sdk也分為了兩個驅動文件,但基本的操作接口保持一致。

本文闡述HPM6700系列,HPM6400系列、HPM6300系列的CAN,這里就統稱為CAN。MCAN部分后續文章闡述。

先楫的CAN外設功能比較豐富,比如涉及到各種CAN模式、CAN錯誤警告提示、時間戳等等。可以看看手冊CAN特征描述。

035e4882-3013-11ee-9e74-dac502259ad0.png

本文主要介紹CAN的基礎配置(引腳時鐘初始化,波特率設置,正常模式下的收發流程),其他的功能可參考hpm_sdk,后續根據需要也會進行文章闡述。

本文以hpm_sdk的操作接口API為例子,進而介紹CAN的相關知識。

關于更多的CAN/CANFD知識可以訪問CIA官網,spec文檔可以參考ISO11898-1-2015。本文部分闡述都是基于CIA和ISO的描述參考。

二、實現流程

hpm_sdk中,關于can的例子在samples/drivers/can。使用的板子為hpm6750evk2.

(一)引腳初始化和功能時鐘初始化

對于CAN的引腳初始化,極其簡單,只需要把引腳復用為CAN功能即可。參考hpm6750evk2的board中的CAN初始化。參考board_init_can API

03a598cc-3013-11ee-9e74-dac502259ad0.png

對于CAN功能時鐘的開啟,在hpm6750手冊中,默認時鐘由時鐘源PLL1_CLK1F五分頻得到,PLL1_CLK1為400M,那么CAN的功能時鐘就為80M.

03d44f28-3013-11ee-9e74-dac502259ad0.png

同樣sdk當中也做了相關時鐘初始化,參考board_init_can_clock API

04060806-3013-11ee-9e74-dac502259ad0.png

(二)波特率設置

對于CAN差分信號,這里不做闡述,本文統稱的高低電平均為邏輯0和1。

uart一樣,都是需要每個位的的時間確定,保持雙方采樣的準確。在CAN的概念中,有一個比較重要的次,BitTime(CAN位時間),這個決定一個bit傳輸需要的時間,這也決定了波特率。比如一個位傳輸200ns,那么1S就可以傳輸100000000(ns)/200(ns) = 5000000bit,也就是5Mbps波特率。

在先楫官方HPM6700_HPM6400_UM手冊當中,對于CAN位時間有這么一段描述。

0416e842-3013-11ee-9e74-dac502259ad0.png

可以看到,一個位時序還包括了Sync_seg、Prop_Seg、Phase_Seg1, Phase_Seg2。Sample point指的是采樣點,也就是這段電平保持時間中的采樣位置點,比如200ns的位時間,采樣點80%,那么就是在160ns中采樣決定他是0或者是1。

在ISO11898-1:2015中,文檔也說明了這部分參數的定義。

0432c800-3013-11ee-9e74-dac502259ad0.png

04a08890-3013-11ee-9e74-dac502259ad0.png

這里比較重要的是Sync_Seg,這部分的位時間指的是同步段,用來同步CAN總線的節點,若檢測到的跳變沿被包含在此段的范圍內,那么時序就是同步的,采樣點sample_point采樣到的電平就是該位的電平。上述可知道,該段的時間固定為1TQ,其他段時間均是相位的緩沖段,補償邊沿階段的誤差,保證位電平的穩定和重新同步。具體可看ISO文檔解釋。

如果兩個節點位時間不同(各個位段時間不同),也就如果波特率不一樣或者差別到一定程度(CAN的波特率有一定的范圍,只要能保證采樣點的位置大致相同),那么采樣到的數據也有可能不一樣。所以對于位時間的各個段的參數需要保持一致,以便通信同步一致。

04dfdb44-3013-11ee-9e74-dac502259ad0.png

如果兩個節點位時間相同,CAN控制器會自身保持同步,同步的方式有兩種:硬同步和重新同步。

這兩種方式都必須遵守以下規則:

(1)、一位時間內(兩個采樣點之間)只允許一次同步。檢測到邊沿后,應禁用同步,直到下一次在采樣點檢測到的總線狀態為隱性。

(2)、僅當在前一個采樣點檢測到的總線狀態(前一個讀總線狀態)為隱性時,邊沿才應引起同步

(3)、當節點處于總線集成狀態時,在幀間間隔期間(除了間歇的第一位),以及在 CANFD 幀內,應在邊緣上執行硬同步。也就是在SOF上開始硬同步,其他bit都在重新同步。

(4)、滿足規則 1 和 2 的所有其他隱性到顯性邊緣均應用于重新同步,但有一個例外:傳輸 CANFD 幀的節點在傳輸該幀的數據階段時不應同步,而采取重新同步。

這里截取了ISO文檔說明:

052841fe-3013-11ee-9e74-dac502259ad0.png

1、硬件同步

在以上規則中,我們可以通過檢測SOF幀起始,SOF幀的開始就是在CAN總線空閑下(連續11個位的隱形電平,也就是邏輯1),一旦有顯性電平出現,那就是有SOF幀開始,根據上述規則1和2,可以直接使用的是硬同步。硬同步會強制把位時間拉至邊沿,保持同步。這個階段不受同步跳轉寬度SJW限制。

ISO文檔同樣也有說明:

06119b88-3013-11ee-9e74-dac502259ad0.png

比如:以下波形,當檢測到SOF時候,CAN控制器需要滿足ISO標準,執行硬同步。

0636b5bc-3013-11ee-9e74-dac502259ad0.png

2、重新同步

如果在仲裁段相當比較長的時間內,比如ID段,連續的傳輸會帶來相位的左右偏移,這時候就需要重新同步了。這時候就需要SJW,對seg1和seg2適當進行延長或縮短一定的TQ。

066449fa-3013-11ee-9e74-dac502259ad0.png

0699bdd8-3013-11ee-9e74-dac502259ad0.png

06c9b07e-3013-11ee-9e74-dac502259ad0.png

這看起來有點難理解,那么還是以時序圖來說明,以相位超前超后例子。

相位超前,CAN控制器會根據sjw同步跳轉寬度進行加入對應的TQ,使之sync_seg段能同步到下一個邊沿。

0732f6ce-3013-11ee-9e74-dac502259ad0.png

相位超后,CAN控制器會根據sjw同步跳轉寬度進行減少對應的TQ,使之sync_seg段能同步到下一個邊沿。

073f9fc8-3013-11ee-9e74-dac502259ad0.png

在上面的闡述中,采樣點的取值范圍尤為重要,對于同步上也是比較關鍵的參數,在ISO中并無此建議值,但是在hpm_sdk中有提及,建議是75%到87.5%。

078dadbc-3013-11ee-9e74-dac502259ad0.png

從上面講了一大堆,其實上面所闡述的一些同步均由CAN控制器實現,但是為了方便理解軟件開發,是有必要了解。

CAN的位時序涉及到CAN時基、sync_seq、sjw、seg1和seg2。在先楫當中也有涉及到這些寄存器,分為仲裁段(標稱位)和數據段位。需要注意的是:

先楫的CAN的seq1包括了位時序的sync_seg+prog_seg+phase_seq1。

先楫的CAN的seq2是位時序的phase_seq2。

根據ISO規定,sjw不計入到位時序中。

079de4ac-3013-11ee-9e74-dac502259ad0.png

3、hpm_sdk的波特率設置API

sdk的CAN驅動的波特率設置,寫的比較貼心,提供了兩種方式來設置。一種是直接代入實際的波特率,第二種是自己寫入位時序參數。根據use_lowlevel_timing_setting這個變量來決定哪種方式。

如果需要使能CANFD,則需要開啟enable_canfd,超過1M的數據段波特率,建議開啟enable_tdc。

這些參數的成員說明可以查看SDK的can_config_t結構體,這里不做闡述。

07f353d8-3013-11ee-9e74-dac502259ad0.png

對于直接代入實際的波特率的方式,sdk使用ISO文檔建議的位時序參數,適合通用的場合。

08417dba-3013-11ee-9e74-dac502259ad0.png

0867f40e-3013-11ee-9e74-dac502259ad0.png

SDK中,根據波特率轉換成對應的位時序參數。API接口是can_set_bit_timing。里面調用了can_calculate_bit_timing這個API得出位時序參數帶入到CAN的對應寄存器中,完成波特率的設置。

08b09c40-3013-11ee-9e74-dac502259ad0.png

can_calculate_bit_timing根據波特率和CAN時鐘先算出TQ和分頻系數相乘值num_tq_mul_prescaler,然后依次代入分頻系數直到算出tq和分頻系數等于num_tq_mul_prescaler,得出一個位時序的TQ數量,再根據采樣點范圍算出SEQ1和SEQ2,但會再匹配ISO建議的位時序參數的對應最小和最大值,保證在此范圍內。否則返回錯誤。

需要注意的是:

先楫的這個CAN外設的CANFD支持非ISO標準和ISO標準,也就是enable_can_fd_iso_mode,sdk默認是使用ISO標準,需要使用can_get_default_config這個API初始化參數。否則可能就是非ISO標準。

非ISO標準和ISO標準,對于經典CAN不受影響,但是CANFD會報CRC錯誤。

(三)收發數據流程

對于CAN幀結構,這里不做闡述。調用ISO文檔的截圖理解:

08e40760-3013-11ee-9e74-dac502259ad0.png

090ff5f0-3013-11ee-9e74-dac502259ad0.png

上述提到,對于接收來說,有16個FIFO;對于發送來說,有8個副發送緩沖器。這樣對于收發來說是相當足夠的。

在sdk當中,收發都提供了非阻塞和阻塞接口,分別對應的后綴是_noblocking或者blocking。

接收阻塞API:can_receive_message_blocking

接收非阻塞API:can_read_received_message

建議使用非阻塞API,開啟接收中斷以及滿FIFO中斷。在中斷讀取FIFO數量,最大性能提取數據,然后依次調用can_read_received_message。比如:

09382f34-3013-11ee-9e74-dac502259ad0.png

對于發送:

阻塞接口:can_send_message_blocking

非阻塞接口:can_send_message_nonblocking

建議使用非阻塞接口,每次調用前判斷發送緩沖器是否滿,然后依次調用can_send_message_nonblocking塞入數據。比如:

0950df52-3013-11ee-9e74-dac502259ad0.png

(四)實現效果

HPM6750的四路CANFD,在500K仲裁段5M數據段的波特率下,可以幾乎跑滿載。

097132c0-3013-11ee-9e74-dac502259ad0.png

實驗平臺:hpm6750evkmini+stephen大佬開發的CANFD適配擴展板。

三、總結

對于CAN的,本文主要闡述波特率設置、數據收發流程。其他的比如過濾器組設置、總線錯誤等后續再闡述。

先楫HPM_SDK對于CAN驅動,相關API接口以及結構體定義比較清晰,容易入手使用。

先楫的CANFD的收發自帶FIFO緩存器,開發者可以根據需求使用,可以提高收發性能,達到滿載測試性能。





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • CAN總線
    +關注

    關注

    145

    文章

    1955

    瀏覽量

    131098
  • CAN控制器
    +關注

    關注

    3

    文章

    74

    瀏覽量

    15103
  • PLL電路
    +關注

    關注

    0

    文章

    92

    瀏覽量

    6475
  • CANFD
    +關注

    關注

    0

    文章

    59

    瀏覽量

    5014
  • HPM6750
    +關注

    關注

    0

    文章

    2

    瀏覽量

    128

原文標題:開發者分享:[玩轉先楫CANFD外設系列之一]輕松搞起CANFD

文章出處:【微信號:HPMicro,微信公眾號:先楫半導體HPMicro】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    玩轉先楫CANFD外設系列之一:輕松搞起CANFD

    一、概述先楫的CANFD外設,有兩個CANFD的IP,其中HPM6700系列,HPM6400系列、HPM6300系列使用的是CAN,包括了經典CAN和CANFD。而HPM6200系列則使用的MCAN
    的頭像 發表于 08-02 08:20 ?2815次閱讀
    玩轉先楫<b class='flag-5'>CANFD</b>外設系列之一:<b class='flag-5'>輕松</b><b class='flag-5'>搞起</b><b class='flag-5'>CANFD</b>

    OpenHarmony開發者文檔

    此工程存放OpenHarmony提供的快速入門、開發指南、API參考等開發者文檔,歡迎參與OpenHarmony開發者文檔開源項目,與我們一起完善開發者文檔。View English文
    發表于 04-23 18:08

    喜報|HarmonyOS開發者社區連獲業內獎項,持續深耕開發者生態

    臨近年末,各大平臺陸續揭曉年度榜單,表彰了具備強大影響力與做出突出貢獻的優秀項目與團隊,而HarmonyOS開發者社區作為技術分享,學習和展示的平臺,輸出高質量技術文章百余篇,連續獲得業內各大
    發表于 01-19 14:32

    華為開發者大會2021:鴻蒙輕松實現操作系統靈活組裝

    華為開發者大會2021正在進行中,重磅亮相的鴻蒙系統可以輕松實現操作系統靈活組裝,全新harmony OS助力智能車艙實現全新生態。
    的頭像 發表于 10-22 15:05 ?1301次閱讀
    華為<b class='flag-5'>開發者</b>大會2021:鴻蒙<b class='flag-5'>輕松</b>實現操作系統靈活組裝

    華為2021開發者大會最新消息

    華為開發者大會2021在中國松山湖舉行,會上,華為公司基于OpenHarmony提供了HarmonyOS和鴻蒙智聯,備開發者可以根據不同硬件靈活選擇組件,輕松完成操作系統組裝。
    的頭像 發表于 10-26 14:20 ?2251次閱讀

    OPPO開發者大會:開發者需要以用戶為中心進行開發

    OPPO開發者大會:開發者需要以用戶為中心進行開發 OPPO開發者大會劉暢表示,萬物互融時代泛在開發者需要以用戶為中心進行
    的頭像 發表于 10-27 10:44 ?1705次閱讀
    OPPO<b class='flag-5'>開發者</b>大會:<b class='flag-5'>開發者</b>需要以用戶為中心進行<b class='flag-5'>開發</b>

    OPPO開發者大會:OPPO將持續為開發者提供幫助

    2021 OPPO開發者大會劉暢表示;OPPO將為開發者提供技術來保障開發者,提供全鏈路的運營發展。
    的頭像 發表于 10-27 10:45 ?1528次閱讀
    OPPO<b class='flag-5'>開發者</b>大會:OPPO將持續為<b class='flag-5'>開發者</b>提供幫助

    2021 OPPO開發者大會主會場:ColorOS與開發者攜手共行

    2021 OPPO開發者大會主會場:ColorOS與開發者攜手共行
    的頭像 發表于 10-27 10:51 ?1723次閱讀
    2021 OPPO<b class='flag-5'>開發者</b>大會主會場:ColorOS與<b class='flag-5'>開發者</b>攜手共行

    2021 OPPO開發者大會:異構計算開發者價值

    2021 OPPO開發者大會:異構計算開發者價值 2021 OPPO開發者大會上介紹了異構計算開發者價值。 責任編輯:haq
    的頭像 發表于 10-27 11:10 ?1867次閱讀
    2021 OPPO<b class='flag-5'>開發者</b>大會:異構計算<b class='flag-5'>開發者</b>價值

    2021 OPPO開發者大會主會場:邀請開發者共建小布生態

    2021 OPPO開發者大會主會場:邀請開發者共建小布生態
    的頭像 發表于 10-27 11:24 ?1777次閱讀
    2021 OPPO<b class='flag-5'>開發者</b>大會主會場:邀請<b class='flag-5'>開發者</b>共建小布生態

    OPPO開發者大會2021:OPPO與開發者攜手,推進生態變革

     2021 OPPO開發者大會主會場:OPPO與開發者攜手,推進生態變革。
    的頭像 發表于 10-27 11:31 ?2475次閱讀
    OPPO<b class='flag-5'>開發者</b>大會2021:OPPO與<b class='flag-5'>開發者</b>攜手,推進生態變革

    2021年OPPO開發者大會:賦能開發者

    小布開放平臺將為軟硬件開發者提供AI基礎能力支撐,全面降低開發者運用AI核心能力進行開發的門檻,賦能開發者
    的頭像 發表于 10-27 14:17 ?1449次閱讀
    2021年OPPO<b class='flag-5'>開發者</b>大會:賦能<b class='flag-5'>開發者</b>

    2021 OPPO開發者大會:小布開發者平臺生態

    2021 OPPO開發者大會:小布開發者平臺生態 2021 OPPO開發者大會上介紹了小布開發者平臺生態。 責任編輯:haq
    的頭像 發表于 10-27 14:33 ?2427次閱讀
    2021 OPPO<b class='flag-5'>開發者</b>大會:小布<b class='flag-5'>開發者</b>平臺生態

    2021 OPPO開發者大會:OPPO滿足開發者需求

    2021 OPPO開發者大會:OPPO滿足開發者需求 2021 OPPO開發者大會上介紹了開發者需求以及OPPO可提供的資源。 責任編輯:haq
    的頭像 發表于 10-27 14:40 ?3381次閱讀
    2021 OPPO<b class='flag-5'>開發者</b>大會:OPPO滿足<b class='flag-5'>開發者</b>需求

    涂鴉開發者大會即將開幕,賦能開發者打造IoT發展新引擎

    6月29日,首場TUYA開發者大會將在深圳拉開序幕!?????TUYA開發者大會是涂鴉繼全球智能化商業峰會、全球硬科技開發者大會后,面向全球開發者舉辦的又一場備受矚目的IoT領域頂級盛
    的頭像 發表于 06-12 10:15 ?733次閱讀
    涂鴉<b class='flag-5'>開發者</b>大會即將開幕,賦能<b class='flag-5'>開發者</b>打造IoT發展新引擎
    牌九百家乐官网的玩法技巧和规则| 六合彩号码| 乐享百家乐官网的玩法技巧和规则 | 欢乐谷百家乐官网的玩法技巧和规则| 上游棋牌下载| 百家乐算牌e世博| 百家乐官网赢法口诀| 公海百家乐的玩法技巧和规则| 网络百家乐官网的破解| 威尼斯人娱乐城客服| 真人百家乐官网网络游戏信誉怎么样| 足球系统出租| 百家乐英皇娱乐场开户注册| 百家乐官网游戏网上投注| 六合彩138| 百家乐园选百利宫| 澳门百家乐官网指数| 威尼斯人娱乐城客服| 百家乐网站哪个好| 百家乐官网桌出租| 云鼎娱乐城信誉度| 真人百家乐游戏网| 长江百家乐官网的玩法技巧和规则| 渑池县| 全讯网353788| 澳门百家乐玩法| 百家乐官网关台| 战神线上娱乐| 墨尔本百家乐的玩法技巧和规则| 至富百家乐官网的玩法技巧和规则| 百家乐官网游戏机子| 德州扑克与梭哈| 优惠搏百家乐的玩法技巧和规则| 四方百家乐官网的玩法技巧和规则 | 百家乐官网园蒙特卡罗| 百家乐官网游戏如何玩| 斗牛棋牌游戏| 百家乐有没有破解之法| 财神百家乐官网的玩法技巧和规则 | 成安县| 真人娱乐城排行榜|