文件組成概述
文件名 | 功能 | 備註 |
---|---|---|
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