SAE J1939 協議源代碼分析(一)-程序結構框架

文件組成概述

文件名 功能 備註
J1939.c 協議源代碼 數據鏈路層,網絡層實現
j1939.h 協議源代碼 數據鏈路層,網絡層實現
j1939_Config.h 協議配置移植文件 移植J1939,唯一改動文件

函數組成結構

函數大概分爲4類:

1.內部函數,J1939內部使用的函數。函數如下:

文件名 類型 備註 文件位置
CompareName() 私有函數 協議內部調用 J1939.c
CopyName() 私有函數 協議內部調用 J1939.c
SendOneMessage() 私有函數 協議內部調用 J1939.c
J1939_AddressClaimHandling() 私有函數 協議內部調用 J1939.c
J1939_RequestForAddressClaimHandling() 私有函數 協議內部調用 J1939.c
J1939_TransmitMessages() 私有函數 協議內部調用 J1939.c
J1939_ReceiveMessages() 私有函數 協議內部調用 J1939.c

2.接口函數,J1939協議提供給用戶使用的函數,函數如下:

文件名 類型 備註 文件位置
J1939_Initialization() 接口函數 用戶可調用的函數 J1939.c
J1939_ISR() 接口函數 用戶可調用的函數 J1939.c
J1939_Poll() 接口函數 用戶可調用的函數 J1939.c
J1939_DequeueMessage() 接口函數 用戶可調用的函數 J1939.c
J1939_EnqueueMessage() 接口函數 用戶可調用的函數 J1939.c

3.J1939與CAN的驅動接口函數,用戶移植函數(中斷接受發送模式)

文件名 類型 備註 文件位置
Port_CAN_Receive() 與CAN的接口函數 需要移植 j1939_Config.h
J1939_CAN_Transmit() 與CAN的接口函數 需要移植 j1939_Config.h
ChangeGroupIDofLMO() 與CAN的接口函數 需要移植 j1939_Config.h
J1939_SetAddressFilter() 與CAN的接口函數 需要移植 j1939_Config.h
J1939_CAN_Transmit() 與CAN的接口函數 需要移植 j1939_Config.h
J1939_RXinterruptEnable() 與CAN的接口函數 需要移植 j1939_Config.h
J1939_RXinterruptDisable() 與CAN的接口函數 需要移植 j1939_Config.h
J1939_TXinterruptEnable() 與CAN的接口函數 需要移植 j1939_Config.h
J1939_TXinterruptDisable() 與CAN的接口函數 需要移植 j1939_Config.h

4.J1939與CAN的驅動接口函數,用戶移植函數(輪詢接受發送模式)

文件名 類型 備註 文件位置
Port_CAN_Receive() 與CAN的接口函數 需要移植 j1939_Config.h
J1939_CAN_Transmit() 與CAN的接口函數 需要移植 j1939_Config.h
ChangeGroupIDofLMO() 與CAN的接口函數 需要移植 j1939_Config.h
J1939_SetAddressFilter() 與CAN的接口函數 需要移植 j1939_Config.h
J1939_CAN_Transmit() 與CAN的接口函數 需要移植 j1939_Config.h

備註:輪詢模式 和 中斷模式 二選其一,在配置文件中。

變量及其聲明框架

1.全局變量

// 私有的全局變量(用戶最好不要調用,除非本協議用作總線的網絡管理器)
extern unsigned char    CA_Name[J1939_DATA_LENGTH]; 
extern J1939_FLAG       J1939_Flags; 
extern J1939_MESSAGE    OneMessage;  
//用戶可用的全局變量(如有多線程操作,請加互斥)
extern unsigned char    J1939_Address; 
extern unsigned char    RXQueueCount; //RX列隊計數器


2.聯合結構體聲明

兩個結構體的使用和說明,將在後面單獨說明:

union J1939_MESSAGE_UNION 
{ 
    struct   me 
    { 
        unsigned int    DataPage            : 1; 
        unsigned int    Res                 : 1; 
        unsigned int    Priority            : 3; 
        unsigned int    PDUFormat_Top       : 3;    // 這就需要前後處理。 

        unsigned char   PDUFormat;      
        unsigned char   PDUSpecific; 
        unsigned char   SourceAddress; 
        unsigned int    DataLength          : 4; 
        unsigned int    RTR                 : 4;  //這幾位總是爲0
        unsigned char   Data[J1939_DATA_LENGTH]; 
    }; 
    struct me Mxe;
    unsigned char       Array[J1939_MSG_LENGTH + J1939_DATA_LENGTH]; 
}; 

typedef union J1939_MESSAGE_UNION J1939_MESSAGE; 
union J1939_FLAGS_UNION 
{ 

struct 
{ 
    unsigned int    CannotClaimAddress              : 1; 
    unsigned int    WaitingForAddressClaimContention: 1; 
    unsigned int    GettingCommandedAddress         : 1; 
    unsigned int    GotFirstDataPacket              : 1; 
    unsigned int    ReceivedMessagesDropped         : 1; 
   }; 
  unsigned char     FlagVal; 
}; 
typedef union J1939_FLAGS_UNION J1939_FLAG; 

3.配置聲明

//配置ECU默認的地址
#define J1939_STARTING_ADDRESS 128

