基于CAN总线的汽车诊断协议UDS,上位机下位机开发

4 篇文章 4 订阅
3 篇文章 2 订阅

前言:UDS...Unified diagnostic service(统一的诊断服务),可以参考14229可以获得相关服务,其中有一部分服务是用来做ECU更新的(也常被叫做FBL),笔者将谈谈这部分,大神们就见笑了。更新可分为:下位机(Bootloader),上位机(更新工具)及其之间的通信协议。

1.下位机:

通常来说下位机就是:MCU(单独就说它了)。那么MCU需要关注的几个地方无非就是:跳转和向量表重映射。之前有用过 Cortex-M0 M3 M4 M7做过更新,M0相比 M3 M4 M7是有区别的,因为它没有中断偏移寄存器,即:VTOR (Vector Table Offset Register)。那么针对这种情况,相关手册也给出方案,大致意思是将 RAM起始地址映射为0x0000_0000,并将App中断向量表拷贝到RAM起始地址。所以对于像M0这种情况,我们需要在App中加如下代码:

memcpy((void*)RAM_STAT_ADDRESS, (void*)APP_START_ADDRESS, vctor_size);   //vctor_size 向量表大小

那么对于有中断偏移寄存器的,操作起来就更方便了,统一都是操作,SCB->VTOR 寄存器,细节如下:

#define VECTOR_ADDR   (0x08010000)  //将要映射的地址位置 不同芯片有区别,具体看手册map

void xBSP_VectorInit(void)
{
	__asm
	{
		CPSID   i
	}

	SCB->VTOR = (uint32_t )VECTOR_ADDR;

	__asm
	{
		CPSIE   i
	}

    /*根据情况确定是否要将向量表拷贝到指定位置 VECTOR_ADDR,建议向量表映射位于RAM位置,非ROM*/
}

2.上位机:

上位机就是用来跟ECU或某种硬件设备通信的工具,像PC端软件(windows  Linux  IOS)或者手持机等。使用上位机的话,一般还会根据我们使用的CAN卡决定,价格从几百到十几万不等。但是对于我们而言,需要的是这个CAN卡的库,这里就拿windows开发上位机来说,需要官方的动态链接库做二次开发。通常拿到库的时候,我们需要测试设备打开,复位,发送,接收这几个比较重要的API(二次开发中用的比较频繁)。然后根据UDS协议和厂商要求开发。

3.通信协议:

基于UDS更新,不得不说 ISO 15765-2 ISO 14229-1.

ISO 15765-2 网络层:描述了CAN ,SF(单帧),FF(首帧),FC(流控帧)和 CF(续帧) 的传输要求。根据要求我们可以用代码实现网络层的解析。

根据 ISO 14229-1 和 厂商的要求我们可以将这一层进行更深入的解析,根据项目而言比较常用的服务有:

0x10  0x11  0x14  0x27 0x28  0x31  0x34  0x36  0x85 等。具体内容大家可以查查手册就会找到(笔者也发布了一个UDS代码生成的工具,里面也有描述 ISO-14229-1UDS代码生成_uds协议栈源代码-制造文档类资源-CSDN下载)。

总体来说,协议根据标准分层解包,是比较可靠有效的方法。

4.部分代码展示 windows:

unsigned int WINAPI xCAN_TxThread(PVOID lpParameter)
{
    CCAN_UDS_Win32Dlg* dlg = (CCAN_UDS_Win32Dlg*)lpParameter;
    UINT8 frameReqStatus = REQ_FALSE;
    UINT8 reqStatus = xCAN_FAILURE;

    while(1)
    {    
        //等待事件触发,事件由上层API产生
        WaitForSingleObject(hCAN_TxEvent, INFINITE);

        if (xCAN_SUCCESS == dlg->my_UDSCAN.xCAN_FrameReq(&frameReqStatus))
        {
            /*获取帧请求后的状态:1.准备继续发送,*/
            switch (frameReqStatus)
            {
            case REQ_SFSUCCESS:
            case REQ_FFSUCCESS:
            case REQ_CFSUCCESS:
                ResetEvent(hCAN_TxEvent);
                break;

            case REQ_CFWAITE:

                break;

            default:

                break;        
            }     
        }

        /*控制线程定时*/
        Sleep(dlg->cycleTimer);   //发送数据不能过快
    }

    return 0;
}

