GD32 CANFD 仲裁区500K,数据区4M 测试

                          GD32 CANFD 500K_4M

硬件说明:
 MCU: GD32C103 120M,128K,32k RAM.
 输入:USB 5V.
 OBD功能口定义:OBD(2,10)VPWM、OBD 7(K线)、OBD 6(CAN H)、OBD 14(CAN L)、OBD 15(L线).
主控电路

软件说明:
一、汽车CAN2.0(双线OBD 6、14)
1、支持波特率:1M、800K、500K、250K、125K、100K、62K、50K、33.3K、25K

二、汽车CAN FD(双线OBD 6、14)
1、仲裁区波特率:1M、500K
2、数据区波特率5M 4M 2M 1M

三、汽车KWP/LIN(OBD 7)总线数据采集说明
1、波特率:5、4800、9600、10416、57600、115200 BPS

三、SAE J1850(OBD 2、10)
1、PWM 协议发送接收
2、VPW 协议发送接收

CAN_FD_500K_4M_80% 
  1. 电路图
    CAN 电路

2.例程说明
仲裁区波特率500K,数据区波特率4M 采样点80%
用OBD 一分2线接上开发板与CAN 采集器,采集器设置波特率500K不过滤采样

3.软件设计
CAN1 接单片机 PB8 PB9,500K_4M波特率循环发送 CAN 标准帧扩展帧数据
(1)main主要流程
//初始化IO设置波特率CanFD_config(can_500k,Data_4M);//CAN FD 500k 4M ;
//设置过滤器 CAN_setAllfit();//设置不过滤ID
//canfd发送标准帧 CanFdSendISO15765Data(SendData,0xfc00);//15765 STCAN
//canfd发送扩展帧 CanFdSendISO15765Data(SendData,0x18DB33F1);//15765 EXCAN

Main() 主要代码
uint8_t SendData[10]={0x08,0X02,0X10,0x03,0x00,0x00,0x00,0x00,0x00};
uint8_t SendData1[100]={0x09,0X02,0X10,0x03,0x00,0x00,0x00,0x00,0x00};
CanFD_config(can_500k,Data_4M);//CAN FD 500k 4M
//CAN1_Config16BitFilter(0xFC00,0xFD00);//设置过滤ID
CAN_setAllfit();//设置不过滤ID

/* main loop */

while (1)
{

	CanFdSendISO15765Data(SendData,0xfc00);//15765 STCAN 标准帧
	Delay_ms(100);
	CanFdSendISO15765Data(SendData,0x18DB33F1);//15765 EXCAN 扩展帧
	Delay_ms(100);
	for(i=0;i<0x10;i++)//循环发送 长度0~64 字节的数据
	{
		SendData1[0]=i;//长度改变
		SendData1[1]=i;
		CanFdSendISO15765Data(SendData1,0xfd00);// STCAN 变长度 验证CAN FD 
		Delay_ms(100);
	}
}

