預備知識
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);
}
}
}
}
}