源码先锋

源码先锋

GD32 单片机CAN 协议测试,ISO-15765

admin 37 127

前言

硬件说明:

MCU:GD32C103120M,128K,32kRAM.

输入:USB5V.

OBD功能口定义:OBD(2,10)VPWM、OBD7(K线)、OBD6(CANH)、OBD14(CANL)、OBD15(L线).

软件说明:

汽车(双线OBD6、14)

1、支持波特率:1M、800K、500K、250K、125K、100K、62K、50K、33.3K、25K

汽车CANFD(双线OBD6、14)

1、仲裁区波特率:1M、500K

2、数据区波特率5M4M2M1M

三、汽车KWP/LIN(OBD7)总线数据采集说明

1、波特率:5、4800、9600、10416、57600、115200BPS

三、SAEJ1850(OBD2、10)

1、PWM协议发送接收

2、VPW协议发送接收

目录

第2章

1.电路图2

2.例程说明2

(1)硬件连接2

3.软件设计2

(1)main主要流程2

(2)主要函数说明3

4.PC平台效果7

第2章电路图

例程说明硬件连接

用OBD一分2线接上开发板与CAN采集器,采集器设置波特率500K不过滤采样。

软件设计

CAN1接单片机PB8PB9,500K波特率循环发送CAN标准帧扩展帧数据

main主要流程

//初始化IO设置波特率can_configEx(can_500k);

//设置过滤器CAN_setAllfit();//设置不过滤ID

//发送标准帧SISO15765Data(SData,0xfc00);//15765STCAN

//发送扩展帧SISO15765Data(SData,0x18DB33F1);//15765EXCAN

Main()主要代码

can_configEx(can_500k);//500K波特率

//CAN1_Config16BitFilter(0xFC00,0xFD00);//设置过滤ID

CAN_setAllfit();//设置不过滤ID

/*mainloop*/

while(1)

{

SISO15765Data(SData,0xfc00);//15765STCAN

Delay_ms(100);

SISO15765Data(SData,0x18DB33F1);//15765EXCAN

Delay_ms(100);

}

(2)主要函数说明1初始化can_configEx

voidcan_configEx(uint8_tspeed)

{

can_parameter_structCAN_InitSt;

can_gpio_config();//IO初始化PB8PB9

can_struct_para_init(CAN_INIT_STRUCT,CAN_InitSt);

/*initializeCANregister*/

can_deinit(CAN0);

/*initializeCANparameters*/

CAN__triggered=DISABLE;

CAN__bus_off_recovery=DISABLE;

CAN__wake_up=DISABLE;

//0:使能自动重发ENABLE

//1:禁用自动重发

CAN__retrans=ENABLE;//报文自动传输是否开启如果是发送的环境最好设置成自动重发

CAN__fifo_overwrite=DISABLE;

CAN__fifo_order=DISABLE;

CAN__mode=CAN_NORMAL_MODE;

//CAN_SILENT_MODE静默模式用于监听总线数据不发送显性位当总线有多个节点时可以选择这个模式

//波特率设置总线时钟是60M

//BaudRate=APBCLK/BRP*(1+BS1+BS2)

//SamplePoint=((1+BS1)/(1+BS1+BS2))*100%

CAN__jump_width=CANBAUD[speed][0];

CAN__segment_1=CANBAUD[speed][1];

CAN__segment_2=CANBAUD[speed][2];

CAN_=CANBAUD[speed][3];//BAUD=60m/((1+6+1)*15)87.5%

/*initializeCAN*/

can_init(CAN0,CAN_InitSt);

/*configureCAN0NVIC*/

nvic_irq_enable(CAN0_RX0_IRQn,0,0);//接收中断设置

/*enablecanreceiveFIFO0notemptyinterrupt*/

can_interrupt_enable(CAN0,CAN_INTEN_RFNEIE0);//使能接收中断

}

2设置过滤器CAN_setAllfit

//不过滤ID

voidCAN_setAllfit(void)

{

can_filter_parameter_structCAN_FilterInitStructure;

can_struct_para_init(CAN_FILTER_STRUCT,CAN_FilterInitStructure);

CAN__number=0;

CAN__mode=CAN_FILTERMODE_MASK;

CAN__bits=CAN_FILTERBITS_32BIT;

CAN__enable=ENABLE;

CAN__fifo_number=CAN_FIFO0;

/*configureSFID[10:0]*/

CAN__list_high=(uint16_t)0;

CAN__list_low=(uint16_t)0;

/*configureSFID[10:0]mask*/

CAN__mask_high=(uint16_t)0;

/*bothdataandremoteframescanbereceived*/

CAN__mask_low=(uint16_t)0;

can_filter_init(CAN_FilterInitStructure);

}