(2)can.c主要函数说明
1 初始化 CanFD_config
//speed1 仲裁去波特率
//speed2 数据区波特率
void CanFD_config(uint8_t speed1,uint8_t speed2)
{
can_parameter_struct CAN_InitSt;
can_fdframe_struct can_fd_parameter; //CAN FD 参数
can_fd_tdc_struct can_fd_tdc_parameter;//
//GPIO
can_gpio_config();
can_struct_para_init(CAN_INIT_STRUCT, &CAN_InitSt);
/* initialize CAN register */
can_deinit(CAN0);

/* initialize CAN parameters */
CAN_InitSt.time_triggered = DISABLE;
CAN_InitSt.auto_bus_off_recovery = DISABLE;
CAN_InitSt.auto_wake_up = DISABLE;

// 0:使能自动重发
// 1:禁用自动重发
CAN_InitSt.auto_retrans = ENABLE;//报文自动传输 是否开启
CAN_InitSt.rec_fifo_overwrite = DISABLE;
CAN_InitSt.trans_fifo_order = DISABLE;
CAN_InitSt.working_mode = CAN_NORMAL_MODE;

//speed1 仲裁区波特率
CAN_InitSt.resync_jump_width=CANBAUD[speed1][0];
CAN_InitSt.time_segment_1=CANBAUD[speed1][1];
CAN_InitSt.time_segment_2=CANBAUD[speed1][2];
CAN_InitSt.prescaler=CANBAUD[speed1][3];//BAUD=60m/((1+6+1)*15)  87.5%
	
/* initialize CAN */
can_init(CAN0, &CAN_InitSt);
//can_frequency_set(CAN0, DEV_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_parameter.data_resync_jump_width=CANBAUD_data[speed2][0];
can_fd_parameter.data_time_segment_1=CANBAUD_data[speed2][1];
can_fd_parameter.data_time_segment_2=CANBAUD_data[speed2][2];
can_fd_parameter.data_prescaler=CANBAUD_data[speed2][3];//BAUD=60m/((1+6+1)*15)  
can_fd_init(CAN0, &can_fd_parameter);

//can_fd_frequency_set(CAN0, 5000000);//1M 自动波特率函数
/* 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);
}

2 设置过滤器CAN_setAllfit
//不过滤ID
void CAN_setAllfit(void)
{
can_filter_parameter_struct CAN_FilterInitStructure;
can_struct_para_init(CAN_FILTER_STRUCT, &CAN_FilterInitStructure);

	CAN_FilterInitStructure.filter_number = 0;
CAN_FilterInitStructure.filter_mode = CAN_FILTERMODE_MASK;
CAN_FilterInitStructure.filter_bits = CAN_FILTERBITS_32BIT;

CAN_FilterInitStructure.filter_enable = ENABLE;
	 CAN_FilterInitStructure.filter_fifo_number = CAN_FIFO0;
/* configure SFID[10:0] */
CAN_FilterInitStructure.filter_list_high = (uint16_t)0 ;
CAN_FilterInitStructure.filter_list_low = (uint16_t)0;
/* configure SFID[10:0] mask */
CAN_FilterInitStructure.filter_mask_high = (uint16_t)0;
/* both data and remote frames can be received */
CAN_FilterInitStructure.filter_mask_low = (uint16_t)0 ;	
can_filter_init(&CAN_FilterInitStructure);

}
3 设置标准过滤器 CAN1_Config16BitFilter
//标准帧过滤ID 设置
void CAN1_Config16BitFilter(u16 id1, u16 id2)
{
can_filter_parameter_struct CAN_FilterInitStructure;
can_struct_para_init(CAN_FILTER_STRUCT, &CAN_FilterInitStructure);

	CAN_FilterInitStructure.filter_number = 0;//过滤器组
CAN_FilterInitStructure.filter_mode = CAN_FILTERMODE_LIST;//列表模式
CAN_FilterInitStructure.filter_bits = CAN_FILTERBITS_16BIT;//16位ID 模式

CAN_FilterInitStructure.filter_enable = ENABLE;
	 CAN_FilterInitStructure.filter_fifo_number = CAN_FIFO0;
/* configure SFID[10:0] */
CAN_FilterInitStructure.filter_list_high = (uint16_t)id1 ;//ID
CAN_FilterInitStructure.filter_list_low = (uint16_t)id2;//ID
/* configure SFID[10:0] mask */
CAN_FilterInitStructure.filter_mask_high = (uint16_t)id1;//掩码
/* both data and remote frames can be received */
CAN_FilterInitStructure.filter_mask_low = (uint16_t)id2 ;	//掩码
	can_filter_init(&CAN_FilterInitStructure);

}
4 设置扩展过滤器 CAN1_Config32BitFilterExList
//列表模式下 有0~13 共14组 能过滤 28个扩展帧ID
//iBuffer 29 位ID 缓冲区,iSumFiter ID 个数
void CAN1_Config32BitFilterExList(u32 *iBuffer,u8 iSumFiter)
{
u32 id1=0,id2=0;
u8 i=0,iCmt=0,iSum=0;
can_filter_parameter_struct CAN_FilterInitStructure;
iSum=iSumFiter/2;
if(iSumFiter%2)
{
iSum+=1;
}

	for(i=0;i<iSum;i++)
	{
		id1=iBuffer[iCmt++];
		id2=iBuffer[iCmt++];
		
		id1=id1>>3;
		id2=id2>>3;
		
		if(id1==0) id1=0xffffffff;
		if(id2==0) id2=0xffffffff;
		
		can_struct_para_init(CAN_FILTER_STRUCT, &CAN_FilterInitStructure);
		CAN_FilterInitStructure.filter_number = i;
		CAN_FilterInitStructure.filter_mode = CAN_FILTERMODE_LIST;
		CAN_FilterInitStructure.filter_bits = CAN_FILTERBITS_32BIT;
	
		CAN_FilterInitStructure.filter_enable = ENABLE;
		 CAN_FilterInitStructure.filter_fifo_number = CAN_FIFO0;
		/* configure SFID[10:0] */
		CAN_FilterInitStructure.filter_list_high = (uint32_t)(id1>>13);
		CAN_FilterInitStructure.filter_list_low = (uint32_t)((id1<<3)|4);
		/* configure SFID[10:0] mask */
		CAN_FilterInitStructure.filter_mask_high = (uint32_t)(id2>>13);
		/* both data and remote frames can be received */
		CAN_FilterInitStructure.filter_mask_low = (uint32_t)((id2<<3)|4);
		can_filter_init(&CAN_FilterInitStructure);
	}

}

