预备知识
1.熟悉CAN2.0B协议,及相关硬件驱动开发
2.熟悉SAE J1939协议http://blog.csdn.net/xietongxueflyme/article/details/74276702/
接口函数简介
函数名 | 函数描述 |
---|---|
J1939_Initialization (BOOL); | 初始化一些全局变量,向总线声明地址(默认地址) |
J1939_DequeueMessage (J1939_MESSAGE *MsgPtr) | 从接受列队中复制接收消息到传入的内存中(*MsgPtr) |
J1939_EnqueueMessage (J1939_MESSAGE *MsgPtr) | 将传入的消息(*MsgPtr),复制到发送列队中 |
J1939_Poll (unsigned long ElapsedTime) | 检查列队(轮询模式),提供小的延时,检查地址竞争 |
J1939_ISR (void) | CAN中断(发送和接受,can错误)函数入口 |
示例1—轮询模式
备注:接受处理,不是标准的接受处理。这里只是测试接受
void main( void )
{
can_init();
J1939_Initialization( TRUE );
//等待地址超时
while (J1939_Flags.WaitingForAddressClaimContention)
J1939_Poll(5);
//设备确认总线上没有,竞争地址的设备存在
while (1)
{
/***********************发送数据***************************/
Msg.DataPage = 0;
Msg.Priority = J1939_CONTROL_PRIORITY;
Msg.DestinationAddress = OTHER_NODE;
Msg.DataLength = 8;
Msg.PDUFormat = 0xfe;
Msg.Data[0] = 0xFF;
Msg.Data[1] = 0xFF;
Msg.Data[2] = 0xFF;
Msg.Data[3] = 0xFF;
Msg.Data[4] = 0xFF;
Msg.Data[5] = 0xFF;
Msg.Data[6] = 0xFF;
Msg.Data[7] = 0xFF;
while (J1939_EnqueueMessage( &Msg ) != RC_SUCCESS)
J1939_Poll(5);
/***********************处理接受数据*************************/
while (RXQueueCount > 0)
{
J1939_DequeueMessage( &Msg );
if (Msg.PDUFormat == 0x01)
//你的功能码;
else if (Msg.PDUFormat == 0x02)
//你的功能码;
}
J1939_Poll(20);
}
}
示例2—中断模式
void main()
{
can_init();
J1939_Initialization( TRUE );
//等待地址超时
while (J1939_Flags.WaitingForAddressClaimContention)
J1939_Poll(5);
//设备确认总线上没有,竞争地址的设备存在
while (1)
{
//判断接受列队中,存在多少个接受消息(RXQueueCount )
while (RXQueueCount > 0)
{
//读取接受列队中的数据到Msg (出队)
J1939_DequeueMessage( &Msg );
/*判断是否是数据请求帧*/
if (Msg.PDUFormat == J1939_PF_REQUEST)
{
//判断参数群是否被本设备支持
if ((Msg.Data[0] == J1939_PGN0_REQ_ENGINE_SPEED) &&
(Msg.Data[1] == J1939_PGN1_REQ_ENGINE_SPEED) &&
(Msg.Data[2] == J1939_PGN2_REQ_ENGINE_SPEED))
{
if (某种原因不能响应)
{
/*********发送不能响应(参考J1939-21)*************/
Msg.Priority = J1939_ACK_PRIORITY;
Msg.DataPage = 0;
Msg.PDUFormat = J1939_PF_ACKNOWLEDGMENT;
Msg.DestinationAddress = Msg.SourceAddress;
Msg.DataLength = 8;
Msg.Data[0] = J1939_NACK_CONTROL_BYTE;
Msg.Data[1] = 0xFF;
Msg.Data[2] = 0xFF;
Msg.Data[3] = 0xFF;
Msg.Data[4] = 0xFF;
Msg.Data[5] = J1939_PGN0_REQ_ENGINE_SPEED;
Msg.Data[6] = J1939_PGN1_REQ_ENGINE_SPEED;
Msg.Data[7] = J1939_PGN2_REQ_ENGINE_SPEED;
}
else
{
/*******************上传相关的参数群*****************/
Msg.Priority = J1939_INFO_PRIORITY;
Msg.DataPage = J1939_PGN2_REQ_ENGINE_SPEED & 0x01;
Msg.PDUFormat = J1939_PGN1_REQ_ENGINE_SPEED;
Msg.GroupExtension = J1939_PGN0_REQ_ENGINE_SPEED;
Msg.DataLength = 1;
Msg.Data[0] = EngineSpeed;
}
while (J1939_EnqueueMessage( &Msg ) != RC_SUCCESS);
}
}
}
}
}