⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 j1939_tl.c

📁 基于ucosSAEj1939的汽车组合仪表,硬件是MC9S12H128
💻 C
📖 第 1 页 / 共 2 页
字号:

/**************************************************************************************
*                                                                                       
*                      北京航空航大学 706教研室                         
*                   All rights reserved.       2005                                                 
*                                                                                       
*======================================================================================
*                                                                                       
*       文件名:         J1939_TL.c                                                        
*       大纲:           J1939协议栈                  
*       文件标识:                                                                       
*       摘 要:                                                                                                                                                              
*                                                                                      
*======================================================================================
*                                                                                      
*       描述:           传输层文档                                                                                      
*                                                                                      
*       控制器:         Freescale MC9s12H256                                         
*                                                                                      
*       编译器:         Metrowerks CodeWarrior IDE v5.2.1149                            
*                                                                                      
*======================================================================================
*                                                                                      
*       当前版本:   1.0.0                                                                   
*       编程人员:   孙进                                                                 
*       完成日期:   2006年2月                                                                                                                                                                                                   
*                                                                                       
*======================================================================================                                                                          
*
*       更新历史记录:                                                                   
*                                                                                      
***************************************************************************************/

#include "J1939_includes.h"
#include "\driver\printp.h"

static J1939_RX_MESSAGE_T J1939MPMessage;            //多包传输缓冲 
static RECEIVE_STATU_MACHINE_T ReceiveStatuMachine;  //BAM状态机
static J1939_PDU_T J1939PDU;                         //接收PDU报文

//VU16 TimerCounter;

/****************************************************************************************
@函数名称           : void J1939_TL_init( void )         
@参数               : None      
@返回值             : None
@描述               : 在系统启动时调用,用来设置所有状态机到一个已知的状态
@作者               : 孙进
@最后编辑时间       : 2005-11-23
@版本               : V1.0.0
*****************************************************************************************/
void TL_init( void )
{
    U08 i;
  
    J1939MPMessage.PGN = 0;
    J1939MPMessage.dest_addr = 0;
    J1939MPMessage.source_addr = 0;
    J1939MPMessage.byte_count = 0;
    
    J1939PDU.PGN = 0;
    J1939PDU.dest_addr = 0;
    J1939PDU.source_addr = 0;
    J1939PDU.byte_count = 0;
  
    ReceiveStatuMachine.PGN = 0;           
    ReceiveStatuMachine.dest_addr = 0;
    ReceiveStatuMachine.source_addr = 0;
    ReceiveStatuMachine.packet_number = 0;
    ReceiveStatuMachine.timer_counter = 0;
    ReceiveStatuMachine.total_packet_number = 0;
    ReceiveStatuMachine.byte_count = 0;
    ReceiveStatuMachine.status = WAIT_FOR_MESSAGE;
    ReceiveStatuMachine.TP = TP_NONE;
    

    for(i=0;i<NUMBER_TRANS_RX_BUFFERS;i++)
    {
        J1939MPMessage.data[i] = 0;
    }
    
    for(i=0;i<NUMBER_PDU_BUFFERS;i++)
    {
        J1939PDU.data[i] = 0;
    }
   
    //TimerCounter = 0;       //计数器清零 
}

/****************************************************************************************
@函数名称           : U08 Trans_J1939msg(J1939_TX_MESSAGE_T *msg_ptr)         
@参数               : None      
@返回值             : None
@描述               : 通过协议栈发送J1939报文函数
@作者               : 孙进
@最后编辑时间       : 2005-11-23
@版本               : V1.0.0
*****************************************************************************************/
U08 Trans_J1939msg(J1939_TX_MESSAGE_T *msg_ptr)
{
    if(msg_ptr->byte_count>8)
    {
        /*使用传输协议功能多包发送*/
    }
    else
    {
        Build_CANpkt(msg_ptr,0);    
    }
    return TRUE;
}

