色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

干貨分享|基于HPM6750 CAN2.0 及 CAN- FD 操作指南

先楫半導體HPMicro ? 2022-06-16 09:13 ? 次閱讀

簡介


本文主要介紹了HPM6750的控制器局域網CAN(以下簡稱CAN控制器)的概述以及基于HPM-SDK CAN控制器的開發指導(包括實現CAN2.0、CAN-FD)。


CAN控制器

1. 概述

CAN 是 Controller Area Network 的縮寫(以下稱為 CAN),是 ISO 國際標準化的串行通信協議。HPM6750 MCU搭載了4路CAN控制器,CAN0/CAN1/CAN2/CAN3,它們具有如下特性:


● 支持 CAN 2.0B 協議,支持多達 8 字節的數據載荷, 數據速率可達 1Mbit/s?

● 支持 CAN FD 協議,支持多達 64 字節的數據載荷, 數據速率可達 2.5Mbit/s?

● 支持 1 ~ 1/256 的波特率預分頻,靈活配置波特率?

● 16 個接收緩沖器?

– FIFO 方式?

– 錯誤或者不被接收的數據不會覆蓋存儲的消息?

● 1 個高優先主發送緩沖器 PTB?

● 8 個副發送緩沖器 STB?

– FIFO 方式?

– 優先級仲裁方式?

● 16 組獨立的篩選器?

– 支持 11 位標準 ID 和 29 位擴展 ID?

– 可編程 ID CODE 位以及 MASK 位?

● PTB/STB 均支持支持單次發送模式?

● 支持靜默模式?

● 支持回環模式?

● 支持待機模式?

● 支持捕捉傳輸的錯誤種類以及定位仲裁失敗位置?

● 可編程的錯誤警告值?

● 支持 ISO11898-4 規定時間觸發 CAN 以及接收時間戳可配置停止位:1位,1.5位或者2位。

2. 系統框圖

1cafecd8-e6f8-11ec-aa96-dac502259ad0.png

3. 管腳


管腳名稱
方向
功能說明
RXD
輸入
CAN接受數據信號
TXD
輸出
CAN 發送數據信號
STBY
輸出
CAN 外部收發器待機控制信號

CAN控制器功能開發指引

1. API功能描述


CAN開發主要使用以下接口

//獲取CAN默認配置hpm_stat_t can_get_default_config(can_config_t *config);//CAN初始化接口hpm_stat_t can_init(CAN_Type *base, can_config_t *config, uint32_t src_clk_freq);//接收過濾器配置hpm_stat_t can_set_filter(CAN_Type *base, const can_filter_config_t *config);//CAN數據發送接口(阻塞模式)hpm_stat_t can_send_message_blocking(CAN_Type *base, const can_transmit_buf_t *message);//CAN高優先級數據發送接口(PTB阻塞模式)hpm_stat_t can_send_high_priority_message_blocking(CAN_Type *base, const can_transmit_buf_t *message);//CAN 數據接收接口(阻塞模式)hpm_stat_t can_receive_message_blocking(CAN_Type *base, can_receive_buf_t *message);//CAN數據接收接口(非租塞模式)hpm_stat_t can_read_received_message(CAN_Type *base, can_receive_buf_t *message);//設置發送補償及使能(CAN-FD高速率使用,TDC)void can_set_transmitter_delay_compensation(CAN_Type *base, uint8_t sample_point, bool enable);

2. API數據結構

2.1 CAN配置



