📄 j1939_tl.c
字号:
/**************************************************************************************
*
* 北京航空航大学 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 + -