CAN-Bus协议2.0b详解与标准/扩展格式介绍

需积分: 9 0 下载量 187 浏览量 更新于2024-07-14 收藏 1.3MB PDF 举报
CAN-Bus协议2.0bg是一个重要的工业通信标准,用于实时数据交换在汽车、自动化设备和其他需要高可靠性和容错能力的系统中。它是在CAN Bus V1.2的基础上发展起来的,以满足日益增长的应用对于更宽泛的通信地址范围的需求。 CAN Bus最初的标准版本1.2定义了11位的识别符范围,这在很多应用中是足够的。然而,随着技术的发展和更多的设备需要接入网络,扩展格式(29位)被引入,以提供更大的地址空间,使得系统设计者可以根据实际需求选择适合的标准格式或扩展格式。通过保留CAN报文格式的第一个位来区分两种格式,标准格式仍然遵循CAN1.2规范,而扩展格式则提供了新的灵活性。 CAN Bus 2.0bg规范分为两个主要部分: 1. A部分:详细解释了CAN的报文格式,按照CAN1.2标准进行说明,包括帧类型、数据域、远程帧和错误帧等内容。这部分对于那些不使用扩展格式的设备和系统至关重要,确保了它们之间的兼容性。 2. B部分:专门针对标准格式和扩展格式的详细说明,包括它们的特性、帧结构、标识符范围以及如何在支持这两种格式的网络中协同工作。这部分内容对于需要利用扩展地址范围的用户尤为重要。 值得注意的是,CAN Bus 2.0bg兼容性体现在仪器设备上,即无论是基于CAN1.2或CAN2.0b(即B部分)设计的控制器,只要不使用扩展格式,都可以在相同的网络中进行通信。这样就允许市场上的各种不同产品在必要时互相协作,同时保持一定的灵活性。 全球独家推出的覆盖型省线解决方案可能与CAN Bus技术相关,但具体细节并未在给定的部分中详述,可能是针对硬件布线或简化网络配置的优化方案。 CAN Bus 2.0bg是工业控制领域的一个关键升级,它通过引入扩展格式,提升了通信能力,使得设计者能够根据项目需求选择最适合的报文格式,并促进了不同设备之间的无缝集成。

帮我优化一下这段代码配置2M波特率的CANFD :#include "can.h" #include "gd32c10x.h" #include "gd32c10x_eval.h" void can_gpio_config(void) { rcu_periph_clock_enable(RCU_CAN0); rcu_periph_clock_enable(RCU_CAN1); rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_AF); 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_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_5); gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6); gpio_pin_remap_config(GPIO_CAN0_PARTIAL_REMAP , ENABLE); gpio_pin_remap_config(GPIO_CAN1_REMAP, ENABLE); } void can_config(void) { can_parameter_struct can_parameter; can_fdframe_struct can_fd_parameter; can_fd_tdc_struct can_fd_tdc_parameter; can_struct_para_init(CAN_INIT_STRUCT, &can_parameter); can_deinit(CAN0); can_deinit(CAN1); can_parameter.time_triggered = DISABLE; can_parameter.auto_bus_off_recovery = DISABLE; can_parameter.auto_wake_up = DISABLE; can_parameter.auto_retrans = ENABLE; can_parameter.rec_fifo_overwrite = DISABLE; can_parameter.trans_fifo_order = DISABLE; can_parameter.working_mode = CAN_NORMAL_MODE; can_init(CAN0, &can_parameter); can_init(CAN1, &can_parameter); can_frequency_set(CAN0, CAN_BAUD_RATE); can_frequency_set(CAN1, CAN_BAUD_RATE); can_struct_para_init(CAN_FD_FRAME_STRUCT, &can_fd_parameter); can_fd_parameter.fd_frame = ENABLE; can_fd_parameter.excp_event_detect = ENABLE; can_fd_parameter.delay_compensation = ENABLE; can_fd_tdc_parameter.tdc_filter = 0x04; can_fd_tdc_parameter.tdc_mode = CAN_TDCMOD_CALC_AND_OFFSET; can_fd_tdc_parameter.tdc_offset = 0x04; can_fd_parameter.p_delay_compensation = &can_fd_tdc_parameter; can_fd_parameter.iso_bosch = CAN_FDMOD_ISO; can_fd_parameter.esi_mode = CAN_ESIMOD_HARDWARE; can_fd_init(CAN0, &can_fd_parameter); can_fd_init(CAN1, &can_fd_parameter); can_fd_frequency_set(CAN0, CANFD_BAUD_RATE); can_fd_frequency_set(CAN1, CANFD_BAUD_RATE); can1_filter_start_bank(14); can_filter_mask_mode_init(DEV_CAN0_ID, DEV_CAN0_MASK, CAN_EXTENDED_FIFO0, 0); can_filter_mask_mode_init(DEV_CAN1_ID, DEV_CAN1_MASK, CAN_EXTENDED_FIFO0, 15); nvic_irq_enable(CAN0_RX0_IRQn, 7, 0); nvic_irq_enable(CAN1_RX0_IRQn, 7, 0); can_interrupt_enable(CAN0, CAN_INTEN_RFNEIE0); can_interrupt_enable(CAN1, CAN_INTEN_RFNEIE0); }

2023-05-31 上传