GD32汽车诊断KWP 协议/ ISO-14230测试

发布于:2022-12-17 ⋅ 阅读:(306) ⋅ 点赞:(0)
                           前言

硬件说明:
 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 协议发送接收

KWP ISO14230
  1. 电路图
    KWP电路

  2. 例程说明
    物理层特性
    空闲电平通常为12V;
    数据位格式为1+8+1,无校验位;
    常用波特率为10416BPS和9600BPS两种。
    通讯方式
    ① K线 ② K+L线

快速模式
诊断仪在K-线上传送一个唤醒模式(WuP)的信号。该信号在一段空闲时间(300MS)以后,以25ms 的低电平开始。在TWuP 的时间后,接着第一个下降沿,诊断仪发送启动通信服务的第一个位。

本例子 KWP 波特率设置为10416,高低电平激活后,循环发送0xCX格式和0x8X 格式的命令帧
注:用OBD 一分2线接上开发板与CAN/K 采集器

3.软件设计
(1)main主要流程
//InitKinSys(0,0,10416);//25/25 拉低拉高激活系统 并初始化K线波特率
//SendKwp14230Frame(SendData) 发送命令

Main() 主要代码
uint8_t SendData[10]={0xC1,0x33,0xF1,0x81,0x66};
uint8_t SendData1[10]={0x83,0xF1,0x11,0xC1,0xEF,0x8F,0xC4};
gpio_bit_set(GPIOB,GPIO_PIN_11); //PB11=1 开启 1027
InitKinSys(0,0,10416);//25/25 拉低拉高激活系统
/* main loop */
while (1)
{
SendKwp14230Frame(SendData);//CX 开头的帧
Delay_ms(500);
SendKwp14230Frame(SendData1);//8X 开头的帧
Delay_ms(500);

}

(2)usart.c 主要函数说明

1 高低电平激活 Low_High_ms
//波特率设置
//高低电平激活
void Low_High_ms(u16 low,u16 high)
{
rcu_periph_clock_enable(RCU_GPIOA);
/* configure LED2 GPIO port /
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_2);
/
reset LED2 GPIO pin */
//tja1027 芯片控制脚接PB11 ,PB11=1时使能芯片
gpio_bit_set(GPIOB,GPIO_PIN_11); //PB11=1

  gpio_bit_set(GPIOA,GPIO_PIN_2);	//PA2=2  拉高
Delay_ms(300);//300ms 高电平
  //拉低拉高
  gpio_bit_reset(GPIOA,GPIO_PIN_2);	
  Delay_ms(low);
 gpio_bit_set(GPIOA,GPIO_PIN_2);	
  Delay_ms(high);

}

2 初始化UART1_Init
//波特率设置
void UART1_Init(uint32_t bound)
{
/* enable USART, GPIOA clock */
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_USART1);
rcu_periph_clock_enable(RCU_AF);

	nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3);
nvic_irq_enable(USART1_IRQn, 0, 1);


/* connect port to USART1_Tx */
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
/* connect port to USART1_Rx */
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_3);


/* USART1 and USART2 baudrate configuration */
usart_baudrate_set(USART1, bound);//波特率

/* configure USART word length */
usart_word_length_set(USART1, USART_WL_8BIT);//8位数据格式

/* configure USART stop bits */
usart_stop_bit_set(USART1, USART_STB_1BIT);//停止位

/* configure USART transmitter */
usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);//使能发送

/* configure USART receiver */
usart_receive_config(USART1, USART_RECEIVE_ENABLE);//使能接收

/* enable USART */
usart_enable(USART1);

/* enable the USART interrupt */
usart_interrupt_enable(USART1, USART_INT_RBNE);//是能接收中断

}
3 发送命令SendKwp14230Frame

/***********************************************

函数:标准 KWP 2000 命令发送函数
参数:cmdaddr = 83 F1 11 C1 EF 8F C4
功能:
返回:
**********************************************/
uint8_t SendKwp14230Frame(uint8_t cmdaddr[])
{
uint8_t Sidx=0,Slong=0;
uint16_t i=0;
uint32_t tmp=0;
Slong=CountKwpDataLong(cmdaddr);//根据帧头自动计算长度
cmdaddr[Slong-1]=SumDat(cmdaddr,Slong);
//cmdaddr[Slong-1]=sum;//累加和最后一个字节
//USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);//禁中段
/
enable the USART interrupt */
usart_interrupt_disable(USART1, USART_INT_RBNE);
usart_receive_config(USART1, USART_RECEIVE_DISABLE);//关闭接收
usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE);//清款冲
Delay_ms(20);
for(Sidx=0; Sidx <Slong; Sidx ++)
{
KLIN_Send_ByteOne(cmdaddr[Sidx]);
if(Sidx==(Slong-1))
{
Delay_us(20);
usart_data_receive(USART1);
usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE);//清款冲
}
Delay_ms(5);
}
usart_interrupt_enable(USART1, USART_INT_RBNE);
usart_receive_config(USART1, USART_RECEIVE_ENABLE);//使能接收
return Slong;
}

4.PC 平台效果
EcuSimulator 工具设置KWP波特率10416采集,显示数据如下图所示
平台数据

源码地址
硬件地址


网站公告

今日签到

点亮在社区的每一天
去签到