0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學(xué)習在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區
會(huì )員中心
創(chuàng )作中心

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

3天內不再提示

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

先楫半導體HPMicro ? 2023-08-02 08:20 ? 次閱讀

一、概述

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


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


先楫的CAN外設功能比較豐富,比如涉及到各種CAN模式、CAN錯誤警告提示、時(shí)間戳等等??梢钥纯词謨訡AN特征描述。


69eb1e24-30ca-11ee-bbcf-dac502259ad0.png

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


本文以hpm_sdk的操作接口A(yíng)PI為例子,進(jìn)而介紹CAN的相關(guān)知識。

關(guān)于更多的CAN/CANFD知識可以訪(fǎng)問(wèn)CIA官網(wǎng),spec文檔可以參考ISO11898-1-2015。本文部分闡述都是基于CIA和ISO的描述參考。

二、實(shí)現流程

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


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

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

6a2b703c-30ca-11ee-bbcf-dac502259ad0.png

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

6a44d126-30ca-11ee-bbcf-dac502259ad0.png

同樣sdk當中也做了相關(guān)時(shí)鐘初始化,參考board_init_can_clock API

6a708b54-30ca-11ee-bbcf-dac502259ad0.png

(二)波特率設置

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

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

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

6a7a8582-30ca-11ee-bbcf-dac502259ad0.png

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

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

6ae74d16-30ca-11ee-bbcf-dac502259ad0.png

6b24c524-30ca-11ee-bbcf-dac502259ad0.png

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

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


6b776bd0-30ca-11ee-bbcf-dac502259ad0.png

如果兩個(gè)節點(diǎn)位時(shí)間相同,CAN控制器會(huì )自身保持同步,同步的方式有兩種:硬同步和重新同步。


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

(1)、一位時(shí)間內(兩個(gè)采樣點(diǎn)之間)只允許一次同步。檢測到邊沿后,應禁用同步,直到下一次在采樣點(diǎn)檢測到的總線(xiàn)狀態(tài)為隱性。


(2)、僅當在前一個(gè)采樣點(diǎn)檢測到的總線(xiàn)狀態(tài)(前一個(gè)讀總線(xiàn)狀態(tài))為隱性時(shí),邊沿才應引起同步

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


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


這里截取了ISO文檔說(shuō)明:

6bdee1c0-30ca-11ee-bbcf-dac502259ad0.png

1、硬件同步

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

ISO文檔同樣也有說(shuō)明:

6bfeee48-30ca-11ee-bbcf-dac502259ad0.png

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

6c5f18c2-30ca-11ee-bbcf-dac502259ad0.png

2、重新同步

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

6c9c8932-30ca-11ee-bbcf-dac502259ad0.png

6caee83e-30ca-11ee-bbcf-dac502259ad0.png

6ce6798e-30ca-11ee-bbcf-dac502259ad0.png

這看起來(lái)有點(diǎn)難理解,那么還是以時(shí)序圖來(lái)說(shuō)明,以相位超前超后例子。

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

6d4ac808-30ca-11ee-bbcf-dac502259ad0.png

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

6d5cea38-30ca-11ee-bbcf-dac502259ad0.png

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

6d951156-30ca-11ee-bbcf-dac502259ad0.png

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

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

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


先楫的CAN的seq2是位時(shí)序的phase_seq2。


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


6dbbd476-30ca-11ee-bbcf-dac502259ad0.png

3、hpm_sdk的波特率設置API

sdk的CAN驅動(dòng)的波特率設置,寫(xiě)的比較貼心,提供了兩種方式來(lái)設置。一種是直接代入實(shí)際的波特率,第二種是自己寫(xiě)入位時(shí)序參數。根據use_lowlevel_timing_setting這個(gè)變量來(lái)決定哪種方式。

如果需要使能CANFD,則需要開(kāi)啟enable_canfd,超過(guò)1M的數據段波特率,建議開(kāi)啟enable_tdc。

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

6de6bfce-30ca-11ee-bbcf-dac502259ad0.png

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

6e41624e-30ca-11ee-bbcf-dac502259ad0.png

6e8b316c-30ca-11ee-bbcf-dac502259ad0.png

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

