SemiDrive E3 SSDK CAN 驅動移植

一、 概述

官方例程都是適用於單個功能模塊的具體功能,但使用端需要將多個功能模塊移植到一個工程環境,以此來適配不同的硬體環境;本文將以 CAN 驅動移植為例,介紹驅動移植過程中可能存在的問題點,或需要注意的地方,以節省開發時間。

硬體平台:E3640 官方開發板(SD103_E3_GATEWAY_ePOWERTRAIN_A03_019),如下圖所示;

軟體平台:e3_gateway_E3640_mcu_demo_E3_SSDK_PTG3.0 中 app_demo XIP Bootloader、 driver_demo flexcan fifo  兩個例程。

                                                                                                                                                               圖1 E3640 官方開發板

 

二、  IAR 環境配置

為了方便在 Bootloader 軟體中做功能調試,將屏蔽從 Bootloader 跳轉至 app 函數 sdrv_core_force_remap(SDRV_REMAP_SF, SF_MEM_BASE)。

Bootloader 軟體通過 JTAG 有兩種燒寫方式,方式 1 :軟體選擇 Debug 模式,將開發板的 boot 撥至 1110 模式,直接點擊  將軟體運行在 IRAM 上;方式 2 :軟體選擇 Flashdebug 模式,將開發板的 boot 撥至 1110 模式,直接點擊 Project -> Download -> Erase memory,再點擊 Project -> Download -> Download active application,將軟體燒寫到 Flash 中,給開發板斷電,將 boot 撥至 0000 模式運行。

註:方式 2 ,先編譯一下 sf 軟體,再編譯 bootloader 軟體,否則會出錯。


三、 軟體移植

1.  CAN 配置文件添加至工程

將 CAN 驅動配置文件添加至工程中,添加文件的路徑:D:\ e3_gateway_E3640\boards\e3_gateway\driver_demo\flexcan\fifo\configs flexcan_cfg.c、flexcan_cfg.h 兩個文件複製,粘貼至這個路徑 D:\ e3_gateway_E3640\boards\e3_gateway\app_demo\xip\bootloader\configs。

將 flexcan_cfg.c  文件添加至 IAR 編譯環境中,如圖所示,關於配置文件一般建議添加至 boards 文件夾中。


                                                                                                                                  圖2 c 文件添加至 IAR 編譯環境

將 flexcan_cfg.h  頭文件添加至 IAR  編譯環境中,如圖所示, Options for node "bootloader"->Assembler->preprocessor。

                                                                                                                                  圖3 h 頭文件添加至 IAR 編譯環境

2.  CAN 驅動文件添加至工程

bootloader–FlashDebug -> drivers -> 右擊 -> Add -> Add files -> sdrv_flexcan.c,為方便管理工程文件,將 sdrv_flexcan.c 文件添加至 drivers 文件中,如圖所示。


                                                                                                                                  圖 4 c 文件添加至 drivers 文件

將 sdrv_flexcan.h 頭文件添加至 IAR 工程文件,在 Options for node "bootloader"->Assembler->preprocessor 如圖所示:


                                                                                                                                  圖 5 h 頭文件添加至 IAR 工程文件

3.  reset_cfg.c 文件修改


                                                                                                                                   圖 6 board_reset_array 結構體修改

將 rstsig_canfd3_4 外設添加至系統 reset_cfg.c 文件中,使系統復位時同時將 rstsig_canfd3_4 外設復位,否則會出現 CAN 斷言錯誤。

註:在做底層驅動移植時,要注意這個 board_reset_array 結構體變量的內容,將相應的外設添加至系統復位結構體中,否則系統會出現不穩定錯誤,同時注意 NUM_OF_RSTGEN_SIGS 變量的修改。


4.  config.h 文件修改

增加如下兩個宏開關,
#define CONFIG_IRQ 1 
#define CONFIG_VIC_IRQ_INTERRUPT_MODE 1

註:如果增加宏開關編譯工程出錯, “no definition for "vectored_irq1_handler"”,在 drivers 中增加 sdrv_vic_s.S 文件,即可編譯通過。


5.  代碼修改


CAN中斷回調函數

static void flexcan_transfer_callback(flexcan_handle_t *handle,flexcan_status_e status, uint32_t result, void *userData)

{

    flexcan_frame_t *buf = (flexcan_frame_t *)userData;

 

    switch (status) {

    case FLEXCAN_RX_IDLE:

        /* CAN接收數據中斷,接收數據buf */

        break;

    case FLEXCAN_RX_FIFO_IDLE:

        /* CAN接收數據中斷,接收數據buf */

        break;

    case FLEXCAN_TX_IDLE:

        /* CAN發送成功中斷 */

        break;

    case FLEXCAN_WAKEUP_TIMEOUT:

        break;

    case FLEXCAN_WAKEUP_MATCH:

        break;

    case FLEXCAN_ERROR_STATUS:

        break;

    default:

        break;

    }

}


6.  代碼測試

6.1    CAN 數據發送

周期發送代碼如下:

static void flexcan_send_demo(flexcan_handle_t *handle, uint8_t tx_index)

{

    flexcan_frame_t frame = {.id = 0x327,

                             .length = 8,

                             .type = FLEXCAN_FrameTypeData,

                             .format = FLEXCAN_STANDARD_FRAME,

                             .dataBuffer = &send_data[0]};

    flexcan_mb_transfer_t xfer = {&frame, tx_index};

 

    if (flexcan_get_mb_state(handle, tx_index) == FLEXCAN_StateIdle) {

        flexcan_send_nonblocking(handle, &xfer, TX_PADDING_VAL);

    } else {

        ssdk_printf(SSDK_NOTICE,

                    "controller_id=%d mb%d is not available for send\r\n",

                    handle->controller_id, tx_index);

    }

}

用 CAN 盒接收的數據如下:



圖7 CAN 盒接收的數據

 



圖 8 串口助手列印CAN發送數據幀圖

 

6.2    CAN 數據接收

軟體例程採用硬體濾波方式對數據進行過濾,用 CAN 盒模擬發送數據幀,0x327 00 11 22 33 44 55 66 77,如下圖所示,通過串口調試助手列印輸出的 CAN 接收幀信息如下圖所示。


圖 9 CAN 模擬數據幀發送



圖 10 串口助手列印 CAN 接收數據幀圖

 

四、 參考文檔

《AppNote_E3_Boot_and_OTA_Rev01.05》

《AppNote_E3_燒錄流程_Rev2.0》



歡迎在博文下方留言評論,我們會及時回復您的問題。如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com

作者:Linna / 王麗娜 

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論

Corgi

Corgi

1 個月前
回复楼上,需要配置接受掩码mask
佚枫

佚枫

5 個月前
你好,请问一下只接收指定canid的数据请问该如何设置