娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

【GD32 MCU 入門教程】GD32 MCU 常見外設介紹(15)CAN 模塊介紹

發布者:科技創新實踐者最新更新時間:2024-11-04 來源: elecfans關鍵字:GD32  MCU  CAN  模塊 手機看文章 掃描二維碼
隨時隨地手機看文章

輸入圖片說明

各系列 CAN 功能差異

GD32系列MCU有關CAN外設各系列功能差異如下表GD32各系列MCU CAN外設功能差異表所示。

輸入圖片說明

15.3.硬件連接說明

CAN 外設硬件連接圖

輸入圖片說明

如圖CAN外設硬件連接圖所示,為典型的CAN外設硬件連接圖:SN65HVD230是收發器,其作用就是把CAN控制器的TTL電平轉換成差分信號。發送數據時,控制器把要發送的二進制編碼通過CAN_TX線發送到收發器,然后由收發器把這個邏輯電平轉換成差分信號,通過差分線CANH、CANL線輸出到總線網絡。當接收數據時,收發器把總線上收到的CANH、CANL信號轉換成邏輯電平,通過CAN_RX輸入到控制器。

讀者可以根據典型硬件連接圖和相應系列的Datasheet設計出自己的硬件連接方式。

15.4.軟件配置說明

本小節講解CAN_Example歷程中CAN模塊的配置說明,主要包括CAN外設配置、GPIO引腳配置、主函數介紹以及運行結果。本例程主要介紹GD32 MCU各系列CAN模塊的數據發送、接收,有關CAN其他功能例程可參考各系列固件庫歷程。

CAN 外設配置

外設配置如代碼清單CAN外設配置所示,在GD32全系列MCU中CAN外設的配置基本相同。GD32標準庫提供了CAN初始化結構體及初始化函數來配置CAN外設,其初始化結構體說明如下表CAN參數初始化結構體說明列表和CAN過濾器初始化結構體說明列表所示。需要注意的是本例程需要用到兩個開發板,一個發送,一個接收,這可以通過打開宏定義CAN_RECEIVE或CAN_TRANSMIT來決定當前是接收還是發送。

代碼清單 CAN 外設配置