6eb21b6a-30ca-11ee-bbcf-dac502259ad0.png

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

需要注意的是:

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

非ISO標準和ISO標準,對于經(jīng)典CAN不受影響,但是CANFD會(huì )報CRC錯誤。


(三)收發(fā)數據流程

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

6edf6318-30ca-11ee-bbcf-dac502259ad0.png

6f13bb5e-30ca-11ee-bbcf-dac502259ad0.png

上述提到,對于接收來(lái)說(shuō),有16個(gè)FIFO;對于發(fā)送來(lái)說(shuō),有8個(gè)副發(fā)送緩沖器。這樣對于收發(fā)來(lái)說(shuō)是相當足夠的。

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


接收阻塞API:can_receive_message_blocking

接收非阻塞API:can_read_received_message

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

6f299654-30ca-11ee-bbcf-dac502259ad0.png

對于發(fā)送:

阻塞接口:can_send_message_blocking

非阻塞接口:can_send_message_nonblocking

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

6f6f52d4-30ca-11ee-bbcf-dac502259ad0.png


(四)實(shí)現效果

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

6f87201c-30ca-11ee-bbcf-dac502259ad0.png

實(shí)驗平臺:hpm6750evkmini+stephen大佬開(kāi)發(fā)的CANFD適配擴展板。

6fa86c2c-30ca-11ee-bbcf-dac502259ad0.png

三、總結

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

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

先楫的CANFD的收發(fā)自帶FIFO緩存器,開(kāi)發(fā)者可以根據需求使用,可以提高收發(fā)性能,達到滿(mǎn)載測試性能。

聲明:本文內容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權轉載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習之用,如有內容侵權或者其他違規問(wèn)題,請聯(lián)系本站處理。 舉報投訴
  • CAN
    CAN
    +關(guān)注

    關(guān)注

    56

    文章

    2512

    瀏覽量

    460775
  • 模式
    +關(guān)注

    關(guān)注

    0

    文章

    63

    瀏覽量

    13312
  • CANFD
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

    4828
  • 先楫半導體
    +關(guān)注

    關(guān)注

    9

    文章

    194

    瀏覽量

    1876