//如果聲明不爲0,表示我們的ECU(電子控制單元)支持網絡中申請的任意地址,(參考J1939的網絡層)下面爲,配置ECU的標識符,(參考J1939-81)和附錄
#define J1939_ARBITRARY_ADDRESS 0x00
#define J1939_INDUSTRY_GROUP 0
#define J1939_VEHICLE_INSTANCE 0
#define J1939_CA_NAME7 (J1939_ARBITRARY_ADDRESS | (J1939_INDUSTRY_GROUP << 4) | J1939_VEHICLE_INSTANCE) 
#define J1939_VEHICLE_SYSTEM 0
#define J1939_CA_NAME6 (J1939_VEHICLE_SYSTEM << 1) 
#define J1939_FUNCTION 0
#define J1939_CA_NAME5 J1939_FUNCTION 
#define J1939_FUNCTION_INSTANCE 0
#define J1939_ECU_INSTANCE 0
#define J1939_CA_NAME4 ((J1939_FUNCTION_INSTANCE << 3) | J1939_ECU_INSTANCE) 
#define J1939_MANUFACTURER_CODE 0
#define J1939_IDENTITY_NUMBER 50
#define J1939_CA_NAME3 (J1939_MANUFACTURER_CODE >> 3) 
#define J1939_CA_NAME2 (((J1939_MANUFACTURER_CODE & 0x07) << 5) | (J1939_IDENTITY_NUMBER >> 16)) 
#define J1939_CA_NAME1 ((J1939_IDENTITY_NUMBER >> 8) & 0xFF) 
#define J1939_CA_NAME0 (J1939_IDENTITY_NUMBER & 0xFF) 

//是否使用接受協議(TP)(參考J1939-21)
#define J1939_ACCEPT_CMDADD J1939_FALSE
//設置接受列隊的大小
#define J1939_RX_QUEUE_SIZE 3
//發送消息列隊是否允許被新的消息覆蓋
#define J1939_OVERWRITE_RX_QUEUE J1939_FALSE
//設置發送列隊的大小
#define J1939_TX_QUEUE_SIZE 3
#define J1939_OVERWRITE_TX_QUEUE J1939_FALSE
//是否使用輪詢模式,否則使用中斷模式
#define J1939_POLL_ECAN J1939_TRUE
#define J1939_PRIORITIZED_INT J1939_TRUE    

4.J1939內部常用代碼(與J1939有關的配置,用戶不能改變)

//函數返回代碼
#define RC_SUCCESS              0  //成功
#define RC_QUEUEEMPTY           1  //列隊爲空
#define RC_QUEUEFULL            1  //列隊滿
#define RC_CANNOTRECEIVE        2  //不能接收
#define RC_CANNOTTRANSMIT       2  //不能傳輸
#define RC_PARAMERROR           3  //參數錯誤

//內部常量
#define J1939_FALSE             0 
#define J1939_TRUE              1 

// J1939 默認的優先級(參考J1939文檔)
#define J1939_CONTROL_PRIORITY          0x03 
#define J1939_INFO_PRIORITY             0x06 
#define J1939_PROPRIETARY_PRIORITY      0x06 
#define J1939_REQUEST_PRIORITY          0x06 
#define J1939_ACK_PRIORITY              0x06 
#define J1939_TP_CM_PRIORITY            0x07 
#define J1939_TP_DT_PRIORITY            0x07 

// J1939 定義的全局地址和空地址
#define J1939_GLOBAL_ADDRESS            255 
#define J1939_NULL_ADDRESS              254 

// 一些用於J1939請求和控制的PF(PUD格式)
#define J1939_PF_REQUEST2           201  //請求
#define J1939_PF_TRANSFER           202  //轉移

#define J1939_PF_REQUEST            234  //請求,用提供握手機制
#define J1939_PF_ACKNOWLEDGMENT     232  //確認請求,用提供握手機制

#define J1939_ACK_CONTROL_BYTE          0    //代表確認
#define J1939_NACK_CONTROL_BYTE         1    //PNG不被支持。否定消息
#define J1939_ACCESS_DENIED_CONTROL_BYTE    2//拒絕訪問,但是信息是被支持
#define J1939_CANNOT_RESPOND_CONTROL_BYTE   3//不能做出反應,有空能是接受的緩存不夠 

#define J1939_PF_DT                     235     // 協議傳輸---數據傳輸
#define J1939_PF_TP_CM                  236     // 協議傳輸---鏈接管理

#define J1939_RTS_CONTROL_BYTE          16      // CM消息的請求發送控制字節
#define J1939_CTS_CONTROL_BYTE          17      // 清除發送控制字節的CM消息
#define J1939_EOMACK_CONTROL_BYTE       19      
#define J1939_BAM_CONTROL_BYTE          32      
#define J1939_CONNABORT_CONTROL_BYTE    255 // 連接中斷控制字節 

//與J1939網絡層有關的定義 
#define J1939_PGN2_REQ_ADDRESS_CLAIM        0x00 
#define J1939_PGN1_REQ_ADDRESS_CLAIM        0xEA   
#define J1939_PGN0_REQ_ADDRESS_CLAIM        0x00 

#define J1939_PGN2_COMMANDED_ADDRESS        0x00 
#define J1939_PGN1_COMMANDED_ADDRESS        0xFE    //命令地址消息 
#define J1939_PGN0_COMMANDED_ADDRESS        0xD8    

#define J1939_PF_ADDRESS_CLAIMED        238      
#define J1939_PF_CANNOT_CLAIM_ADDRESS   238         
#define J1939_PF_PROPRIETARY_A          239         //專用A
#define J1939_PF_PROPRIETARY_B          255         //專用B

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章