typedef struct { union { struct { //當禁用use_lowlevel_timing_setting時,以下參數有效。 uint32_t baudrate; //CAN 2.0波特率設定 uint32_t baudrate_fd; // CAN-FD波特率設定,當enable_canfd使能才有效 uint16_t can20_samplepoint_min; //CAN 2.0最小采樣點(0~1000) uint16_t can20_samplepoint_max; //CAN 2.0最大采樣點(0~1000) uint16_t canfd_samplepoint_min; //CAN-FD 最小采樣點(0~1000) uint16_t canfd_samplepoint_max; //CAN-FD 最大采樣點(0~1000) }; struct {//當啟用use_lowlevel_timing_setting時,以下參數有效。 can_bit_timing_param_t can_timing; //CAN2.0 位時間參數 can_bit_timing_param_t canfd_timing; //CAN-FD 位時間參數 }; };can_loopback_mode_t loopback_mode; //CAN回環模式,默認是正常模式bool use_lowlevel_timing_setting; //是否啟用位時間參數設定 bool enable_canfd; //是否啟用CAN-FD bool enable_self_ack; //是否啟用自ACK幀bool disable_re_transmission_for_ptb; //是否禁用高優先級PTB發送重傳, false:單發模式 true:重傳模式bool disable_re_transmission_for_stb; //是否禁用STP發送重傳, false:單發模式, true:重傳模式uint16_t filter_list_num; //接受過濾器list總數can_filter_config_t *filter_list; //接受過濾器list指針} can_config_t;

2.2 CAN過濾配置

/** * @brief CAN acceptance filter modes */typedef enum _can_filter_mode { can_filter_mode_both_frames, //標準格式和擴展格式過濾選模式can_filter_mode_standard_frames, //標準格式過濾模式can_filter_mode_extended_frames, //擴展格式過濾模式} can_filter_mode_t;

/** * @brief CAN acceptance configuration */typedef struct {uint16_t index; //過濾器indexcan_filter_mode_t mode; //過濾器模式 bool enable; //過濾器是否使能 uint32_t code; //ID code uint32_t mask; //ID mask} can_filter_config_t;

2.3 CAN發送

/** * @brief CAN transmit buffer data structure */typedef union _can_tx_buf {uint32_t buffer[18]; //發送 buffer,由于是聯合體,和下面的共享一塊內存區域,buffer大小:4*18=72struct { struct { uint32_t id: 29; //CAN ID uint32_t : 1; uint32_t transmit_timestamp_enable: 1; //時間戳使能 }; struct { uint32_t dlc: 4; //數據長度 uint32_t bitrate_switch: 1; //bitrate開關 uint32_t canfd_frame: 1; //can-fd標識位 uint32_t remote_frame: 1; //remote 標識位 uint32_t extend_id: 1; //擴展ID uint32_t : 24; }; uint8_t data[]; //數據指針 };} can_transmit_buf_t;

2.4 CAN接收

/** * @brief CAN receive buffer data structure */typedef union _can_rx_buf { uint32_t buffer[20]; //接收buffer,由于是聯合體,和下面的數據共享一塊內存區域 struct { struct { uint32_t id: 29; //can id uint32_t : 1; uint32_t error_state_indicator: 1; //錯誤狀態指示 }; struct { uint32_t dlc: 4; //數據長度 uint32_t bitrate_switch: 1; //bitrate開關 uint32_t canfd_frame: 1; //canfd 標識 uint32_t remote_frame: 1; //remote標識 uint32_t extend_id: 1; //擴展ID uint32_t : 4; uint32_t loopback_message: 1; //回環數據標識 uint32_t error_type: 3; //錯誤類型 uint32_t cycle_time: 16; //cycle time }; uint8_t data[]; //數據指針 };} can_receive_buf_t;

3. 配置流程

CAN控制器的CAN2.0和CAN-FD配置流程如下圖。

1cf08d88-e6f8-11ec-aa96-dac502259ad0.png

4. 樣例

4.1 內部回環樣例

需求:

1.CAN-FD協議

2.波特率2.5Mbps

3.內部回環模式

4.數據載荷64字節

5.遍歷can-id從0~2047(11位標準ID)

6.每幀數據確保不同

7.阻塞發送、非阻塞接收(非中斷模式)

8.對比接收和發送的數據包是否相等,并輸出結果

void board_can_loopback_test(void){ bool result; uint32_t error_cnt = 0; uint32_t can_src_clk_freq; can_config_t can_config; board_init_can(BOARD_APP_CAN_BASE); can_src_clk_freq = board_init_can_clock(BOARD_APP_CAN_BASE); can_config.baudrate = 1000000; /* 1Mbps */ can_config.baudrate_fd = 2500000; /*5Mbps*/ can_config.loopback_mode = can_loopback_internal; //內部回環 can_config.enable_canfd = true; hpm_stat_t status = can_init(BOARD_APP_CAN_BASE, &can_config, can_src_clk_freq); if (status != status_success) { printf("CAN initialization failed, error code: %d\n", status); return; } can_transmit_buf_t tx_buf; can_receive_buf_t rx_buf; memset(&tx_buf, 0, sizeof(tx_buf)); memset(&rx_buf, 0, sizeof(rx_buf)); tx_buf.dlc = can_payload_size_64; tx_buf.canfd_frame = 1; tx_buf.bitrate_switch = 1; for (uint32_t i = 0; i < 2048; i++) { tx_buf.id = i; for (uint32_t j = 0; j < 64u; j++) { tx_buf.data[j] = (uint8_t)i + j + 1; } can_send_message_blocking(BOARD_APP_CAN_BASE, &tx_buf); can_read_received_message(BOARD_APP_CAN_BASE, &rx_buf); result = can_buf_compare(&tx_buf, &rx_buf); if (!result) { error_cnt++; can_set_transmitter_delay_compensation(BOARD_APP_CAN_BASE, 64, true); hpm_stat_t status = can_init(BOARD_APP_CAN_BASE, &can_config, can_src_clk_freq); if (status != status_success) { printf("CAN initialization failed, error code: %d\n", status); return; } printf("ID=%08x, result:%s\n", rx_buf.id, result ? "passed": "failed"); } } printf(" CAN loopback test for extend frame %s, error_cnt:%d\n", error_cnt == 0 ? "passed" : "failed", error_cnt);}

4.2 兩路閉環收發樣例

需求:

1.CAN2.0協議

2.波特率1000000,1Mbps

3.CAN0發送,CAN1接收

4.數據載荷8字節

5.CAN0阻塞發送,CAN1阻塞接收

6.對比CAN0發送包和CAN1接收包是否相同,并輸出結果

7.壓測100次,輸出最終結果

void can0_can1_rxrx_loop_test(void){ pm_stat_t status; can_config_t can_config; bool use_canfd = false; can_get_default_config(&can_config); can_config.baudrate = 1000000; /* 1Mbps */ can_config.baudrate_fd = 5000000; /* 2Mbps */ can_config.enable_canfd = use_canfd; board_init_can(HPM_CAN0); board_init_can(HPM_CAN1); uint32_t can_src_clk_freq0 = board_init_can_clock(HPM_CAN0); uint32_t can_src_clk_freq1 = board_init_can_clock(HPM_CAN1); hpm_stat_t status0 = can_init(HPM_CAN0, &can_config, can_src_clk_freq0); if (status0 != status_success) { printf("CAN initialization failed, error code: %d\n", status0); return; } hpm_stat_t status1 = can_init(HPM_CAN1, &can_config, can_src_clk_freq1); if (status1 != status_success) { printf("CAN initialization failed, error code: %d\n", status1); return; } printf("CMD_STA_CMD_CTRL(0xA0)= %08x\n", HPM_CAN0->CMD_STA_CMD_CTRL); printf("F_PRESC = %08x\n", HPM_CAN0->F_PRESC); printf("S_PRESC = %08x\n", HPM_CAN0->S_PRESC); printf("TDC = %08x\n", HPM_CAN0->TDC); uint32_t error_cnt = 0; bool result = false; can_transmit_buf_t tx_buf; can_receive_buf_t rx_buf; memset(&tx_buf, 0, sizeof(tx_buf)); memset(&rx_buf, 0, sizeof(rx_buf)); tx_buf.id = 0x101; uint32_t id_max; if (!use_canfd) { tx_buf.dlc = can_payload_size_8; id_max = 8; } else { tx_buf.dlc = can_payload_size_8; id_max = 64; tx_buf.canfd_frame = 1; tx_buf.bitrate_switch = 1; } for(int index = 0; index < 100; index++) { for (uint32_t i = 0; i < id_max; i++) { tx_buf.data[i] = (uint8_t)(index+i); } can_send_high_priority_message_blocking(HPM_CAN0, &tx_buf); can_receive_message_blocking(HPM_CAN1, &rx_buf); result = can_buf_compare(&tx_buf, &rx_buf); if (!result) { error_cnt++; printf(" CAN0->CAN1 for standard frame %s\n", result ? "passed" : "failed"); } can_receive_message_blocking(HPM_CAN0, &rx_buf); result = can_buf_compare(&tx_buf, &rx_buf); if (!result) { error_cnt++; printf(" CAN1->CAN0 for standard frame %s\n", result ? "passed" : "failed"); } } printf(" CAN can0 can1 rxrx loop test for result: %s, error_cnt:%d\n", error_cnt == 0 ? "passed" : "failed", error_cnt);}

4.3 四路收發樣例

需求:

1.CAN-FD協議

2.波特率2.5Mbps

3.數據載荷64字節

4.啟用中斷接收

5.CAN0/CAN1/CAN2/CAN3順序發送數據

6.確保CAN0/CAN1/CAN2/CAN3 can-id不同

7.確保每次發送的數據包內容不同

8.分別對比每次一路CAN發送數據包和其它三路CAN接收的數據包是否相同,并輸出結果

9.壓測100次,并輸出結果

static can_info_t s_can_info[] = { { .can_base = HPM_CAN0 }, { .can_base = HPM_CAN1 },#if defined(HPM_CAN2) { .can_base = HPM_CAN2 },#endif#if defined (HPM_CAN3) { .can_base = HPM_CAN3 },#endif};volatile static bool has_new_rcv_msg_array[4];volatile static can_receive_buf_t s_can_rx_buf_array[4];SDK_DECLARE_EXT_ISR_M(IRQn_CAN0, board_can_isr0);SDK_DECLARE_EXT_ISR_M(IRQn_CAN1, board_can_isr1);SDK_DECLARE_EXT_ISR_M(IRQn_CAN2, board_can_isr2);SDK_DECLARE_EXT_ISR_M(IRQn_CAN3, board_can_isr3);void board_can_isr0(void){ uint8_t flags = can_get_tx_rx_flags(HPM_CAN0); if ((flags & CAN_EVENT_RECEIVE) != 0) { can_read_received_message(HPM_CAN0, (can_receive_buf_t *)&s_can_rx_buf_array[0]); has_new_rcv_msg_array[0] = true; } can_clear_tx_rx_flags(HPM_CAN0, flags);}void board_can_isr1(void){ uint8_t flags = can_get_tx_rx_flags(HPM_CAN1); if ((flags & CAN_EVENT_RECEIVE) != 0) { can_read_received_message(HPM_CAN1, (can_receive_buf_t *)&s_can_rx_buf_array[1]); has_new_rcv_msg_array[1] = true; } can_clear_tx_rx_flags(HPM_CAN1, flags);}void board_can_isr2(void){ uint8_t flags = can_get_tx_rx_flags(HPM_CAN2); if ((flags & CAN_EVENT_RECEIVE) != 0) { can_read_received_message(HPM_CAN2, (can_receive_buf_t *)&s_can_rx_buf_array[2]); has_new_rcv_msg_array[2] = true; } can_clear_tx_rx_flags(HPM_CAN2, flags);}void board_can_isr3(void){ uint8_t flags = can_get_tx_rx_flags(HPM_CAN3); if ((flags & CAN_EVENT_RECEIVE) != 0) { can_read_received_message(HPM_CAN3, (can_receive_buf_t *)&s_can_rx_buf_array[3]); has_new_rcv_msg_array[3] = true; } can_clear_tx_rx_flags(HPM_CAN3, flags);}void board_can0_1_2_3_txrx_loop_test(void){ hpm_stat_t status; can_config_t can_config; bool use_canfd = true; can_get_default_config(&can_config); can_config.baudrate = 1000000; /* 1Mbps */ can_config.baudrate_fd = 2500000; /* 5Mbps */ can_config.enable_canfd = use_canfd; /* Initialize CAN */ for (uint32_t i=0; i < ARRAY_SIZE(s_can_info); i++) { can_info_t *info = &s_can_info[i]; board_init_can(info->can_base); info->clock_freq = board_init_can_clock(info->can_base); status = can_init(info->can_base, &can_config, info->clock_freq); if (status != status_success) { printf("CAN %d initialization failed, error code: %d\n", i, status); return; } printf("CMD_STA_CMD_CTRL(0xA0)= %08x\n", info->can_base->CMD_STA_CMD_CTRL); printf("F_PRESC = %08x\n", info->can_base->F_PRESC); printf("S_PRESC = %08x\n", info->can_base->S_PRESC); printf("TDC = %08x\n", info->can_base->TDC); can_enable_tx_rx_irq(info->can_base, CAN_EVENT_RECEIVE); } intc_m_enable_irq_with_priority(IRQn_CAN0, 1); intc_m_enable_irq_with_priority(IRQn_CAN1, 1); intc_m_enable_irq_with_priority(IRQn_CAN2, 1); intc_m_enable_irq_with_priority(IRQn_CAN3, 1);

uint32_t error_cnt = 0; bool result = false; can_transmit_buf_t tx_buf[4]; uint32_t data_max; memset(tx_buf, 0, sizeof(tx_buf)); for(int i = 0; i < 4; i ++) { tx_buf[i].id = i+1; if (!use_canfd) { tx_buf[i].dlc = can_payload_size_8; data_max = 8; } else { tx_buf[i].canfd_frame = 1; tx_buf[i].bitrate_switch = 1; tx_buf[i].dlc = can_payload_size_64; data_max = 64; } } for(int index = 0; index < 100; index++) { for(uint32_t can_i = 0; can_i < 4; can_i++) { for (uint32_t i = 0; i < data_max; i++) { tx_buf[can_i].data[i] = (uint8_t)(index+can_i+i); } } for(uint32_t can_i = 0; can_i < 4; can_i++) { can_send_high_priority_message_blocking(s_can_info[can_i].can_base, &tx_buf[can_i]); for(int j= 1; j < 4; j++) { printf("recv canid:%d\n", (can_i+j)%4); while(!has_new_rcv_msg_array[(can_i+j)%4]) { } has_new_rcv_msg_array[(can_i+j)%4] = false; result = can_buf_compare(&tx_buf[can_i], &s_can_rx_buf_array[(can_i+j)%4]); if (!result) { error_cnt++; } printf(" CAN%d->CAN%d for standard frame %s\n", can_i, (can_i+j)%4, result ? "passed" : "failed"); } } } printf(" CAN can0 can1 rxrx loop test for result: %s, error_cnt:%d\n", error_cnt == 0 ? "passed" : "failed", error_cnt);}

劃重點

使用HPM6750的CAN控制器,可以輕松實現4路CAN2.0/CAN-FD同時收發數據,易于實現CAN網絡隔離以及網絡中繼的復雜需求,實現了工業網關的功能。

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

    關注

    57

    文章

    2788

    瀏覽量

    465181
收藏 人收藏

    評論

    相關推薦

    CAN總線十萬個為什么 | 如何輕松應對CAN(FD)接口不足?

    導讀項目擴張時,CAN(FD)接口不足常常成為硬件工程師的痛點。本期將為您介紹一種高效解決方案,幫助您從根本上解決接口瓶頸問題,同時提升項目效率和系統可靠性。很多硬件工程師在項目擴張的時候,都需要
    的頭像 發表于 02-21 11:36 ?213次閱讀
    <b class='flag-5'>CAN</b>總線十萬個為什么 | 如何輕松應對<b class='flag-5'>CAN</b>(<b class='flag-5'>FD</b>)接口不足?

    虹科干貨 三代CAN技術演進:從CAN CC到CAN XL的創新路徑(上篇)

    CAN FD作為CAN技術的一個重要迭代,其高速率和大數據量的傳輸能力為現代汽車和其他需要高效數據傳輸的應用場景提供了有力的支持。從CAN CC到C
    的頭像 發表于 11-01 11:04 ?720次閱讀

    HPM6750 Bootloader設計

    我正在做一個hpm6750evk2的bootloader。設計很簡單,boot工程代碼只做跳轉到1M后的APP工程代碼處,APP工程就是做的一個點燈的程序而已,boot、APP工程都是跑
    發表于 10-23 18:59

    CAN FD與傳統CAN的區別是什么

    隨著汽車電子、工業自動化的蓬勃發展,CAN總線上的設備數量、數據量都大大增加,給CAN總線帶來了極大的挑戰。為滿足更高的帶寬及數據吞吐量,CAN FD
    的頭像 發表于 10-22 10:47 ?664次閱讀
    <b class='flag-5'>CAN</b> <b class='flag-5'>FD</b>與傳統<b class='flag-5'>CAN</b>的區別是什么

    CAN-FDCAN總線網絡第二章

    日常工作中使用 CAN FD 的公司實習。無論哪種方式,本指南都會向您展示 CAN FD:具有靈活數據的
    的頭像 發表于 10-02 15:20 ?342次閱讀
    <b class='flag-5'>CAN-FD</b>:<b class='flag-5'>CAN</b>總線網絡第二章

    MCAN(CAN FD)模塊入門

    電子發燒友網站提供《MCAN(CAN FD)模塊入門.pdf》資料免費下載
    發表于 09-14 10:08 ?0次下載
    MCAN(<b class='flag-5'>CAN</b> <b class='flag-5'>FD</b>)模塊入門

    從替代到創新,國產CAN FD芯片持續突破

    電子發燒友網報道(文/吳子鵬)隨著汽車電子、工業自動化設備的發展迭代,CAN總線上的設備、數據量都大大增加,給CAN總線帶來了極大的挑戰。因此,CAN FD應運而生。
    的頭像 發表于 09-02 08:13 ?7302次閱讀

    虹科技術 全新Linux環境PCAN驅動程序發布!CAN/CAN FD通信體驗全面升級!

    全新8.17.0版本的PCAN-Linux驅動程序正式發布,專為CANCAN FD接口量身打造。無論是CAN 2.0 a/b還是
    的頭像 發表于 08-29 09:36 ?560次閱讀
    虹科技術 全新Linux環境PCAN驅動程序發布!<b class='flag-5'>CAN</b>/<b class='flag-5'>CAN</b> <b class='flag-5'>FD</b>通信體驗全面升級!

    CAN/CAN FD/CAN XL三大總線協議解讀,是逐步替代關系嗎?

    電子發燒友網報道(文/吳子鵬)在軟件定義汽車逐漸成為主流的當下,數據傳輸的速度和效率成為打造智能汽車的瓶頸,在這種大背景下,傳統CAN總線應對一些需求已經相當吃力,因此CAN FDCAN
    的頭像 發表于 08-12 01:12 ?4754次閱讀

    CAN FD盒基本功能包括哪些

    CAN FD盒基本功能有哪些? CAN FD盒作為CAN FD總線通信的重要設備,其基本功能包括
    的頭像 發表于 07-02 16:21 ?1036次閱讀

    TCAN1051具有CAN FD和故障保護功能的CAN收發器數據表

    電子發燒友網站提供《TCAN1051具有CAN FD和故障保護功能的CAN收發器數據表.pdf》資料免費下載
    發表于 07-01 10:25 ?1次下載
    TCAN1051具有<b class='flag-5'>CAN</b> <b class='flag-5'>FD</b>和故障保護功能的<b class='flag-5'>CAN</b>收發器數據表

    TCAN1042具有CAN FD和故障保護功能的CAN收發器數據表

    電子發燒友網站提供《TCAN1042具有CAN FD和故障保護功能的CAN收發器數據表.pdf》資料免費下載
    發表于 06-19 12:30 ?1次下載
    TCAN1042具有<b class='flag-5'>CAN</b> <b class='flag-5'>FD</b>和故障保護功能的<b class='flag-5'>CAN</b>收發器數據表

    全新Linux環境PCAN驅動程序發布!CAN/CAN FD通信體驗全面升級!

    全新8.17.0版本的PCAN-Linux驅動程序正式發布,專為CANCAN FD接口量身打造。無論是CAN 2.0 a/b還是
    的頭像 發表于 04-19 10:38 ?1189次閱讀

    汽車CAN FD總線測試原理及應用

    CAN FD總線報文周期一致性測試方法,可自動實現監控測試并快速生成測試報告,主要根據CAPL語言設計建立測試應用工程。
    發表于 04-01 12:53 ?1142次閱讀
    汽車<b class='flag-5'>CAN</b> <b class='flag-5'>FD</b>總線測試原理及應用

    什么是CAN2.0協議?

    CAN2.0協議是控制器局域網絡(ControllerAreaNetwork,CAN)的一種版本,也被稱為傳統CAN協議,由德國博世BOSCH公司開發,并已成為國際上廣泛應用于汽車電子、工業自動化
    的頭像 發表于 03-29 08:19 ?1522次閱讀
    什么是<b class='flag-5'>CAN2.0</b>協議?
    主站蜘蛛池模板: 99久久综合精品免费 | 亚洲精品视频免费在线观看 | 姑娘视频日本在线播放 | 少妇伦子伦精品无码 | 草莓视频免费看 | 亚洲精品中文字幕无码A片蜜桃 | 欧美free嫩交hd | 色婷婷综合久久久久中文一区二区 | 国产AV视频二区在线观看 | 久久日本精品在线热 | 污污又黄又爽免费的网站 | 999久久狠狠免费精品 | 亚洲日本欧美天堂在线 | 成人国内精品久久久久影 | 免费观看美女的网站 | 鬼灭之刃花街篇免费樱花动漫 | 久久视频这有精品63在线国产 | 最新无码国产在线视频 | 草草久久久亚洲AV成人片 | 久久综合久综合久久鬼色 | 小寡妇水真多好紧 | 免费a视频在线观看 | 97超碰97资源在线观看视频 | 老师的蕾丝小内内湿透了 | 2021国产精品久久久久精品免费网 | 259luxu高跟黑色丝袜系列 | 最新果冻传媒在线观看免费版 | 御姐被吸奶 | wwwxxx日本护士| 国产精品日本无码久久一老A | 亚洲国产成人久久精品影视 | 久久精品美女久久 | 在线观看日本污污ww网站 | 日韩亚洲中文欧美在线 | 777精品久无码人妻蜜桃 | 97色伦亚洲自偷 | 国产成人无码AV麻豆 | 无码不卡中文字幕在线观看 | 成人在线视频网站 | 伊人久久大香线蕉综合电影 | 色狼亚洲色图 |