5 CANFD发送命令 CanFdSendISO15765Data

//iCanId CAN ID ,已经移位的 FC00(7E0)
// 15765 标准帧
//cmdaddr[0]= 发送长度
//cmdaddr[1…] 发送的数据
//注: iCanId>0xFFFF 时为扩展帧
//CAN FD 协议 数据长度 1~8,12 16,20,24,32,48,64 最大长度是64,但并不能1~64 之间的任意长度
// 返回1 成功 返回 0 失败
u8 CanFdSendISO15765Data(u8 *cmdaddr,u32 iCanId) //
{
u32 i=0;
uint8_t TransmitMailbox=0;
u8 Stollen=GetFdCanLen(cmdaddr[0]&0x0F);//CAN FD 长度
//初始化参数
can_trasnmit_message_struct TbufMege;
can_struct_para_init(CAN_TX_MESSAGE_STRUCT, &TbufMege);
if(iCanId>0xFFFF)//扩展帧
{
TbufMege.tx_sfid = 0;
TbufMege.tx_efid = iCanId/0X08;
TbufMege.tx_ff = CAN_FF_EXTENDED;//
}
else
{
TbufMege.tx_sfid = iCanId/0X20;
TbufMege.tx_efid = 0x00;
TbufMege.tx_ff = CAN_FF_STANDARD;
}

TbufMege.tx_ft = CAN_FT_DATA;//数据帧
TbufMege.tx_dlen = Stollen;//帧长度
TbufMege.fd_flag = CAN_FDF_FDFRAME;//CAN FD
TbufMege.fd_brs = CAN_BRS_ENABLE;//波特率切换
TbufMege.fd_esi = CAN_ESI_DOMINANT;//CAN_ESI_DOMINANT;//;

for(u8 Sidx = 0; Sidx < Stollen; Sidx ++)
{
TbufMege.tx_data[Sidx] = cmdaddr[Sidx+1];
}

u8 flag=0;
//can_transmit_state_enum iFlag;
TransmitMailbox=can_message_transmit(CAN0, &TbufMege);
while(1)
{
	 flag=can_transmit_states(CAN0,TransmitMailbox);
	 if(flag==CAN_TRANSMIT_OK) break;

	 if(i>250)
	 {//
		 i=0;
		 break;
	 }
	 Delay_us(1);
	 i++;
	 
 }

return 1;//
}

4M
//CAN1_Config16BitFilter(0xFC00,0xFD00);//设置过滤ID
CAN_setAllfit();//设置不过滤ID

/* main loop */

while (1)
{

	CanFdSendISO15765Data(SendData,0xfc00);//15765 STCAN 标准帧
	Delay_ms(100);
	CanFdSendISO15765Data(SendData,0x18DB33F1);//15765 EXCAN 扩展帧
	Delay_ms(100);
	for(i=0;i<0x10;i++)//循环发送 长度0~64 字节的数据
	{
		SendData1[0]=i;//长度改变
		SendData1[1]=i;
		CanFdSendISO15765Data(SendData1,0xfd00);// STCAN 变长度 验证CAN FD 
		Delay_ms(100);
	}

}