收藏 人收藏

    評論

    相關(guān)推薦

    CYT2B75 SK Rev03無(wú)法正常發(fā)送CANFD數據,為什么?

    (T2G_Sample_Driver_Library_8.0.0tviibe1msrcexamplescanfdUseAsCANFDMode),代碼未經(jīng)過(guò)任何修改,測試CANFD功能,初始化完成,debug,首次調用 Cy_CANFD_UpdateAndTransmitM
    發(fā)表于 05-24 07:37

    一幀CANFD報文由多少個(gè)位組成?

    要想知道CANFD報文由多少個(gè)位組成,那么我們就要了解CANFD幀結構,知道每個(gè)段占用位數從而得出CANFD報文位數。
    的頭像 發(fā)表于 04-27 06:08 ?1128次閱讀
    一幀<b class='flag-5'>CANFD</b>報文由多少個(gè)位組成?

    想將CANFD配置為8MBPS波特率,TESTBOARD_150PC_OUT如何配置嗎?

    我想將 CANFD 配置為 8MBPS 波特率,您可以幫我看看TESTBOARD_150PC_OUT如何配置嗎? 我配置了 2mbps 的波特率,工作正常,但無(wú)法配置 8mbps 的波特率,獨木舟和控制器之間存在同步問(wèn)題,我收到 Canfd Tx 錯誤。
    發(fā)表于 03-04 06:31

    TC275D系列的芯片支持標準CANFD能配置成非標準CANFD的嗎?

    TC275D系列的芯片支持標準CANFD,是否也能配置成非標準CANFD的呢,有那位技術(shù)人員配置過(guò)嗎?
    發(fā)表于 02-06 08:31

    使用CYT2B75芯片CANFD模塊無(wú)法發(fā)送消息是什么原因導致的呢?

    你好,我使用SDL的example中的CANFD代碼測試CYT2B75芯片CANFD模塊,對部分代碼進(jìn)行了硬件適配修改,詳見(jiàn)附件,配置為每秒發(fā)送次CAN報文。 問(wèn)題:消息發(fā)送失敗,且電腦上位機無(wú)法
    發(fā)表于 02-02 06:57

    CANFD SDL無(wú)法被接收到的原因?

    任何 CANFD 消息,如果把 cy_stc_canfd_config_t 的 .canFDMode 改為 false 就可以收到,是因為 BAUDRATE 與 DATARATE 的關(guān)系嗎 ?,我應該要填多少 ?,該怎么從代碼推算呢 ?
    發(fā)表于 02-01 07:27

    求助,關(guān)于M467系列CANFD的BSP例程疑問(wèn)

    _RX_FIFO1_STD_MASK,和CANFD_RX_FIFO0_STD_MASK 有什么區別嗎 另外 看到個(gè)CANFD通道有2個(gè)中斷,請問(wèn)該具體的如何使用??? CANFD0
    發(fā)表于 01-16 08:19

    M467的CANFD通道如何使傳送效率最高?

    現在我在用M467-64PIN 進(jìn)行解算與數據收發(fā); M467的CANFD通道,如何使傳送效率最高? 例如使用1M+5M傳輸模式,如何使傳送效率最高? 例如循環(huán)發(fā)送64 Byte的計算數據,需要
    發(fā)表于 01-16 06:18

    CAN與CANFD的區別 CAN與CANFD如何轉換

    CAN與CANFD的區別 CAN與CANFD如何轉換? CAN(Controller Area Network)是一種廣泛應用于汽車(chē)和工業(yè)控制系統等領(lǐng)域的串行通信協(xié)議,用于在不同的設備間傳輸數據
    的頭像 發(fā)表于 11-22 16:37 ?4364次閱讀

    RA MCU CANFD在FSP中的配置詳解

    在瑞薩RA系列MCU產(chǎn)品中,目前RA4E2、RA4T1、RA6E2、RA6T2和RA6T3搭載了CANFD Lite(硬件手冊中成為CANFD_B)模塊,相關(guān)的詳細IP介紹,請參見(jiàn)之前的文章
    的頭像 發(fā)表于 10-20 14:46 ?756次閱讀
    RA MCU <b class='flag-5'>CANFD</b>在FSP中的配置詳解

    如何使用M460系列微控制器接收和打印CANFD信息

    : NuMaker-M467HJ V1.0 這是個(gè)簡(jiǎn)單的示例代碼,使用M460系列微控制器接收和打印CANFD信息。 M460系列 MCU有
    發(fā)表于 08-29 07:55

    如何使用M460系列MCU周期性傳送CANFD信息

    應用:本示例代碼使用M460系列MCU周期性傳送CANFD信息。 BSP 版本: M460_Series_BSP_CMSIS_V3.00.001.001 硬件: NuMaker-M467HJ
    發(fā)表于 08-29 07:14

    CAN外設的接收過(guò)濾器設置

    數據記錄設備中的存儲空間。 ????從上篇文章《[玩轉先楫CANFD外設系列之一]輕松
    的頭像 發(fā)表于 08-24 09:03 ?1148次閱讀
    CAN<b class='flag-5'>外設</b>的接收過(guò)濾器設置

    玩轉先楫CANFD外設系列之二:CAN外設的接收過(guò)濾器詳解

    設備中的存儲空間。從上篇文章《[玩轉先楫CANFD外設系列之一]輕松
    的頭像 發(fā)表于 08-24 08:20 ?1559次閱讀
    <b class='flag-5'>玩轉</b>先楫<b class='flag-5'>CANFD</b><b class='flag-5'>外設</b><b class='flag-5'>系列</b>之二:CAN<b class='flag-5'>外設</b>的接收過(guò)濾器詳解

    開(kāi)發(fā)者分享:輕松搞起CANFD

    先楫的CANFD外設,有兩個(gè)CANFD的IP,其中HPM6700系列,HPM6400系列、HPM6300
    的頭像 發(fā)表于 08-01 10:28 ?1693次閱讀
    開(kāi)發(fā)者分享:<b class='flag-5'>輕松</b><b class='flag-5'>搞起</b><b class='flag-5'>CANFD</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看