void can_config(void) { #if defined (GD32F30X_CL) ||(GD32F4XX) ||(GD32F20X_CL)||(GD32F10X_HD) can_parameter_struct can_parameter; can_filter_parameter_struct can_filter_parameter; can_struct_para_init(CAN_INIT_STRUCT, &can_parameter); can_struct_para_init(CAN_FILTER_STRUCT, &can_filter_parameter); /* initialize CAN register */ can_deinit(CAN0); /* initialize CAN parameters */ can_parameter.time_triggered = DISABLE; can_parameter.auto_bus_off_recovery = DISABLE; can_parameter.auto_wake_up = DISABLE; can_parameter.no_auto_retrans = DISABLE; can_parameter.rec_fifo_overwrite = DISABLE; can_parameter.trans_fifo_order = DISABLE; can_parameter.working_mode = CAN_NORMAL_MODE; can_parameter.resync_jump_width = CAN_BT_SJW_1TQ; can_parameter.time_segment_1 = CAN_BT_BS1_5TQ; can_parameter.time_segment_2 = CAN_BT_BS2_4TQ; can_parameter.prescaler = 12; /* initialize CAN */ can_init(CAN0, &can_parameter); /* initialize filter */ can_filter_parameter.filter_number = 0; can_filter_parameter.filter_mode = CAN_FILTERMODE_MASK; can_filter_parameter.filter_bits = CAN_FILTERBITS_32BIT; can_filter_parameter.filter_list_high = 0x0000; can_filter_parameter.filter_list_low = 0x0000; can_filter_parameter.filter_mask_high = 0x0000; can_filter_parameter.filter_mask_low = 0x0000; can_filter_parameter.filter_fifo_number = CAN_FIFO0; can_filter_parameter.filter_enable = ENABLE; can_filter_init(&can_filter_parameter); #if defined (CAN_RECEIVE) #if defined (GD32F10X_HD) nvic_irq_enable(USBD_LP_CAN0_RX0_IRQn,0,0); #else nvic_irq_enable(CAN0_RX0_IRQn,0,0); #endif /* enable can receive FIFO0 not empty interrupt */ can_interrupt_enable(CAN0, CAN_INT_RFNE0); #endif #elif defined (GD32E10X) can_parameter_struct can_parameter; can_struct_para_init(CAN_INIT_STRUCT, &can_parameter); /* initialize CAN register */ can_deinit(CAN0); /* initialize CAN parameters */ can_parameter.time_triggered = DISABLE; can_parameter.auto_bus_off_recovery = DISABLE; can_parameter.auto_wake_up = DISABLE; can_parameter.auto_retrans = DISABLE; can_parameter.rec_fifo_overwrite = DISABLE; can_parameter.trans_fifo_order = DISABLE; can_parameter.working_mode = CAN_NORMAL_MODE; /* initialize CAN */ can_init(CAN0, &can_parameter); /* config CAN0 baud rate */ can_frequency_set(CAN0, DEV_CAN_BAUD_RATE); /* initialize filter */ can_filter_mask_mode_init(DEV_CAN_ID, DEV_CAN_MASK, CAN_EXTENDED_FIFO0, 0); #if defined (CAN_RECEIVE) /* configure CAN0 NVIC */ nvic_irq_enable(CAN0_RX0_IRQn, 0, 0); /* enable can receive FIFO0 not empty interrupt */ can_interrupt_enable(CAN0, CAN_INTEN_RFNEIE0); #endif #elif defined (GD32F1X0) can_parameter_struct can_parameter; can_filter_parameter_struct can_filter_parameter; /* initialize CAN register */ can_deinit(CAN1); /* initialize CAN parameters */ can_parameter.time_triggered = DISABLE; can_parameter.auto_bus_off_recovery = DISABLE; can_parameter.auto_wake_up = DISABLE; can_parameter.no_auto_retrans = DISABLE; can_parameter.rec_fifo_overwrite = DISABLE; can_parameter.trans_fifo_order = DISABLE; can_parameter.working_mode = CAN_NORMAL_MODE; can_parameter.resync_jump_width = CAN_BT_SJW_1TQ; can_parameter.time_segment_1 = CAN_BT_BS1_4TQ; can_parameter.time_segment_2 = CAN_BT_BS2_3TQ; can_parameter.prescaler = 18; /* initialize CAN */ can_init(CAN1, &can_parameter); /* initialize filter */ can_filter_parameter.filter_number = 15; can_filter_parameter.filter_mode = CAN_FILTERMODE_MASK; can_filter_parameter.filter_bits = CAN_FILTERBITS_32BIT; can_filter_parameter.filter_list_high = 0x0000; can_filter_parameter.filter_list_low = 0x0000; can_filter_parameter.filter_mask_high = 0x0000; can_filter_parameter.filter_mask_low = 0x0000; can_filter_parameter.filter_fifo_number = CAN_FIFO0; can_filter_parameter.filter_enable = ENABLE; can_filter_init(&can_filter_parameter); #if defined (CAN_RECEIVE) /* configure CAN1 NVIC */ nvic_irq_enable(CAN1_RX0_IRQn,0,0); can_interrupt_enable(CAN1, CAN_INTEN_RFNEIE0); #endif #endif }


CAN 參數初始化結構體說明列表

輸入圖片說明

CAN 過濾器初始化結構體說明列表

輸入圖片說明

GPIO 引腳配置

GPIO引腳配置如代碼清單CAN例程GPIO引腳配置所示。GD32F10X、GD32F30X、GD32F20X、GD32E10X系列用到remap功能,因此需要打開AF時鐘。使用GD32F1X0時,例程中是使用CAN1來進行收發。需要注意的是,發送時,不需要打開CAN0的時鐘,但是接收時需要打開CAN0的時鐘。

代碼清單 CAN 例程 GPIO 引腳配置

void can_gpio_config(void) { #if defined (GD32F4XX) /* enable CAN0 clock */ rcu_periph_clock_enable(RCU_CAN0); rcu_periph_clock_enable(RCU_GPIOB); /* configure CAN0 GPIO */ gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8); gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8); gpio_af_set(GPIOB, GPIO_AF_9, GPIO_PIN_8); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9); gpio_af_set(GPIOB, GPIO_AF_9, GPIO_PIN_9); #elif defined (GD32E10X) || (GD32F30X_CL) ||(GD32F10X_HD) /* enable CAN0 clock */ rcu_periph_clock_enable(RCU_CAN0); rcu_periph_clock_enable(RCU_GPIOD); rcu_periph_clock_enable(RCU_AF); /* configure CAN0 GPIO */ gpio_init(GPIOD,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_0); gpio_init(GPIOD,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_1); #if defined (GD32F10X_HD) gpio_pin_remap_config(GPIO_CAN_FULL_REMAP,ENABLE); #else gpio_pin_remap_config(GPIO_CAN0_FULL_REMAP,ENABLE); #endif #elif defined (GD32F20X_CL) /* enable CAN0 clock */ rcu_periph_clock_enable(RCU_CAN0); rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_AF); /* configure CAN0 GPIO */ gpio_init(GPIOB,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_8); gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_9); gpio_pin_remap_config(GPIO_CAN0_PARTIAL_REMAP,ENABLE); #elif defined (GD32F1X0) //only GD32F170 and GD32F190 have CAN, GD32F130 and GD32F150 don't have /* enable CAN clock */ #if defined (CAN_RECEIVE) rcu_periph_clock_enable(RCU_CAN0); #endif rcu_periph_clock_enable(RCU_CAN1); rcu_periph_clock_enable(RCU_GPIOB); /* configure CAN1 GPIO */ gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_12); gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12); gpio_af_set(GPIOB, GPIO_AF_9, GPIO_PIN_12); gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_13); gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13); gpio_af_set(GPIOB, GPIO_AF_9, GPIO_PIN_13); #endif }


主函數配置

主函數配置如代碼清單主函數配置所示。本例程需要兩個開發板,一個作為發送,一個作為接收,這可以通過使用宏定義CAN_RECEIVE和CAN_TRANSMIT來實現。如果作為接收,那么主函數的開始會把can_receive_flag設置為RESET,并初始化LED2。LED2作為通訊的指示燈,如果通訊成功,就點亮LED2,否則就不點亮。can_receive_flag狀態的改變在中斷里實現,如果成功接收到數據,就會進入中斷,在中斷里把can_receive_flag設置為SET。主函數接下來對CAN的GPIO以及CAN模塊進行初始化。完成后,如果是作為發送方,程序需要設置需要發送的數據。有關發送結構體參數的說明,請見下表CAN發送消息初始化結構體說明列表。

代碼清單主函數配置

int main(void) { #if defined (CAN_RECEIVE) can_receive_flag = RESET; LED2_init(); #endif /* GPIO config */ can_gpio_config(); /* CAN config */ can_config(); #if defined (CAN_TRANSMIT) /* initialize transmit message */ #if defined (GD32E10X) || (GD32F30X_CL) || (GD32F10X_HD) || (GD32F4XX) || (GD32F20X_CL) can_struct_para_init(CAN_TX_MESSAGE_STRUCT, &g_transmit_message); #endif g_transmit_message.tx_sfid = 0x00; g_transmit_message.tx_efid = DEV_CAN_ID; g_transmit_message.tx_ft = CAN_FT_DATA; g_transmit_message.tx_ff = CAN_FF_EXTENDED; g_transmit_message.tx_dlen = 4; g_transmit_message.tx_data[0] = 0xaa; g_transmit_message.tx_data[1] = 0xbb; g_transmit_message.tx_data[2] = 0xcc; g_transmit_message.tx_data[3] = 0xdd; #if defined (GD32E10X) || (GD32F30X_CL) || (GD32F10X_HD) || (GD32F4XX) || (GD32F20X_CL) can_message_transmit(CAN0, &g_transmit_message); #elif defined (GD32F1X0) can_message_transmit(CAN1, &g_transmit_message); #endif #endif #if defined (CAN_RECEIVE) while(can_receive_flag == RESET); if((g_receive_message.rx_data[0] == 0xaa) && (g_receive_message.rx_data[1] == 0xbb)&& (g_receive_message.rx_data[2] == 0xcc) && (g_receive_message.rx_data[3] == 0xdd)) { LED2_ON(); } else { LED2_OFF(); } #endif while(1); }


CAN 發送消息初始化結構體說明列表

輸入圖片說明

運行結果

本例程需要用到兩個開發板,用杜邦線把兩個開發板的CAN_H、CAN_L分別連接起來。打開CAN_Example例程,選擇好對應開發板的芯片工程后,先屏蔽掉CAN_RECEIVE,不屏蔽CAN_TRANSMIT ,編譯后把程序下載到一號開發板上。然后換一塊開發板,屏蔽掉CAN_TRANSMIT,不屏蔽CAN_RECEIVE,編譯后把程序下載到二號開發板上。接下來按下二號開發板的復位鍵,然后再按下一號開發板的復位鍵,此時會看到二號開發板的LED2被點亮,這表明通訊成功。

15.5.CAN 使用注意事項

(1) 使用F10X、F20X、F30X、F1X0、E10X、F403接收數據時如果出現接收兩幀數據會丟失一包的情況,這是由于手動多調用一次清緩存的操作導致的。因此,軟件中無需調用can_fifo_release函數;

(2) 使用F10X、F20X、F1X0時,會出現CAN離線后無法自動恢復,這是由于CAN模塊的離線自動恢復功能與CAN協議定義的離線恢復序列存在一定理解誤差造成的。該狀況可以通過使能離線中斷,在離線中斷內重新初始化CAN模塊來規避;

(3) GD32F170和GD32F190的CAN0內置PHY,其CANH和CANL口的耐壓范圍為VSS-0.3到VSS+7.5,內置的PHY不支持12V和24V系統。當使用CAN0時,建議硬件上按照下圖CAN0引腳連接圖連接。

CAN0 引腳連接圖

輸入圖片說明

[1] [2]
關鍵字:GD32  MCU  CAN  模塊 引用地址:【GD32 MCU 入門教程】GD32 MCU 常見外設介紹(15)CAN 模塊介紹

上一篇:【GD32 MCU 入門教程】GD32 MCU 常見外設介紹(1)RCU 時鐘介紹
下一篇:【GD32 MCU 入門教程】GD32 MCU 常見外設介紹(3)NVIC 介紹

推薦閱讀最新更新時間:2025-04-24 15:51

AT90CANCAN通信模塊驅動設計及C編程
  CAN 總線 通信較之一般的通信總線而言,其數據通信具有突出的可靠性、實時性和靈活性,應用范圍也早已不再局限于汽車行業,而是擴展到了機器人、數控機床、家用電器等領域。CAN控制器用來實現統一的CAN通信協議。CAN控制器分為兩種: 一種是獨立的控制 芯片 ,如SJA1100;另一種是將其集成在 微控制器 內部,例如 Atmel 公司最新推出的AT90CAN系列 單片機 。與使用獨立的CAN控制器相比,自身集成了CAN 接口 的微控制器在簡化硬件 電路 設計的同時,提高了軟件開發的效率。   1 AT90CAN單片機CAN控制器特性   AT90CAN單片機的CAN控制器能夠兼容CAN2.0A和CAN2.0B通信協議,內部設
[單片機]
AT90<font color='red'>CAN</font>的<font color='red'>CAN</font>通信<font color='red'>模塊</font>驅動設計及C編程
GD32與STM32兼容嗎?
GD32與STM32是兩個不同的微控制器系列,是由兩個不同的公司設計和生產的。GD32系列是由國內的長沙國芯微電子設計和生產的,而STM32系列則是由歐洲的STMicroelectronics公司設計和生產的。 雖然GD32與STM32都是基于ARM Cortex-M內核的微控制器,但是它們并不完全兼容。由于兩個公司的設計和生產流程不同,GD32系列和STM32系列的外設具有不同的寄存器映射和不同的寄存器位域。因此,任何在STM32上編寫的應用程序不能直接在GD32上運行,需要對代碼進行適當的修改。 在進行移植時,需要仔細研究兩者之間的差異性,例如GPIO、串口、定時器等外設的差異,以及使用的庫函數的不同。同時也需要檢查時鐘、中斷
[單片機]
MCUCAN總線中繼器設計
引 言 CAN總線以其開發維護成本低、總線利用率高、傳輸距離遠(最遠可達10 km)、傳輸速率高(最高可達1 Mbps)使用戶能組建穩定、高效的現場總線網絡。CAN總線已被廣泛應用到各個自動化控制系統中,例如汽車電子、自動控制、智能大廈、電力系統、安防監控等領域。隨著CAN總線網絡區域的擴大,2個節點之間的直接數據傳輸將難以滿足遠距離通信要求。CAN中繼器是延長CAN總線通信距離的中轉站,其通信效率和通信可靠性直接影響CAN總線的通信能力。傳統的基于單MCU的CAN中繼器難以滿足大量數據的中轉要求,本文基于雙MCU設計高性能的CAN總線中繼器。 1 系統總體設計 CY7C136是2 KB高速CMOS靜態RAM。同一片RAM
[單片機]
雙<font color='red'>MCU</font>的<font color='red'>CAN</font>總線中繼器設計
基于單片機μPD780822的客車CAN總線燈光節點的設計及實現
1 引言 CAN(Controller Area Network)是德國Bosch公司最先提出的,是目前汽車控制器局域網中最流行、最常用的總線。它的主要特點是:CAN總線為多主站總線,各節點均可在任意時刻主動向網絡上的其他節點發送信息,不分主從,通信靈活;CAN總線采用獨特的非破壞性總線仲裁技術,優先級高的節點先傳送數據,能滿足實時性要求;CAN總線具有點對點、一點對多點及全局廣播傳送數據的功能;CAN總線上每幀有效字節數最多為8個,并有CRC及其他校驗措施,數據出錯率極低,某個節點出現嚴重錯誤,可自動脫離總線,總線上的其他操作不受影響;CAN總線只有2條導線,系統擴充時可直接將新節點掛在總線上,因此走線少,系
[單片機]
基于<font color='red'>單片機</font>μPD780822的客車<font color='red'>CAN</font>總線燈光節點的設計及實現
基于CAN總線和PIC單片機的汽車開關電器盒設計
   0 引 言   隨著現代汽車工業技術的不斷發展進步,車上安裝的電子設備在不斷增加,從而使汽車綜合控制系統中,有大量控制信號需要進行實時交換。CAN 總線作為一種可靠的汽車計算機網絡總線,已經被廣泛地推廣到汽車控制系統的各個應用領域。將CAN 總線技術應用到汽車開關電器盒中,可使得各汽車計算機控制單元能夠通過CAN 總線得到開關電器盒中的工作數據,又能對開關電器盒的各個繼電器進行精準的控制,從而達到減少汽車線束、提高通信可靠性、降低系統成本、避免系統功能重復、提高系統工作效率的目的。    1 汽車開關電器盒設計方案   本開關電器盒采用的是基于Microchip 公司生產的PIC18F45K80 芯片作為主芯片的設計方
[單片機]
基于<font color='red'>CAN</font>總線和PIC<font color='red'>單片機</font>的汽車開關電器盒設計
基于PIC單片機的嵌入式CAN智能節點及其與PC的通信
引言 CAN總線是一種串行數據通信協議,其通信接口中集成了CAN協議的物理層和數據鏈路層功能,可完成對數據的成幀處理。CAN協議的一個最大特點是廢除了傳統的站地址編碼,而代之以對通信數據塊編碼,采用這種方法可使網絡內節點個數在理論上不受限制,還可使不同的節點同時收到相同的數據。 本文介紹了嵌入式CAN智能節點,并且應用PC和嵌入式CAN智能節點組成了CAN通信系統,完成了電壓。電流。溫度等信號的實時采集。可靠傳輸和實時顯示,實現了PC端對嵌入式CAN智能節點PWM波輸出的脈沖寬度的控制。 基于PIC單片機的嵌入式CAN智能節點的設計 嵌入式CAN智能節點以PIC16F874單片機作為嵌入式微控制器,以MCP25
[單片機]
Microchip推出搭載硬件安全模塊的PIC32CK 32位單片機, 輕松實現嵌入式安全功能
這款全新的中端MCU系列為設計人員提供了更高水平的安全性和靈活性 自2024年生效的新法律法規對從消費物聯網設備到關鍵基礎設施的網絡安全提出了更嚴格的要求。從產品和供應鏈的角度來看,滿足這些新的安全合規要求可能非常復雜、昂貴且耗時。為了向開發人員提供嵌入式安全解決方案,使他們能夠設計出符合法規要求的應用,Microchip Technology(微芯科技公司)今日宣布推出新型PIC32CK 32位單片機(MCU)系列。 該系列集成了硬件安全模塊(HSM)子系統和采用TrustZone?技術的Arm?Cortex?-M33內核,可幫助隔離并確保設備安全。 PIC32CK SG是市場上首款將HSM的強大安全性與基于硬件的安全
[單片機]
Microchip推出搭載硬件安全<font color='red'>模塊</font>的PIC32CK 32位<font color='red'>單片機</font>,  輕松實現嵌入式安全功能
基于GSM模塊Q2403A和8051單片機實現短消息收發系統的應用方案
基于GSM短消息的業務不需要建立撥號連接,只需把待發的消息加上目的地址發送至短消息中心,再由短消息中心轉發到最終目標。GSM 短消息業務以其連接簡單、費用低廉、覆蓋范圍廣、實現方便等優點得到了廣泛的應用。運用 GSM 短消息實現遠程測控的可靠性較高、信號傳播距離遠、覆蓋面積廣,并且可以節省建網初期的巨額投資。 本文對基于GSM短消息收發系統的設計與實現作了具體描述,給出了系統的軟硬件設計方案,對主要硬件,即GSM模塊Q2403A 和8051單片機作了重點介紹。給出了系統的軟件設計,包括PC與單片機通信部分和短消息收發部分。最后實現系統監控功能。 系統硬件實現 總體系統結構 該系統硬件主要由8051單片機擴展電路、Q2403
[單片機]
基于GSM<font color='red'>模塊</font>Q2403A和8051<font color='red'>單片機</font>實現短消息收發系統的應用方案
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 汤原县| 邵东县| 仁化县| 万安县| 洪湖市| 韶山市| 开阳县| 贵德县| 南开区| 大理市| 桦甸市| 新宾| 亚东县| 莲花县| 衡水市| 宁津县| 台南县| 滨海县| 巧家县| 扎赉特旗| 南岸区| 略阳县| 城步| 沽源县| 慈溪市| 光山县| 韶山市| 无为县| 炎陵县| 夏津县| 余姚市| 新安县| 洛宁县| 泰兴市| 宁都县| 大丰市| 阳春市| 漳浦县| 潼南县| 广丰县| 罗源县|