unsigned int WINAPI xCAN_RxThread(PVOID lpParameter)
{
    CCAN_UDS_Win32Dlg* dlg = (CCAN_UDS_Win32Dlg*)lpParameter;
    
    while(1)
    {
        //等待事件触发,由一个定时器提供,保证接收跟解包同步
        WaitForSingleObject(hCAN_RxEvent, INFINITE);
        
        xCAN_ReceiveFrameData(dlg);
            
        ResetEvent(hCAN_RxEvent);    
    }
}

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

uint8_t xSYS_CANUnpackFrame(uint8_t* indata,uint8_t* unpackOver)  
{
    static uint32_t frameTick = 0;  //用于多帧计数
    uint32_t i;
    uint8_t FrmType = indata[0]&0xf0;
   
    switch(FrmType)
    {
        case 0x00:  //sf
        {
            memset(ServiceUnpackData.validData,0xff,512);
            
            ServiceUnpackData.frameType = 0;
            ServiceUnpackData.serviceType = indata[1];
            ServiceUnpackData.validSize = indata[0];
            ServiceUnpackData.frameNum = 1;
            
            memcpy(ServiceUnpackData.validData,(uint8_t*)&indata[1],ServiceUnpackData.validSize);
            
            ServiceUnpackData.isResp = 1;
            *unpackOver = TRUE;
        }
        break;

        case 0x10:  //ff

。。。。。。内容太多,就不展示了。。。。。。。

5.上位机界面展示:

6.打印的相关报文:

     1)      2085.814 1  Rx        07DF -  8    02 10 03 FF FF FF FF FF 
     2)      2094.165 1  Rx        07EB -  8    06 50 03 00 32 00 C8 00 
     3)      2200.169 1  Rx        07DF -  8    02 85 02 FF FF FF FF FF 
     4)      2204.183 1  Rx        07EB -  8    02 C5 02 00 00 00 00 00 
     5)      2207.624 1  Rx        07DF -  8    03 28 00 03 FF FF FF FF 
     6)      2214.187 1  Rx        07EB -  8    02 68 00 00 00 00 00 00 
     7)      2218.514 1  Rx        07E3 -  8    02 10 02 FF FF FF FF FF 
     8)      2224.179 1  Rx        07EB -  8    06 50 02 00 32 00 C8 00 
     9)      2328.289 1  Rx        07E3 -  8    02 27 03 FF FF FF FF FF 
    10)      2334.183 1  Rx        07EB -  8    06 67 03 C6 7E 81 6B 00 
    11)      2338.712 1  Rx        07E3 -  8    06 27 04 C6 7E 81 6B FF 
    12)      2344.193 1  Rx        07EB -  8    02 67 04 00 00 00 00 00 
    13)      2349.942 1  Rx        07E3 -  8    10 0C 31 01 FF 00 00 C1 
    14)      2354.195 1  Rx        07EB -  8    30 00 00 00 00 00 00 00 
    15)      2356.805 1  Rx        07E3 -  8    21 00 00 00 01 00 00 FF 

  • 27
    点赞
  • 157
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
《基于CAN总线UDS服务Bootloader应用开发》是一本详细介绍CAN总线UDS服务的开发的书籍。CAN总线是一种广泛应用于汽车电子系统中的通讯协议,它具有高可靠性和实时性的特点。而UDS(译为统一诊断服务)服务则是一种用于诊断和编程车辆电子控制单元(ECU)的标准。本书主要介绍了如何利用CAN总线UDS服务开发车辆的Bootloader应用。 在车辆的软件开发中,Bootloader应用是一个非常重要的组件,它负责在车辆上电启动时进行系统的初始化和软件的加载。本书首先介绍了CAN总线的基本原理和使用方法,包括CAN帧的构成、CAN总线的通信方式和CAN总线的数据传输速率等。然后详细介绍了UDS服务的原理和使用方法,包括诊断会话的建立、故障码的读取和清除、ECU的编程和参数设置等。 本书的重点在于如何将CAN总线UDS服务应用于Bootloader开发。作者介绍了Bootloader的基本功能和设计要求,如如何进行软件的更新、如何进行固件的校验和加载等。然后详细介绍了如何利用CAN总线UDS服务来实现这些功能。作者给出了一些示例代码和实际应用的案例,以帮助读者更好地理解和运用这些技术。 总之,《基于CAN总线UDS服务Bootloader应用开发》是一本非常实用的书籍,它详细介绍了CAN总线UDS服务的开发,并将它们应用于车辆的Bootloader开发。无论是从事汽车电子开发的工程师,还是对汽车电子技术感兴趣的读者,都可以从这本书中获得实际的帮助和指导。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值