4.PC平台效果
EcuSimulator 工具设置CANFD 500K ,4M_80% 不过滤,显示数据如下图所示
CAN 分析仪数据

源码地址
单片机源码地址
硬件地址

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: s32ds flexcan是一款常见的车联网控制器芯片,其最大的特点是支持CAN总线通信协议。在实际应用中,一些场景需要更高的数据传输速率和可靠性,此时可以使用CAN FD(Flexiable Data)协议。 为使s32ds flexcan支持CANFD,需要进行如下配置: 1. 修改波特率配置 CANFD通信需要更高的波特率。在s32ds flexcan的配置中,需要将传输速率提高,以支持CANFD通信。具体的波特率配置需要根据应用场景进行调整。 2. 配置FD控制器 s32ds flexcan芯片集成了FD控制器,可以支持CANFD通信。需要在芯片配置中将FD控制器打开,并设置通信模式等参数。 3. 配置数据位定时器 CANFD通信采用了不同于CAN的数据位定时器。s32ds flexcan需要配置数据位定时器来支持CANFD通信。 4. 配置错误处理 由于CANFD通信的复杂性,可能会出现数据丢失、数据错误等问题。因此,s32ds flexcan需要设置合适的错误处理机制,以兼容CANFD通信。 以上就是s32ds flexcan配置CANFD的具体步骤,需要根据具体应用来进行调整。它可以实现更高的数据传输速率和可靠性,可以在车联网等应用中发挥重要作用。 ### 回答2: S32DS FlexCAN是专门用于汽车电子应用的MCU软件工具,而CANFD(CAN Flexible Data Rate)是CAN协议的升级版本,其最大的特点是可以支持更高的数据传输速率。因此,在使用S32DS FlexCAN时,需要配置CANFD以适应更高的数据传输速率。 首先,需要修改CANFD的波特率预分频器寄存器(CANFD_CCCR)和波特率分频器寄存器(CANFD_BTR)。通过设置CANFD_CCCR的CLKDIV和CANFD_BTR的BRP、SJW、TSEG1和TSEG2来调整CANFD的数据传输速率,以满足不同应用的需求。此外,还需要在配置CANFD时选择合适的中断模式、错误处理模式和工作模式等。其中,工作模式包括常规模式、测试模式和静默模式,可以根据不同的应用场景自由选择。 在完成CANFD的配置后,还需要进行数据的发送和接收操作。可以使用S32DS FlexCAN提供的API函数来实现数据的发送和接收。在数据发送时,需要先将数据写入CANFD的数据缓冲中,然后通过发送请求命令将数据发送出去。在数据接收时,需要先设置接收缓冲和相应的过滤器,然后通过接收缓冲来获取接收到的数据。 总之,通过S32DS FlexCAN和CANFD的配合使用,可以实现高效、可靠、高速的数据传输,为汽车电子应用提供了重要的支持。 ### 回答3: s32ds flexcan是一款面向汽车领域的开发工具,可以帮助开发人员快速开发和调试车载电子控制系统。配置canfd是s32ds flexcan的重要功能之一,可以帮助实现更高的数据传输速率和更靠近实时的数据传输。 在s32ds flexcan中,配置canfd需要进行以下步骤: 1. 配置CAN时钟:可以选择外部时钟或内部时钟。内部时钟需要设置时钟分频比例。 2. 配置canfd时钟:canfd时钟需要使用PLL时钟,需要先配置PLL时钟。可以选择内部PLL时钟或外部时钟。 3. 配置canfd模式:可以选择classic CAN或canfd模式。如果选用canfd模式,需要设置canfd时钟分频系数。 4. 配置canfd数据速率:可以选择8M、5M、4M、2M、1M、500K或250K数据速率。同时需要设置canfd数据段长度、canfd时间段长度和canfd同步点数量。 5. 启动canfd:启动canfd后,可以开始进行数据传输。可以使用s32ds flexcan中提供的调试工具来检查数据传输质量。 总之,s32ds flexcan配置canfd需要进行多项设置和调试工作,需要有一定的开发经验和技术能力。通过理解和掌握上述配置步骤,可以实现高效可靠的canfd数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值