3设置标准过滤器CAN1_Config16BitFilter

//标准帧过滤ID设置

voidCAN1_Config16BitFilter(u16id1,u16id2)

{

can_filter_parameter_structCAN_FilterInitStructure;

can_struct_para_init(CAN_FILTER_STRUCT,CAN_FilterInitStructure);

CAN__number=0;//过滤器组

CAN__mode=CAN_FILTERMODE_LIST;//列表模式

CAN__bits=CAN_FILTERBITS_16BIT;//16位ID模式

CAN__enable=ENABLE;

CAN__fifo_number=CAN_FIFO0;

/*configureSFID[10:0]*/

CAN__list_high=(uint16_t)id1;//ID

CAN__list_low=(uint16_t)id2;//ID

/*configureSFID[10:0]mask*/

CAN__mask_high=(uint16_t)id1;//掩码

/*bothdataandremoteframescanbereceived*/

CAN__mask_low=(uint16_t)id2;//掩码

can_filter_init(CAN_FilterInitStructure);

}

4设置扩展过滤器CAN1_Config32BitFilterExList

//列表模式下有0~13共14组能过滤28个扩展帧ID

//iBuffer29位ID缓冲区,iSumFiterID个数

voidCAN1_Config32BitFilterExList(u32*iBuffer,u8iSumFiter)

{

u32id1=0,id2=0;

u8i=0,iCmt=0,iSum=0;

can_filter_parameter_structCAN_FilterInitStructure;

iSum=iSumFiter/2;

if(iSumFiter%2)

{

iSum+=1;

}

for(i=0;iiSum;i++)

{

id1=iBuffer[iCmt++];

id2=iBuffer[iCmt++];

id1=id13;

id2=id23;

if(id1==0)id1=0xffffffff;

if(id2==0)id2=0xffffffff;

can_struct_para_init(CAN_FILTER_STRUCT,CAN_FilterInitStructure);

CAN__number=i;

CAN__mode=CAN_FILTERMODE_LIST;

CAN__bits=CAN_FILTERBITS_32BIT;

CAN__enable=ENABLE;

CAN__fifo_number=CAN_FIFO0;

/*configureSFID[10:0]*/

CAN__list_high=(uint32_t)(id113);

CAN__list_low=(uint32_t)((id13)|4);

/*configureSFID[10:0]mask*/

CAN__mask_high=(uint32_t)(id213);

/*bothdataandremoteframescanbereceived*/

CAN__mask_low=(uint32_t)((id23)|4);

can_filter_init(CAN_FilterInitStructure);

}

}

5发送命令SISO15765Data

//iCanIdCANID,已经移位的FC00(7E0)

//15765标准帧

//cmdaddr[0]=发送长度

//cmdaddr[1]发送的数据

//注:iCanId0xFFFF时为扩展帧

//返回1成功返回0失败

u8SISO15765Data(u8*cmdaddr,u32iCanId)//

{

u32i=0,tmp=0;

uint8_tTransmitMailbox=0;

u8Stollen=cmdaddr[0]0x0F;

if(Stollen==0)return1;

if(Stollen8)Stollen=8;

//初始化参数

can_trasnmit_message_structTbufMege;

can_struct_para_init(CAN_TX_MESSAGE_STRUCT,TbufMege);

if(iCanId0Xffff)//扩展帧

{

_sfid=0;

_efid=iCanId/0X08;

_ff=CAN_FF_EXTENDED;

}

else

{

_sfid=iCanId/0X20;

_efid=0x00;

_ff=CAN_FF_STANDARD;

}

_ft=CAN_FT_DATA;

_dlen=Stollen;

for(u8Sidx=0;SidxStollen;Sidx++)

{

_data[Sidx]=cmdaddr[Sidx+1];

}

can_transmit_state_enumiFlag;

TransmitMailbox=can_message_transmit(CAN0,TbufMege);

////判断是否发送成功

GetTimer6Cnt();//清空

i=0;

while(1)

{

i++;

iFlag=can_transmit_states(CAN0,TransmitMailbox);

if(iFlag==CAN_TRANSMIT_OK)break;//校验是否发送成功

if(i0xFFFFFF)break;

tmp=GetTimer6CntEx();

if(tmp1000*500)break;

}

return1;

}

PC平台效果

EcuSimulator工具设置不过滤,显示数据如下图所示

源码地址