/****************************************************************************************
@函数名称           : void TL_process (J1939_RX_MESSAGE_T *msg_ptr)        
@参数               : None      
@返回值             : None
@描述               : 传输层接口函数
@作者               : 孙进
@最后编辑时间       : 2005-11-23
@版本               : V1.0.0
*****************************************************************************************/
void TL_process(J1939_PDU_T *pdu_ptr)
{
    U08 i;
    J1939_RX_MESSAGE_T msg;
    
    if((pdu_ptr->PGN==TP_CM)||(pdu_ptr->PGN==TP_DT))
    {
        J1939PDU.PGN = pdu_ptr->PGN;
        J1939PDU.dest_addr = pdu_ptr->dest_addr;
        J1939PDU.source_addr = pdu_ptr->source_addr;
        J1939PDU.byte_count = pdu_ptr->byte_count;
       
        for(i=0;i<NUMBER_PDU_BUFFERS;i++)
        {
            J1939PDU.data[i] = pdu_ptr->data[i];
        }     
    } 
    else
    {
        msg.PGN = pdu_ptr->PGN;
        msg.dest_addr = pdu_ptr->dest_addr;
        msg.source_addr = pdu_ptr->source_addr;
        msg.byte_count = pdu_ptr->byte_count;
        
        for(i=0;i<NUMBER_TRANS_RX_BUFFERS;i++)
        {
            msg.data[i] = pdu_ptr->data[i];
        }       
        NML_process(&msg);
    }
    
    return;
}

/****************************************************************************************
@函数名称           : void TL_periodic ( void )       
@参数               : None      
@返回值             : None
@描述               : 传输层周期函数,处理传输协议功能状态机
@作者               : 孙进
@最后编辑时间       : 2005-11-23
@版本               : V1.0.0
*****************************************************************************************/
void TL_periodic(void)
{       
    U08 i;
    U08 go_on;
    
    go_on = TRUE;       
    ReceiveStatuMachine.timer_counter++;    //TimerCounter++;     //计数器加1
   // TimerCounter++;//test
    while(go_on)
    {
        switch (ReceiveStatuMachine.status)
        {
            case  WAIT_FOR_MESSAGE:
            {
                if(J1939PDU.PGN==TP_CM&&J1939PDU.dest_addr==GLOBADDR||J1939PDU.dest_addr==NODEADDR)
                {
                    if(J1939PDU.data[0]==TP_CM_RTS)
                    {
                        ReceiveStatuMachine.PGN = J1939PDU.data[6];
                        ReceiveStatuMachine.PGN <<= 8;
                        ReceiveStatuMachine.PGN += J1939PDU.data[5];
                        ReceiveStatuMachine.dest_addr = J1939PDU.dest_addr;
                        ReceiveStatuMachine.source_addr = J1939PDU.source_addr;
                        ReceiveStatuMachine.packet_number = 0;
                        ReceiveStatuMachine.timer_counter = 0;
                        ReceiveStatuMachine.total_packet_number = J1939PDU.data[3];
                        ReceiveStatuMachine.byte_count = J1939PDU.data[2];
                        ReceiveStatuMachine.byte_count <<= 8;
                        ReceiveStatuMachine.byte_count += J1939PDU.data[1];
                        ReceiveStatuMachine.status = INIT_REASSEMBLE_STRUCTURE;
                        ReceiveStatuMachine.TP = TP_CM_RTS;
                    }
                    else if(J1939PDU.data[0]==TP_CM_BAM)
                    {
                        ReceiveStatuMachine.PGN = J1939PDU.data[6];
                        ReceiveStatuMachine.PGN <<= 8;
                        ReceiveStatuMachine.PGN += J1939PDU.data[5];
                        ReceiveStatuMachine.dest_addr = J1939PDU.dest_addr;
                        ReceiveStatuMachine.source_addr = J1939PDU.source_addr;
                        ReceiveStatuMachine.packet_number = 0;
                        ReceiveStatuMachine.timer_counter = 0;
                        ReceiveStatuMachine.total_packet_number = J1939PDU.data[3];
                        ReceiveStatuMachine.byte_count = J1939PDU.data[2];
                        ReceiveStatuMachine.byte_count <<= 8;
                        ReceiveStatuMachine.byte_count += J1939PDU.data[1];
                        ReceiveStatuMachine.status = INIT_REASSEMBLE_STRUCTURE;
                        ReceiveStatuMachine.TP = TP_CM_BAM;             

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -