From 5d7a94275238b7123653a2abb439a25dce8ba969 Mon Sep 17 00:00:00 2001 From: Yujia Chen Date: Tue, 4 Aug 2020 20:18:20 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=F0=9F=8E=A8=20=E6=9C=89=E5=A4=A7=E9=87=8F?= =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=8C=E8=A7=81=20CHANGELOG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Yujia Chen --- CHANGELOG | 51 + readme.md | 34 +- source/J1939.H | 592 +++++---- source/J1939.c | 2719 +++++++++++++++++------------------------ source/J1939_Config.H | 354 +----- source/J1939_Config.c | 223 ++++ 6 files changed, 1745 insertions(+), 2228 deletions(-) create mode 100644 CHANGELOG create mode 100644 source/J1939_Config.c diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..81374b3 --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,51 @@ +/********************************************************************* + * + * J1939 Main Source Code + * + ********************************************************************* + * + * 本程序是由XieTongXueFlyMe对现有的J1939协议文档分析,和对前辈的贡献总结, + * 写出的一套开源的J1939驱动。 + * 本协议特点: + * 1.易移植(不针对特定的CAN硬件,只要满足CAN2.0B即可) + * 2.轻量级(可适应低端的MCU) + * 3.支持多任务调用接口(可用于嵌入式系统) + * 4.双模式(轮询或者中断,逻辑更加简单明了) + * 5.不掉帧(数据采用收发列队缓存) + * + * 源代码下载: + * https://github.com/XeiTongXueFlyMe/J1939 + * 源代码临时手册Web站点: + * https://xeitongxueflyme.github.io/j1939doc.github.io/ + * + * Version Date Description + * ------------------------------------------------------------------- + * v1.0.0 2017/06/04 首个版本 Version 1 测试版发布 + * v1.0.1 2017/08/04 完善功能 + * v1.1.0 2017/11/22 Version 1 稳定发布版 + * v2.0.1 2017/11/24 Version 2 测试版发布 + * v2.0.2 2018/01/03 解决V2.0.1 遗留问题 + * v2.1.0 2018/01/20 Version 2 稳定发布版 + * Author Date changes + *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + *XeiTongXueFlyMe 17/06/04 首个版本 + *XeiTongXueFlyMe 17/08/04 增加对TP的支持 + *XeiTongXueFlyMe 17/11/24 增加对多路CAN硬件的收发,和报文处理 + *XeiTongXueFlyMe 17/11/29 增加请求和响应API + *XeiTongXueFlyMe 17/12/07 重做TP接受API函数 + *XeiTongXueFlyMe 17/12/08 增加软件滤波器 + *XeiTongXueFlyMe 18/01/03 重做接受发送API,简化协议栈初始化调用逻辑 + *SummerFalls 20/08/04 简化了宏开关; + 统一自定义类型大小写及_t后缀; + 将多组宏定义分组并改换成枚举类型; + 调整枚举类型变量的命名中相同字段所处的位置, + 例如将 'J1939_CONTROL_BYTE_' 提前, + 方便编辑器快速联想同类型变量; + 将不同CAN节点的相关全局变量使用数组进行管理, + 去除了多个switch代码段所造成的代码重复性高的问题, + 减少了Flash占用,增强了可扩展更多CAN节点的可能性, + 同时增加代码灵活性,尽量避免增减节点时对协议栈主源文件的大量改动; + 注释统一使用 MISRA-C 的标准 C 注释:/* Comment */; + 缩进统一使用空格缩进,避免不同编辑器缩进量差异; + 将本段版本历史记录信息从各个源文件中提取出来,单独存放于 CHANGELOG 文件中。 + **********************************************************************/ \ No newline at end of file diff --git a/readme.md b/readme.md index cf187da..bbc9fd8 100644 --- a/readme.md +++ b/readme.md @@ -1,39 +1,39 @@ # 绠杩 - 1. 婧愪唬鐮佷笅杞斤細 - > https://github.com/XeiTongXueFlyMe/J1939 - 2. 婧愪唬鐮佽鏄庝功Web绔欑偣锛氾紙涓存椂锛屽凡鍑嗗寤虹珯锛屼互鍚庡垎浜洿澶氱殑姹借溅閫氫俊鍗忚锛 - > https://xeitongxueflyme.github.io/j1939doc.github.io/ - 3. 鎶鏈敮鎸佺兢锛 - > QQ缇わ細264864184 锛屼负浜嗚妭绾︽椂闂存垚鏈紝缇や富鍙互鍏嶈垂涓哄ぇ瀹惰В鍐虫渶鏂板崗璁爤闂锛堣佺増鏈紝缇ら噷涔熸湁鍏朵粬宸ョ▼甯堜负澶у瑙e喅锛岀兢涓讳笉鍋氱瓟锛 -# 鍘嗗彶鐗堟湰鍙樻洿 +1. 婧愪唬鐮佷笅杞斤細 + > +2. 婧愪唬鐮佽鏄庝功Web绔欑偣锛氾紙涓存椂锛屽凡鍑嗗寤虹珯锛屼互鍚庡垎浜洿澶氱殑姹借溅閫氫俊鍗忚锛 + > +3. 鎶鏈敮鎸佺兢锛 + > QQ缇わ細264864184 锛屼负浜嗚妭绾︽椂闂存垚鏈紝缇や富鍙互鍏嶈垂涓哄ぇ瀹惰В鍐虫渶鏂板崗璁爤闂锛堣佺増鏈紝缇ら噷涔熸湁鍏朵粬宸ョ▼甯堜负澶у瑙e喅锛岀兢涓讳笉鍋氱瓟锛 + +## 鍘嗗彶鐗堟湰鍙樻洿 > 鐗堟湰璇存槑锛歏 a,b,c - 1. a 浠h〃鐗堟湰鍙 - 2. b 浠h〃绋冲畾鐨勭増鏈彿 - 3. c 浠h〃鍩轰簬绋冲畾鐗堟湰鍙蜂笂鍔熻兘娣诲姞锛屾柊鐨勫姛鑳戒笉涓瀹氱ǔ瀹 -> 濡傛灉鏄伐绋嬩娇鐢紝寤鸿浣跨敤 **V x.x.0** 渚嬪 ***V 1.1.0*** 锛***V 2.1.0*** +1. a 浠h〃鐗堟湰鍙 +2. b 浠h〃绋冲畾鐨勭増鏈彿 +3. c 浠h〃鍩轰簬绋冲畾鐗堟湰鍙蜂笂鍔熻兘娣诲姞锛屾柊鐨勫姛鑳戒笉涓瀹氱ǔ瀹 + +> 濡傛灉鏄伐绋嬩娇鐢紝寤鸿浣跨敤 **V x.x.0** 渚嬪 ***V 1.1.0*** 锛***V 2.1.0*** -## J1939Socket API Version 2 +### J1939Socket API Version 2 Version | date |Description ------------- | ------------- | ------------- [V2.1.0] |2018/1/20| Version 2.1 绋冲畾鍙戝竷鐗堛傜粡杩囧疄鐢ㄦф祴璇曪紝Version 2.1鐩稿Version 1.1鍋氫簡寰堝ぇ鐨勬敼杩涳紝Version 2.1鐗堟湰鏇村姞鐨勫亸鍚戜簬浣跨敤锛岀Щ妞嶆洿鍔犵殑绠鍗曪紝鏋舵瀯鍜屾敞瑙f洿鍔犵殑瑙勮寖銆侫PI(鎺ュ彛)鏇村姞浜烘у寲锛屽疄鐢ㄥ寲锛堟劅璋㈣澶氬悓琛岀殑浣跨敤鍙嶉锛夈 [V2.0.1] |2017/12/8| 鍦板潃绔炰簤锛屽姩鎬佸湴鍧鍒嗛厤绛塉1939缃戠粶鍔熻兘涓嶈兘浣跨敤锛屾湰鐗堟湰涓篤2.1.0鍙戝竷鍓嶇殑娴嬭瘯鐗堟湰銆 - -## J1939Socket API Version 1 +### J1939Socket API Version 1 Version | date | Description ------------- | ------------- | ------------- -[V1.1.0] | 2017/11/22 | Version 1.1 绋冲畾鍙戝竷鐗堛俓n * 瀹炵幇浜咼1939-21鏂囨。瑙勫畾鐨勫姛鑳斤紙鏁版嵁閾捐矾灞傦級銆俓n * 杞婚噺绾э紙鍙傚簲浣庣鐨凪CU锛夊缓璁綆绔殑MCU閲囩敤鏈増鏈Щ妞嶅紑鍙戙俓n * 浣跨敤绀轰緥鍙傝冮檮甯︾殑readme.md鍜 \n * 绉绘绀轰緥鍙傝 +[V1.1.0] | 2017/11/22 | Version 1.1 绋冲畾鍙戝竷鐗堛俓n * 瀹炵幇浜咼1939-21鏂囨。瑙勫畾鐨勫姛鑳斤紙鏁版嵁閾捐矾灞傦級銆俓n * 杞婚噺绾э紙鍙傚簲浣庣鐨凪CU锛夊缓璁綆绔殑MCU閲囩敤鏈増鏈Щ妞嶅紑鍙戙俓n * 浣跨敤绀轰緥鍙傝冮檮甯︾殑readme.md鍜 \n * 绉绘绀轰緥鍙傝 [V1.0.1] | 2017/08/04 | 瀹屽杽鍔熻兘,澧炲姞瀵筎P(闀垮抚锛屽缁)浼犺緭鐨勬敮鎸,\n 1.澧炲姞闈為樆濉濧PI璋冪敤鎺ュ彛 \n * 浣跨敤绀轰緥鍙傝冮檮甯︾殑readme.md鍜 \n * 绉绘绀轰緥鍙傝 \n * 鏈枃妗d笉瀵筕ersion 1 杩涜闃愯堪銆 V1.0.0 | 2017/06/04 | 棣栦釜寮婧愮増鏈琝n 1.澧炲姞鍙屾ā寮忥紙杞鎴栬呬腑鏂紝閫昏緫鏇村姞绠鍗曟槑浜嗭級\n 2.鍙傚簲浣庣鐨凪CU \n 3.鏀寔澶氫换鍔¤皟鐢ㄦ帴鍙o紙鍙敤浜庡祵鍏ュ紡绯荤粺锛 V0.0.1 | 2017/05/04 | 鍒濆缓宸ョ▼\n * 鏄撶Щ妞(涓嶉拡瀵圭壒瀹氱殑CAN纭欢锛屽彧瑕佹弧瓒矯AN2.0B鍗冲彲) [V1.1.0]: https://github.com/XeiTongXueFlyMe/J1939/releases/tag/v1.1.0 "V1.1.0涓嬭浇鍦板潃" -[V1.0.1]: https://github.com/XeiTongXueFlyMe/J1939/releases/tag/V1.01 "V1.0.1涓嬭浇鍦板潃" +[V1.0.1]: https://github.com/XeiTongXueFlyMe/J1939/releases/tag/V1.01 "V1.0.1涓嬭浇鍦板潃" [V2.0.1]: https://github.com/XeiTongXueFlyMe/J1939/releases/tag/V2.0.1 "V2.0.1涓嬭浇鍦板潃" [V2.1.0]: https://github.com/XeiTongXueFlyMe/J1939/releases/tag/V2.1.0 "V2.1.0涓嬭浇鍦板潃" - diff --git a/source/J1939.H b/source/J1939.H index d83164f..f802df0 100644 --- a/source/J1939.H +++ b/source/J1939.H @@ -1,341 +1,301 @@ -锘/********************************************************************* - * - * J1939 Main Source Code - * - ********************************************************************* - * - * 鏈▼搴忔槸鐢盭ieTongXueFlyMe瀵圭幇鏈夌殑J1939鍗忚鏂囨。鍒嗘瀽锛屽拰瀵瑰墠杈堢殑璐$尞鎬荤粨, - * 鍐欏嚭鐨勪竴濂楀紑婧愮殑J1939椹卞姩銆 - * 鏈崗璁壒鐐癸細 - * 1.鏄撶Щ妞嶏紙涓嶉拡瀵圭壒瀹氱殑CAN纭欢锛屽彧瑕佹弧瓒矯AN2.0B鍗冲彲锛 - * 2.杞婚噺绾э紙鍙傚簲浣庣鐨凪CU锛 - * 3.鏀寔澶氫换鍔¤皟鐢ㄦ帴鍙o紙鍙敤浜庡祵鍏ュ紡绯荤粺锛 - * 4.鍙屾ā寮忥紙杞鎴栬呬腑鏂紝閫昏緫鏇村姞绠鍗曟槑浜嗭級 - * 5.涓嶆帀甯э紙鏁版嵁閲囩敤鏀跺彂鍒楅槦缂撳瓨锛 - * - * 婧愪唬鐮佷笅杞斤細 - * https://github.com/XeiTongXueFlyMe/J1939 - * 婧愪唬鐮佷复鏃舵墜鍐學eb绔欑偣锛 - * https://xeitongxueflyme.github.io/j1939doc.github.io/ - * - * Version Date Description - * ------------------------------------------------------------------- - * v1.0.0 2017/06/04 棣栦釜鐗堟湰 Version 1 娴嬭瘯鐗堝彂甯 - * v1.0.1 2017/08/04 瀹屽杽鍔熻兘 - * v1.1.0 2017/11/22 Version 1 绋冲畾鍙戝竷鐗 - * v2.0.1 2017/11/24 Version 2 娴嬭瘯鐗堝彂甯 - * v2.0.2 2018/01/03 瑙e喅V2.0.1 閬楃暀闂 - * v2.1.0 2018/01/20 Version 2 绋冲畾鍙戝竷鐗 - * Author Date changes - *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - *XeiTongXueFlyMe 7/06/04 棣栦釜鐗堟湰 - *XeiTongXueFlyMe 7/08/04 澧炲姞瀵筎P鐨勬敮鎸 - *XeiTongXueFlyMe 7/11/24 澧炲姞瀵瑰璺疌AN纭欢鐨勬敹鍙戯紝鍜屾姤鏂囧鐞 - *XeiTongXueFlyMe 7/11/29 澧炲姞璇锋眰鍜屽搷搴擜PI - *XeiTongXueFlyMe 7/12/07 閲嶅仛TP鎺ュ彈API鍑芥暟 - *XeiTongXueFlyMe 7/12/08 澧炲姞杞欢婊ゆ尝鍣 - *XeiTongXueFlyMe 8/01/03 閲嶅仛鎺ュ彈鍙戦丄PI锛岀畝鍖栧崗璁爤鍒濆鍖栬皟鐢ㄩ昏緫 - **********************************************************************/ -#ifndef __J1939_H -#define __J1939_H -/******************************绫诲瀷澹版槑*********************************/ -#define FALSE 0 -#define TRUE 1 +锘#ifndef __J1939_H +#define __J1939_H + +#include + +/******************************绫诲瀷澹版槑******************************/ /** 缁熶竴绫诲瀷瀹氫箟 - * 涓嶅悓鐨勫崟鐗囨満鐨勭紪璇戝櫒锛 int,short,long 鐨勪綅鏁板彲鑳戒笉鍚 + * 涓嶅悓鐨勫崟鐗囨満鐨勭紪璇戝櫒锛宑har锛宨nt锛宻hort锛宭ong 鐨勪綅鏁板彲鑳戒笉鍚 * * 鍦ㄧЩ妞岼1939鍗忚鏍堟椂锛岄鍏堝簲璇ラ厤缃繖閲 */ -typedef unsigned int j1939_uint32_t; /** < 32浣嶆棤绗﹀彿鏁村舰*/ -typedef int j1939_int32_t; /** < 32浣嶆暣褰*/ -typedef unsigned short j1939_uint16_t; /** < 16浣嶆棤绗﹀彿鏁村舰*/ -typedef unsigned char j1939_uint8_t; /** < 8浣嶆棤绗﹀彿鏁村舰*/ -typedef char j1939_int8_t; /** < 8浣嶆棤绗﹀彿鏁村舰*/ -#define J1939_NULL 0 - -//鍑芥暟杩斿洖浠g爜 -#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 /**< 浠h〃鍑芥暟閿欒杩斿洖*/ -#define J1939_TRUE 1 /**< 浠h〃鍑芥暟姝g‘杩斿洖*/ - -// J1939 榛樿鐨勪紭鍏堢骇锛堝弬鑰僇1939鏂囨。锛 -#define J1939_CONTROL_PRIORITY 0x03 /**< J1939鏂囨。榛樿鐨勪紭鍏堢骇*/ -#define J1939_INFO_PRIORITY 0x06 /**< J1939鏂囨。榛樿鐨勪紭鍏堢骇*/ -#define J1939_PROPRIETARY_PRIORITY 0x06 /**< J1939鏂囨。榛樿鐨勪紭鍏堢骇*/ -#define J1939_REQUEST_PRIORITY 0x06 /**< J1939鏂囨。榛樿鐨勪紭鍏堢骇*/ -#define J1939_ACK_PRIORITY 0x06 /**< J1939鏂囨。榛樿鐨勪紭鍏堢骇*/ -#define J1939_TP_CM_PRIORITY 0x07 /**< J1939鏂囨。榛樿鐨勪紭鍏堢骇*/ -#define J1939_TP_DT_PRIORITY 0x07 /**< J1939鏂囨。榛樿鐨勪紭鍏堢骇*/ - -// J1939 瀹氫箟鐨勫湴鍧 -#define J1939_GLOBAL_ADDRESS 255 /**< 鍏ㄥ眬鍦板潃*/ -#define J1939_NULL_ADDRESS 254 /**< 绌哄湴鍧*/ - -//J1939鍗忚鏍堢殑PNG璇锋眰鍝嶅簲锛岀浉鍏崇殑瀹氫箟 -#define J1939_PF_REQUEST2 201 /**< J1939鍗忚鏍堢殑璇锋眰 PF */ -#define J1939_PF_TRANSFER 202 /**< J1939鍗忚鏍堢殑杞Щ PF */ - -#define J1939_PF_REQUEST 234 /**< 璇锋眰 鎴 鐢ㄤ簬鎻℃墜鏈哄埗*/ -#define J1939_PF_ACKNOWLEDGMENT 232 /**< 纭璇锋眰 鎴 鐢ㄤ簬鎻℃墜鏈哄埗*/ - -#define J1939_ACK_CONTROL_BYTE 0 /**< 鐢ㄤ簬TP(闀垮抚鏁版嵁)锛屼唬琛ㄧ‘璁*/ -#define J1939_NACK_CONTROL_BYTE 1 /**< 鐢ㄤ簬TP(闀垮抚鏁版嵁)锛孭NG涓嶈鏀寔銆傚惁瀹氭秷鎭*/ -#define J1939_ACCESS_DENIED_CONTROL_BYTE 2/**< 鎷掔粷璁块棶锛屼絾鏄俊鎭槸琚敮鎸侊紝鏆傛椂涓嶈兘鍝嶅簲锛堥渶瑕佸啀娆″彂閫佽姹傦級*/ -#define J1939_CANNOT_RESPOND_CONTROL_BYTE 3/**< 涓嶈兘鍋氬嚭鍙嶅簲锛屾湁绌轰絾鏄帴鍙楃殑缂撳瓨涓嶅锛屾垨鍒欏彂閫佽祫婧愯鍗犻锛屾殏鏃朵笉鑳藉搷搴旓紙闇瑕佸啀娆″彂閫佽姹傦級*/ - -//TP鍗忚鐨勪竴浜涘畯瀹氫箟 -#define J1939_PF_DT 235 /**< 鍗忚浼犺緭---鏁版嵁浼犺緭 PF*/ -#define J1939_PF_TP_CM 236 /**< 鍗忚浼犺緭---閾炬帴绠$悊 PF*/ - -//TP鐨勮秴鏃舵椂闂达紝鍗曚綅锛坢s锛 -#define J1939_TP_Tr 200 /**< 瀹忓畾涔塗P鐨勮秴鏃舵椂闂*/ -#define J1939_TP_Th 500 /**< 瀹忓畾涔塗P鐨勮秴鏃舵椂闂*/ -#define J1939_TP_T1 750 /**< 瀹忓畾涔塗P鐨勮秴鏃舵椂闂*/ -#define J1939_TP_T2 1250 /**< 瀹忓畾涔塗P鐨勮秴鏃舵椂闂*/ -#define J1939_TP_T3 1250 /**< 瀹忓畾涔塗P鐨勮秴鏃舵椂闂*/ -#define J1939_TP_T4 1050 /**< 瀹忓畾涔塗P鐨勮秴鏃舵椂闂*/ -#define J1939_TP_TIMEOUT_NORMAL 0 /**< 鏈秴鏃舵甯*/ -#define J1939_TP_TIMEOUT_ABNORMAL 1 /**< 瓒呮椂*/ -#define J1939_RTS_CONTROL_BYTE 16 /**< TP.CM_RTS*/ -#define J1939_CTS_CONTROL_BYTE 17 /**< TP.CM_CTS*/ -#define J1939_EOMACK_CONTROL_BYTE 19 /**< 娑堟伅搴旂瓟缁撴潫*/ -#define J1939_BAM_CONTROL_BYTE 32 /**< 骞挎挱鍏憡娑堟伅*/ -#define J1939_CONNABORT_CONTROL_BYTE 255 /**< 杩炴帴涓柇鎺у埗瀛楄妭锛堟斁寮冭繛鎺ワ級*/ -#define J1939_RESERVED_BYTE 0xFF /**< 鍙橀噺鐨勪繚鐣欎綅鐨勫*/ - -//涓嶫1939缃戠粶灞傛湁鍏崇殑瀹氫箟 -#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 /**< 鍙傝僇1939-81 鍦板潃鍛戒护閰嶇疆*/ - -#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*/ +typedef uint32_t j1939_uint32_t; /** < 32浣嶆棤绗﹀彿鏁村舰 */ +typedef int32_t j1939_int32_t; /** < 32浣嶆湁绗﹀彿鏁村舰 */ +typedef uint16_t j1939_uint16_t; /** < 16浣嶆棤绗﹀彿鏁村舰 */ +typedef uint8_t j1939_uint8_t; /** < 8浣嶆棤绗﹀彿鏁村舰 */ +typedef int8_t j1939_int8_t; /** < 8浣嶆湁绗﹀彿鏁村舰 */ /**< 鏄惁瀵筎P鍗忚鐨勬敮鎸侊紙鏄惁鏀寔闀垮抚锛堝ぇ浜8瀛楄妭鐨勬暟鎹級鐨勫彂閫佷笌鎺ュ彈锛*/ -#define J1939_TP_RX_TX J1939_TRUE +#define J1939_TP_RX_TX J1939_TRUE /**< TP鍗忚鐨勬敮鎸佺殑鏈澶ф帴鍙楀彂閫佹秷鎭暱搴(鏈澶у彲閰嶇疆涓1785)*/ #define J1939_TP_MAX_MESSAGE_LENGTH 240 +#define J1939_NULL 0 + +#define J1939_FALSE 0 /**< 浠h〃鍑芥暟閿欒杩斿洖 */ +#define J1939_TRUE 1 /**< 浠h〃鍑芥暟姝g‘杩斿洖 */ + +/**< 鍑芥暟杩斿洖浠g爜 */ +typedef enum { + RC_SUCCESS = 0, /**< 鎴愬姛*/ + RC_QUEUEEMPTY = 1, /**< 闃熷垪涓虹┖*/ + RC_QUEUEFULL = 1, /**< 闃熷垪婊*/ + RC_CANNOTRECEIVE = 2, /**< 涓嶈兘鎺ユ敹*/ + RC_CANNOTTRANSMIT = 2, /**< 涓嶈兘浼犺緭*/ + RC_PARAMERROR = 3, /**< 鍙傛暟閿欒*/ +} J1939_Status_t; + +/**< J1939 榛樿鐨勪紭鍏堢骇锛堝弬鑰僇1939鏂囨。锛 */ +typedef enum { + J1939_PRIORITY_CONTROL = 0x03, /**< J1939鏂囨。榛樿鐨勪紭鍏堢骇*/ + J1939_PRIORITY_INFO = 0x06, /**< J1939鏂囨。榛樿鐨勪紭鍏堢骇*/ + J1939_PRIORITY_PROPRIETARY = 0x06, /**< J1939鏂囨。榛樿鐨勪紭鍏堢骇*/ + J1939_PRIORITY_REQUEST = 0x06, /**< J1939鏂囨。榛樿鐨勪紭鍏堢骇*/ + J1939_PRIORITY_ACK = 0x06, /**< J1939鏂囨。榛樿鐨勪紭鍏堢骇*/ + J1939_PRIORITY_TP_CM = 0x07, /**< J1939鏂囨。榛樿鐨勪紭鍏堢骇*/ + J1939_PRIORITY_TP_DT = 0x07, /**< J1939鏂囨。榛樿鐨勪紭鍏堢骇*/ +} J1939_Priority_t; + +/**< J1939鍗忚鏍堢殑PNG璇锋眰鍝嶅簲锛岀浉鍏崇殑瀹氫箟 */ +typedef enum { + J1939_PF_REQUEST2 = 201, /**< J1939鍗忚鏍堢殑璇锋眰 PF */ + J1939_PF_TRANSFER = 202, /**< J1939鍗忚鏍堢殑杞Щ PF */ + J1939_PF_ACKNOWLEDGMENT = 232, /**< 纭璇锋眰 鎴 鐢ㄤ簬鎻℃墜鏈哄埗*/ + J1939_PF_REQUEST = 234, /**< 璇锋眰 鎴 鐢ㄤ簬鎻℃墜鏈哄埗*/ + J1939_PF_TP_DT = 235, /**< TP鍗忚浼犺緭---鏁版嵁浼犺緭 PF*/ + J1939_PF_TP_CM = 236, /**< TP鍗忚浼犺緭---閾炬帴绠$悊 PF*/ + J1939_PF_ADDRESS_CLAIMED = 238, + J1939_PF_CANNOT_CLAIM_ADDRESS = 238, + J1939_PF_PROPRIETARY_A = 239, /**< 涓撶敤A*/ + J1939_PF_PROPRIETARY_B = 255, /**< 涓撶敤B*/ +} J1939_PDUFormat_t; + +/**< PF锛圥DUFormat锛夊皬浜 240 鏃讹紝PS锛圥DUSpecific锛変负 DA锛圖estinationAddress锛 */ +typedef enum { + J1939_PS_DA_GLOBAL = 255, /**< 鍏ㄥ眬鍦板潃*/ + J1939_PS_DA_NULL = 254, /**< 绌哄湴鍧*/ +} J1939_PDUSpecific_DA_t; + +typedef enum { + J1939_CONTROL_BYTE_ACK = 0, /**< 鐢ㄤ簬TP(闀垮抚鏁版嵁)锛屼唬琛ㄧ‘璁*/ + J1939_CONTROL_BYTE_NACK = 1, /**< 鐢ㄤ簬TP(闀垮抚鏁版嵁)锛孭NG涓嶈鏀寔銆傚惁瀹氭秷鎭*/ + J1939_CONTROL_BYTE_ACCESS_DENIED = 2, /**< 鎷掔粷璁块棶锛屼絾鏄俊鎭槸琚敮鎸侊紝鏆傛椂涓嶈兘鍝嶅簲锛堥渶瑕佸啀娆″彂閫佽姹傦級*/ + J1939_CONTROL_BYTE_CANNOT_RESPOND = 3, /**< 涓嶈兘鍋氬嚭鍙嶅簲锛屾湁绌轰絾鏄帴鍙楃殑缂撳瓨涓嶅锛屾垨鍒欏彂閫佽祫婧愯鍗犻锛屾殏鏃朵笉鑳藉搷搴旓紙闇瑕佸啀娆″彂閫佽姹傦級*/ + J1939_CONTROL_BYTE_RTS = 16, /**< TP.CM_RTS*/ + J1939_CONTROL_BYTE_CTS = 17, /**< TP.CM_CTS*/ + J1939_CONTROL_BYTE_EOMACK = 19, /**< 娑堟伅搴旂瓟缁撴潫*/ + J1939_CONTROL_BYTE_BAM = 32, /**< 骞挎挱鍏憡娑堟伅*/ + J1939_CONTROL_BYTE_CONNABORT = 255, /**< 杩炴帴涓柇鎺у埗瀛楄妭锛堟斁寮冭繛鎺ワ級*/ + /* CONTROL BYTE RESERVED BELOW */ + J1939_CONTROL_BYTE_RESERVED = 0xFF, /**< 鍙橀噺鐨勪繚鐣欎綅鐨勫*/ +} J1939_CONTROL_BYTE_t; + +/**< TP鐨勮秴鏃舵椂闂达紝鍗曚綅锛坢s锛 */ +typedef enum { + J1939_TP_Tr = 200, + J1939_TP_Th = 500, + J1939_TP_T1 = 750, + J1939_TP_T2 = 1250, + J1939_TP_T3 = 1250, + J1939_TP_T4 = 1050, +} J1939_TP_TIMEOUT_t; + +#define J1939_TP_TIMEOUT_NORMAL 0 /**< 鏈秴鏃舵甯*/ +#define J1939_TP_TIMEOUT_ABNORMAL 1 /**< 瓒呮椂*/ + +/**< 涓嶫1939缃戠粶灞傛湁鍏崇殑瀹氫箟 */ +#define J1939_PGN0_REQ_ADDRESS_CLAIM 0x00 +#define J1939_PGN1_REQ_ADDRESS_CLAIM 0xEA +#define J1939_PGN2_REQ_ADDRESS_CLAIM 0x00 + +#define J1939_PGN0_COMMANDED_ADDRESS 0xD8 /**< 鍙傝僇1939-81 鍦板潃鍛戒护閰嶇疆*/ +#define J1939_PGN1_COMMANDED_ADDRESS 0xFE /**< 鍛戒护鍦板潃娑堟伅*/ +#define J1939_PGN2_COMMANDED_ADDRESS 0x00 + /**CAN鑺傜偣鐨勯夋嫨鏋氫妇 -* -* 榛樿鏀寔鏈澶4璺疌AN纭欢\n -*/ -typedef enum -{ - Select_CAN_NODE_Null, /**< 涓嶉夋嫨浠讳綍CAN纭欢*/ - Select_CAN_NODE_1, /**< 閫夋嫨CAN纭欢 1*/ - Select_CAN_NODE_2, /**< 閫夋嫨CAN纭欢 2*/ - Select_CAN_NODE_3, /**< 閫夋嫨CAN纭欢 3*/ - Select_CAN_NODE_4, /**< 閫夋嫨CAN纭欢 4*/ -}CAN_NODE; + * + * 榛樿鏀寔鏈澶4璺疌AN纭欢\n + */ +typedef enum { + Select_CAN_NODE_1, /**< 閫夋嫨CAN纭欢 1*/ + Select_CAN_NODE_2, /**< 閫夋嫨CAN纭欢 2*/ + Select_CAN_NODE_3, /**< 閫夋嫨CAN纭欢 3*/ + Select_CAN_NODE_4, /**< 閫夋嫨CAN纭欢 4*/ + Select_CAN_NODE_Null, /**< 涓嶉夋嫨浠讳綍CAN纭欢*/ +} CAN_NODE_t; #if J1939_TP_RX_TX /**TP鐨勭姸鎬佹弿杩版灇涓 -* -*/ -typedef enum -{ - J1939_TP_NULL, /**< 闀挎暟鎹紶杈撳浜庣┖闂诧紝鍙湁TP绯荤粺澶勪簬绌洪棽锛屾墠鑳界敤澶勭悊涓嬩竴涓彂閫侊紝鍜屾帴鍙楄姹*/ - J1939_TP_RX, /**< 闀挎暟鎹紶杈撳浜庢帴鏀*/ - J1939_TP_TX, /**< 闀挎暟鎹紶杈撳浜庡彂閫*/ - J1939_TP_OSBUSY,/**< 闀挎暟鎹紶杈撳浜庣箒蹇欙紝姣斿鍒氭帴鍙椾竴鏁存闀挎暟鎹紝浣嗘槸CPU娌℃潵寰楀鐞嗭紝鍙堜竴涓暱鏁版嵁璇锋眰鍒版潵锛屼负浜嗘暟鎹笉琚鐩栵紝灏嗙姸鎬佽涓烘湰鍊*/ -}J1939_TP_State; + * + */ +typedef enum { + J1939_TP_NULL, /**< 闀挎暟鎹紶杈撳浜庣┖闂诧紝鍙湁TP绯荤粺澶勪簬绌洪棽锛屾墠鑳界敤澶勭悊涓嬩竴涓彂閫侊紝鍜屾帴鍙楄姹*/ + J1939_TP_RX, /**< 闀挎暟鎹紶杈撳浜庢帴鏀*/ + J1939_TP_TX, /**< 闀挎暟鎹紶杈撳浜庡彂閫*/ + J1939_TP_OSBUSY, /**< 闀挎暟鎹紶杈撳浜庣箒蹇欙紝姣斿鍒氭帴鍙椾竴鏁存闀挎暟鎹紝浣嗘槸CPU娌℃潵寰楀鐞嗭紝鍙堜竴涓暱鏁版嵁璇锋眰鍒版潵锛屼负浜嗘暟鎹笉琚鐩栵紝灏嗙姸鎬佽涓烘湰鍊*/ +} J1939_TP_STATE_t; + /**TP鐨勬爣蹇椾綅缁撴瀯浣 -* -* 鏈粨鏋勪綋璁板綍浜員P鐨勭姸鎬侊紝浣跨敤TP鍙戦佸拰鎺ュ彈鐨凜AN纭欢缂栧彿 -*/ -typedef struct -{ - J1939_TP_State state; /**< TP鐨勮繛鎺ョ姸鎬*/ - CAN_NODE TP_RX_CAN_NODE; /**< TP鎺ュ彈璇锋眰浜х敓鐨 CAN纭欢缂栧彿*/ - CAN_NODE TP_TX_CAN_NODE; /**< TP鎺ュ彈鍙戦佷骇鐢熺殑 CAN纭欢缂栧彿*/ -}J1939_TP_Flags; + * + * 鏈粨鏋勪綋璁板綍浜員P鐨勭姸鎬侊紝浣跨敤TP鍙戦佸拰鎺ュ彈鐨凜AN纭欢缂栧彿 + */ +typedef struct { + J1939_TP_STATE_t state; /**< TP鐨勮繛鎺ョ姸鎬*/ + CAN_NODE_t TP_RX_CAN_NODE; /**< TP鎺ュ彈璇锋眰浜х敓鐨 CAN纭欢缂栧彿*/ + CAN_NODE_t TP_TX_CAN_NODE; /**< TP鎺ュ彈鍙戦佷骇鐢熺殑 CAN纭欢缂栧彿*/ +} J1939_TP_FLAGS_t; + /**J1939娑堟伅瀵硅薄鐨勭粨鏋勪綋 -* -* 鏈粨鏋勪綋瀹炵幇浜 J1939鐨勬秷鎭璞 -*/ -typedef struct -{ - j1939_uint32_t PGN ; /**< J1939鐨勬秷鎭璞$殑 PGN*/ - j1939_uint8_t data[J1939_TP_MAX_MESSAGE_LENGTH] ;/**< J1939鐨勬秷鎭璞$殑 鏁版嵁*/ - j1939_uint16_t byte_count;/**< J1939鐨勬秷鎭璞$殑 鏁版嵁澶у皬*/ - j1939_uint8_t SA; /**< J1939鐨勬秷鎭璞$殑 鐩爣鍦板潃锛堝彂閫佺洰鐨勫湴 鎴 鎺ュ彈鏉ユ簮鍦帮級*/ - -} J1939_MESSAGE_T ; + * + * 鏈粨鏋勪綋瀹炵幇浜 J1939鐨勬秷鎭璞 + */ +typedef struct { + j1939_uint32_t PGN; /**< J1939鐨勬秷鎭璞$殑 PGN*/ + j1939_uint8_t data[J1939_TP_MAX_MESSAGE_LENGTH]; /**< J1939鐨勬秷鎭璞$殑 鏁版嵁*/ + j1939_uint16_t byte_count; /**< J1939鐨勬秷鎭璞$殑 鏁版嵁澶у皬*/ + j1939_uint8_t SA; /**< J1939鐨勬秷鎭璞$殑 鐩爣鍦板潃锛堝彂閫佺洰鐨勫湴 鎴 鎺ュ彈鏉ユ簮鍦帮級*/ +} J1939_TP_MESSAGE_t; + /**J1939娑堟伅瀵硅薄鐨勭粨鏋勪綋 -* -* 鏈粨鏋勪綋瀹炵幇浜 J1939鐨勫甯ф秷鎭璞 -*/ -typedef struct -{ - j1939_uint8_t *data; /**< 缂撳瓨鍖烘寚閽*/ - j1939_uint16_t data_num; /**< 缂撳瓨鍖哄ぇ灏*/ - j1939_uint8_t SA; /**< J1939鐨勬秷鎭璞$殑 鏁版嵁 婧愬湴鍧*/ - j1939_uint16_t byte_count; /**< J1939鐨勬秷鎭璞$殑 鏁版嵁澶у皬*/ - j1939_uint32_t PGN ; /**< J1939鐨勬秷鎭璞$殑 PGN*/ -}TP_RX_MESSAGE; -/**J1939_TP_Tx_Step鏋氫妇 -* -* 瀹炵幇浜嗚褰曢暱甯э紙澶氬抚锛変紶杈撶殑TX 鐨勬楠 -*/ -typedef enum -{ - J1939_TP_TX_WAIT, - J1939_TP_TX_CM_START, - J1939_TP_TX_CM_WAIT, - J1939_TP_TX_DT, - J1939_TP_WAIT_ACK, - J1939_TP_TX_ERROR, - J1939_TX_DONE, -}J1939_TP_Tx_Step;//鍗忚鐨勫彂閫佹楠 -/**J1939_TRANSPORT_TX_INFO 缁撴瀯浣 -* -* 瀹炵幇浜嗛暱甯т紶杈撲腑浜х敓鐨勪复鏃舵暟鎹紝鍜屼竴浜涗紶杈撲氦鎹㈡暟鎹 -*/ -typedef struct -{ - J1939_MESSAGE_T tp_tx_msg; /**< J1939鐨勬秷鎭璞*/ - j1939_uint16_t time; /**< 鏃堕棿*/ - j1939_uint8_t packet_offset_p; /**< 鏁版嵁鍖呭亸绉绘寚閽*/ - j1939_uint8_t packets_total; /**< 鎬诲叡鏈夊灏戜釜鏁版嵁鍖*/ - j1939_uint8_t packets_request_num; /**< 璇锋眰鍙戦佺殑鏁版嵁鍖呮暟锛堟帴鍙楁柟鍑嗗鎺ュ彈鐨勬暟鎹寘鏁帮級*/ - J1939_TP_Tx_Step state ; /**< 鍗忚鐨勫彂閫佹楠*/ -} J1939_TRANSPORT_TX_INFO; -/**J1939_TP_Rx_Step鏋氫妇 -* -* 瀹炵幇浜嗚褰曢暱甯э紙澶氬抚锛変紶杈撶殑RX 鐨勬楠 -*/ -typedef enum -{ - J1939_TP_RX_WAIT, - J1939_TP_RX_READ_DATA, - J1939_TP_RX_DATA_WAIT, - J1939_TP_RX_ERROR, - J1939_RX_DONE, -}J1939_TP_Rx_Step;//鍗忚鐨勬帴鏀舵楠 - -/**J1939_TRANSPORT_RX_INFO 缁撴瀯浣 -* -* 瀹炵幇浜嗛暱甯т紶杈撲腑浜х敓鐨勪复鏃舵暟鎹紝鍜屼竴浜涗紶杈撲氦鎹㈡暟鎹 -*/ -typedef struct -{ - J1939_MESSAGE_T tp_rx_msg; /**< J1939鐨勬秷鎭璞*/ - j1939_uint8_t osbusy; /**< 姝や綅缃1锛屼唬琛ㄧ郴缁熺箒蹇欙紝cpu闇瑕佸鐞嗗叾浠栫殑浜嬬墿锛岀洿鎺ユ嫆缁濅竴鍒囩殑閾炬帴璇锋眰\n 濡傛灉姝e湪鎺ュ彈涓紝姝や綅缃1锛屽垯浼氬彂鍑洪摼鎺ヤ繚鎸佹秷鎭抚銆*/ - j1939_uint16_t time; /**< 鏃堕棿*/ - j1939_uint8_t packets_total; /**< 鎬诲叡鏈夊灏戜釜鏁版嵁鍖*/ - j1939_uint8_t packets_ok_num;/**< 宸茬粡鎺ュ彈鐨勬暟鎹寘鏁*/ - J1939_TP_Rx_Step state ; /**< 鍗忚鐨勬帴鍙楁楠*/ -} J1939_TRANSPORT_RX_INFO; - -#endif //J1939_TP_RX_TX + * + * 鏈粨鏋勪綋瀹炵幇浜 J1939鐨勫甯ф秷鎭璞 + */ +typedef struct { + j1939_uint8_t *data; /**< 缂撳瓨鍖烘寚閽*/ + j1939_uint16_t data_num; /**< 缂撳瓨鍖哄ぇ灏*/ + j1939_uint8_t SA; /**< J1939鐨勬秷鎭璞$殑 鏁版嵁 婧愬湴鍧*/ + j1939_uint16_t byte_count; /**< J1939鐨勬秷鎭璞$殑 鏁版嵁澶у皬*/ + j1939_uint32_t PGN; /**< J1939鐨勬秷鎭璞$殑 PGN*/ +} TP_RX_MESSAGE_t; + +/**J1939_TP_TX_STEP_t 鏋氫妇 + * + * 瀹炵幇浜嗚褰曢暱甯э紙澶氬抚锛変紶杈撶殑TX 鐨勬楠 + */ +typedef enum { + J1939_TP_TX_WAIT, + J1939_TP_TX_CM_START, + J1939_TP_TX_CM_WAIT, + J1939_TP_TX_DT, + J1939_TP_WAIT_ACK, + J1939_TP_TX_ERROR, + J1939_TX_DONE, +} J1939_TP_TX_STEP_t; /* 鍗忚鐨勫彂閫佹楠 */ + +/**J1939_TRANSPORT_TX_INFO_t 缁撴瀯浣 + * + * 瀹炵幇浜嗛暱甯т紶杈撲腑浜х敓鐨勪复鏃舵暟鎹紝鍜屼竴浜涗紶杈撲氦鎹㈡暟鎹 + */ +typedef struct { + J1939_TP_MESSAGE_t tp_tx_msg; /**< J1939鐨勬秷鎭璞*/ + j1939_uint16_t time; /**< 鏃堕棿*/ + j1939_uint8_t packet_offset_p; /**< 鏁版嵁鍖呭亸绉绘寚閽*/ + j1939_uint8_t packets_total; /**< 鎬诲叡鏈夊灏戜釜鏁版嵁鍖*/ + j1939_uint8_t packets_request_num; /**< 璇锋眰鍙戦佺殑鏁版嵁鍖呮暟锛堟帴鍙楁柟鍑嗗鎺ュ彈鐨勬暟鎹寘鏁帮級*/ + J1939_TP_TX_STEP_t state; /**< 鍗忚鐨勫彂閫佹楠*/ +} J1939_TRANSPORT_TX_INFO_t; + +/**J1939_TP_RX_STEP_t 鏋氫妇 + * + * 瀹炵幇浜嗚褰曢暱甯э紙澶氬抚锛変紶杈撶殑RX 鐨勬楠 + */ +typedef enum { + J1939_TP_RX_WAIT, + J1939_TP_RX_READ_DATA, + J1939_TP_RX_DATA_WAIT, + J1939_TP_RX_ERROR, + J1939_RX_DONE, +} J1939_TP_RX_STEP_t; /* 鍗忚鐨勬帴鏀舵楠 */ + +/**J1939_TRANSPORT_RX_INFO_t 缁撴瀯浣 + * + * 瀹炵幇浜嗛暱甯т紶杈撲腑浜х敓鐨勪复鏃舵暟鎹紝鍜屼竴浜涗紶杈撲氦鎹㈡暟鎹 + */ +typedef struct { + J1939_TP_MESSAGE_t tp_rx_msg; /**< J1939鐨勬秷鎭璞*/ + j1939_uint8_t osbusy; /**< 姝や綅缃1锛屼唬琛ㄧ郴缁熺箒蹇欙紝cpu闇瑕佸鐞嗗叾浠栫殑浜嬬墿锛岀洿鎺ユ嫆缁濅竴鍒囩殑閾炬帴璇锋眰\n 濡傛灉姝e湪鎺ュ彈涓紝姝や綅缃1锛屽垯浼氬彂鍑洪摼鎺ヤ繚鎸佹秷鎭抚銆*/ + j1939_uint16_t time; /**< 鏃堕棿*/ + j1939_uint8_t packets_total; /**< 鎬诲叡鏈夊灏戜釜鏁版嵁鍖*/ + j1939_uint8_t packets_ok_num; /**< 宸茬粡鎺ュ彈鐨勬暟鎹寘鏁*/ + J1939_TP_RX_STEP_t state; /**< 鍗忚鐨勬帴鍙楁楠*/ +} J1939_TRANSPORT_RX_INFO_t; + +#endif /* J1939_TP_RX_TX */ /** -* @note 瀹炵幇Request_PGN 鐨勫搷搴 -*/ -struct Request_List{ - j1939_uint8_t *data; - j1939_uint16_t lenght; - j1939_uint32_t PGN; - CAN_NODE Can_Node; - void (*update)(); /**< 鍦ㄥ嚱鏁伴噷闇瑕佸data鏇存柊锛屽鏋滀笉鐢ㄦ洿鏂癲ata璧嬪间负J1939_NULL*/ - struct Request_List *next; /**< 閾捐〃鏈熬锛岄渶瑕佷竴鐩翠繚鎸丣1939_NULL*/ + * @note 瀹炵幇Request_PGN 鐨勫搷搴 + */ +struct RequestList { + j1939_uint8_t *data; + j1939_uint16_t length; + j1939_uint32_t PGN; + CAN_NODE_t Can_Node; + void (*update)(); /**< 鍦ㄥ嚱鏁伴噷闇瑕佸data鏇存柊锛屽鏋滀笉鐢ㄦ洿鏂癲ata璧嬪间负J1939_NULL*/ + struct RequestList *next; /**< 閾捐〃鏈熬锛岄渶瑕佷竴鐩翠繚鎸丣1939_NULL*/ }; -// J1939 Data Structures -// J1939_MESSAGE_STRUCT鏃ㄥ湪J1939娑堟伅鍧楁槧灏勫埌璁惧鐨勫湴鍧鏄犲皠銆 鍙湁瀛楁PDU鏍煎紡涓嶆槧灏勫埌璁惧瀵勫瓨鍣ㄣ -// 缁撴瀯搴旇绠鍗曞湴浣跨敤PDUFormat鍜屽拷瑙哖DUFormat_Top銆傝皟鏁村皢绔嬪嵆鎺ユ敹鍜屼紶杈撲箣鍓嶃 -// 娉:缂栬瘧鍣ㄥ垱寤虹粨鏋勪粠浣庝竴鐐圭殑浣嶇疆楂樹竴浜涗綅缃紝鎵浠ュ彲鑳藉嚭鐜颁笉鍖归厤鐨勮澶囧瘎瀛樺櫒銆 -#define J1939_MSG_LENGTH 9 //娑堟伅闀垮害 -#define J1939_DATA_LENGTH 8 //鏁版嵁闀垮害 +/* J1939 Data Structures */ +/* J1939_MESSAGE_STRUCT鏃ㄥ湪J1939娑堟伅鍧楁槧灏勫埌璁惧鐨勫湴鍧鏄犲皠銆 鍙湁瀛楁PDU鏍煎紡涓嶆槧灏勫埌 */ +/* 缁撴瀯搴旇绠鍗曞湴浣跨敤PDUFormat鍜屽拷瑙哖DUFormat_Top銆傝皟鏁村皢绔嬪嵆鎺ユ敹鍜屼紶杈撲箣鍓 */ +/* 娉細缂栬瘧鍣ㄥ垱寤虹粨鏋勪粠浣庝竴鐐圭殑浣嶇疆楂樹竴浜涗綅缃紝鎵浠ュ彲鑳藉嚭鐜颁笉鍖归厤鐨勮澶囧瘎瀛樺櫒 */ +#define J1939_MSG_LENGTH 9 /* 娑堟伅闀垮害 */ +#define J1939_DATA_LENGTH 8 /* 鏁版嵁闀垮害 */ /** J1939_MESSAGE_UNION 缁撴瀯浣 -* 瀹炵幇浜咼1939娑堟伅瀵硅薄 -* -* -*/ -union J1939_MESSAGE_UNION -{ -/** j1939 鐨 ID 缁勬垚缁撴瀯浣 -* -*/ - struct j1939_PID - { - j1939_uint8_t DataPage : 1; /**< 鏁版嵁椤*/ - j1939_uint8_t Res : 1; /**< Res浣*/ - j1939_uint8_t Priority : 3; /**< 浼樺厛绾*/ - j1939_uint8_t Reserve : 3; /**< 绌洪棽*/ - j1939_uint8_t PDUFormat; /**< PF*/ - j1939_uint8_t PDUSpecific; /**< PS*/ - j1939_uint8_t SourceAddress; /**< SA*/ - j1939_uint8_t DataLength : 4; /**< 鏁版嵁闀垮害*/ - j1939_uint8_t RTR : 4; /**< RTR浣*/ - j1939_uint8_t Data[J1939_DATA_LENGTH]; /**< 鏁版嵁*/ - j1939_uint32_t PGN :24; /**< 鍙傛暟缇ょ紪鍙*/ - j1939_uint32_t ReservePGN : 8; /**< 绌洪棽*/ - }; - struct j1939_PID Mxe; /**< j1939 鐨 ID 缁勬垚缁撴瀯浣*/ - j1939_uint8_t Array[J1939_MSG_LENGTH + J1939_DATA_LENGTH]; /**< 鑱斿悎浣撴暟缁勶紝鏂逛究蹇熷鐞嗙粨鏋勪綋璧嬪*/ -}; + * + * 瀹炵幇浜咼1939娑堟伅瀵硅薄 + */ +typedef union J1939_MESSAGE_UNION { + /** J1939 鐨 ID 缁勬垚缁撴瀯浣 + * + */ + struct J1939_PID { + j1939_uint8_t DataPage : 1; /**< 鏁版嵁椤*/ + j1939_uint8_t Res : 1; /**< Res浣*/ + j1939_uint8_t Priority : 3; /**< 浼樺厛绾*/ + j1939_uint8_t : 3; /**< 绌洪棽*/ + j1939_uint8_t PDUFormat; /**< PF*/ + j1939_uint8_t PDUSpecific; /**< PS*/ + j1939_uint8_t SourceAddress; /**< SA*/ + j1939_uint8_t DataLength : 4; /**< 鏁版嵁闀垮害*/ + j1939_uint8_t RTR : 4; /**< RTR浣*/ + j1939_uint8_t Data[J1939_DATA_LENGTH]; /**< 鏁版嵁*/ + j1939_uint32_t PGN : 24; /**< 鍙傛暟缇ょ紪鍙*/ + j1939_uint32_t : 8; /**< 绌洪棽*/ + } Mxe; /**< J1939 鐨 ID 缁勬垚缁撴瀯浣*/ + j1939_uint8_t Array[J1939_MSG_LENGTH + J1939_DATA_LENGTH]; /**< 鑱斿悎浣撴暟缁勶紝鏂逛究蹇熷鐞嗙粨鏋勪綋璧嬪*/ +} J1939_MESSAGE_t; -#define GroupExtension PDUSpecific -#define DestinationAddress PDUSpecific /** 涓涓畯瀹氫箟锛屽叿浣撳彉閲忓悕绉颁綔鐢ㄥ懡鍚 -* -*/ -typedef union J1939_MESSAGE_UNION J1939_MESSAGE; - -union J1939_FLAGS_UNION -{ - struct - { - j1939_uint8_t TransmitMessagesdCover : 1; //鍙戦佹暟鎹椂锛孞1939鍗忚鎺ュ彈缂撳瓨鏈夋暟鎹鐩 - j1939_uint8_t ReceivedMessagesdCoverOrDroppedNode : 3; - j1939_uint8_t ReceivedMessagesdCover : 1; //鎺ュ彈鏁版嵁鏃讹紝J1939鍗忚鎺ュ彈缂撳瓨鏈夋暟鎹鐩 - j1939_uint8_t ReceivedMessagesDropped : 1; //鎺ュ彈鏁版嵁鏃讹紝J1939鍗忚鎺ュ彈缂撳瓨鏈夋暟鎹孩鍑 - }; - j1939_uint8_t FlagVal; -}; - -typedef union J1939_FLAGS_UNION J1939_FLAG; - -/********************************************API**************************************************************/ - -//鍒濆鍖栧嚱鏁 -extern void J1939_Initialization( ); -//CAN椹卞姩鏀跺彂涓柇鍏ュ彛 -extern void J1939_ISR( ); -//蹇冭烦鍑芥暟,瀹氭椂琚皟鐢 -extern void J1939_Poll( ); -//璇诲彇鍗曞抚娑堟伅 -extern j1939_uint8_t J1939_Read_Message( J1939_MESSAGE *MsgPtr, CAN_NODE _Can_Node); -//鍙戦佸崟甯ф秷鎭 -extern j1939_uint8_t J1939_Send_Message( J1939_MESSAGE *MsgPtr, CAN_NODE _Can_Node); -//澶氬抚锛堝缁勶級娑堟伅鍙戦佸嚱鏁 (RTS/CTS浼犺緭鍗忚) -extern j1939_int8_t J1939_TP_TX_Message(j1939_uint32_t PGN, j1939_uint8_t DA, j1939_uint8_t *data, j1939_uint16_t data_num, CAN_NODE _Can_Node); -//澶氬抚锛堝缁勶級娑堟伅鎺ュ彈鍑芥暟 (RTS/CTS浼犺緭鍗忚) -extern j1939_int8_t J1939_TP_RX_Message(TP_RX_MESSAGE *msg, CAN_NODE _Can_Node); -//璇锋眰鑾峰幓涓涓狿GN -extern void J1939_Request_PGN(j1939_uint32_t pgn ,j1939_uint8_t DA, CAN_NODE _Can_Node); -//鍒涘缓涓涓狿GN鍝嶅簲 -extern void J1939_Create_Response(j1939_uint8_t data[], j1939_uint16_t dataLenght, j1939_uint32_t PGN, void (*dataUPFun)(), CAN_NODE _Can_Node); - - -#endif //__J1939_H - - - + * + */ +#define GroupExtension PDUSpecific +#define DestinationAddress PDUSpecific + +typedef union J1939_FLAGS_UNION { + struct { + j1939_uint8_t TransmitMessagesdCover : 1; /* 鍙戦佹暟鎹椂锛孞1939鍗忚鎺ュ彈缂撳瓨鏈夋暟鎹鐩 */ + j1939_uint8_t ReceivedMessagesdCoverOrDroppedNode : 3; + j1939_uint8_t ReceivedMessagesdCover : 1; /* 鎺ュ彈鏁版嵁鏃讹紝J1939鍗忚鎺ュ彈缂撳瓨鏈夋暟鎹鐩 */ + j1939_uint8_t ReceivedMessagesDropped : 1; /* 鎺ュ彈鏁版嵁鏃讹紝J1939鍗忚鎺ュ彈缂撳瓨鏈夋暟鎹孩鍑 */ + }; + j1939_uint8_t FlagVal; +} J1939_FLAG_t; + +/******************************API******************************/ + +/* 鍒濆鍖栧嚱鏁 */ +extern void J1939_Initialization(void); +/* CAN椹卞姩鏀跺彂涓柇鍏ュ彛 */ +extern void J1939_ISR(void); +/* 蹇冭烦鍑芥暟锛屽畾鏃惰璋冪敤 */ +extern void J1939_Poll(void); +/* 璇诲彇鍗曞抚娑堟伅 */ +extern J1939_Status_t J1939_Read_Message(J1939_MESSAGE_t *MsgPtr, CAN_NODE_t _Can_Node); +/* 鍙戦佸崟甯ф秷鎭 */ +extern J1939_Status_t J1939_Send_Message(J1939_MESSAGE_t *MsgPtr, CAN_NODE_t _Can_Node); +#if J1939_TP_RX_TX +/* 澶氬抚锛堝缁勶級娑堟伅鍙戦佸嚱鏁 (RTS/CTS浼犺緭鍗忚) */ +extern J1939_Status_t J1939_TP_TX_Message(j1939_uint32_t PGN, j1939_uint8_t DA, j1939_uint8_t *data, + j1939_uint16_t data_num, CAN_NODE_t _Can_Node); +/* 澶氬抚锛堝缁勶級娑堟伅鎺ュ彈鍑芥暟 (RTS/CTS浼犺緭鍗忚) */ +extern J1939_Status_t J1939_TP_RX_Message(TP_RX_MESSAGE_t *msg, CAN_NODE_t _Can_Node); +/* 璇锋眰鑾峰幓涓涓狿GN */ +extern void J1939_Request_PGN(j1939_uint32_t PGN, j1939_uint8_t DA, CAN_NODE_t _Can_Node); +/* 鍒涘缓涓涓狿GN鍝嶅簲 */ +extern void J1939_Create_Response(j1939_uint8_t data[], j1939_uint16_t dataLength, j1939_uint32_t PGN, + void (*dataUPFun)(), CAN_NODE_t _Can_Node); +#endif /* J1939_TP_RX_TX */ + +#endif /* __J1939_H */ diff --git a/source/J1939.c b/source/J1939.c index 2a7de29..c9b8e77 100644 --- a/source/J1939.c +++ b/source/J1939.c @@ -1,464 +1,231 @@ -锘/********************************************************************* - * - * J1939 Main Source Code - * - ********************************************************************* - * - * 鏈▼搴忔槸鐢盭ieTongXueFlyMe瀵圭幇鏈夌殑J1939鍗忚鏂囨。鍒嗘瀽锛屽拰瀵瑰墠杈堢殑璐$尞鎬荤粨, - * 鍐欏嚭鐨勪竴濂楀紑婧愮殑J1939椹卞姩銆 - * 鏈崗璁壒鐐癸細 - * 1.鏄撶Щ妞嶏紙涓嶉拡瀵圭壒瀹氱殑CAN纭欢锛屽彧瑕佹弧瓒矯AN2.0B鍗冲彲锛 - * 2.杞婚噺绾э紙鍙傚簲浣庣鐨凪CU锛 - * 3.鏀寔澶氫换鍔¤皟鐢ㄦ帴鍙o紙鍙敤浜庡祵鍏ュ紡绯荤粺锛 - * 4.鍙屾ā寮忥紙杞鎴栬呬腑鏂紝閫昏緫鏇村姞绠鍗曟槑浜嗭級 - * 5.涓嶆帀甯э紙鏁版嵁閲囩敤鏀跺彂鍒楅槦缂撳瓨锛 - * - * 婧愪唬鐮佷笅杞斤細 - * https://github.com/XeiTongXueFlyMe/J1939 - * 婧愪唬鐮佷复鏃舵墜鍐學eb绔欑偣锛 - * https://xeitongxueflyme.github.io/j1939doc.github.io/ - * - * Version Date Description - * ------------------------------------------------------------------- - * v1.0.0 2017/06/04 棣栦釜鐗堟湰 Version 1 娴嬭瘯鐗堝彂甯 - * v1.0.1 2017/08/04 瀹屽杽鍔熻兘 - * v1.1.0 2017/11/22 Version 1 绋冲畾鍙戝竷鐗 - * v2.0.1 2017/11/24 Version 2 娴嬭瘯鐗堝彂甯 - * v2.0.2 2018/01/03 瑙e喅V2.0.1 閬楃暀闂 - * v2.1.0 2018/01/20 Version 2 绋冲畾鍙戝竷鐗 - * Author Date changes - *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - *XeiTongXueFlyMe 7/06/04 棣栦釜鐗堟湰 - *XeiTongXueFlyMe 7/08/04 澧炲姞瀵筎P鐨勬敮鎸 - *XeiTongXueFlyMe 7/11/24 澧炲姞瀵瑰璺疌AN纭欢鐨勬敹鍙戯紝鍜屾姤鏂囧鐞 - *XeiTongXueFlyMe 7/11/29 澧炲姞璇锋眰鍜屽搷搴擜PI - *XeiTongXueFlyMe 7/12/07 閲嶅仛TP鎺ュ彈API鍑芥暟 - *XeiTongXueFlyMe 7/12/08 澧炲姞杞欢婊ゆ尝鍣 - *XeiTongXueFlyMe 8/01/03 閲嶅仛鎺ュ彈鍙戦丄PI锛岀畝鍖栧崗璁爤鍒濆鍖栬皟鐢ㄩ昏緫 - **********************************************************************/ -#ifndef __J1939_SOURCE -#define __J1939_SOURCE -#endif - -#include "J1939.H" -#include "J1939_config.H" +锘#include "J1939.h" +#include "J1939_Config.h" +#include -#define J1939_TRUE 1 /**< 浠h〃鍑芥暟姝g‘杩斿洖*/ -#define J1939_FALSE 0 /**< 浠h〃鍑芥暟閿欒杩斿洖*/ -#define ADDRESS_CLAIM_TX 1 /**< 杩涘叆鍦板潃绔炰簤鍙戦佸鐞嗘ā寮*/ -#define ADDRESS_CLAIM_RX 2 /**< 杩涘叆鍦板潃绔炰簤鎺ュ彈澶勭悊妯″紡*/ +#define ADDRESS_CLAIM_TX 1 /**< 杩涘叆鍦板潃绔炰簤鍙戦佸鐞嗘ā寮*/ +#define ADDRESS_CLAIM_RX 2 /**< 杩涘叆鍦板潃绔炰簤鎺ュ彈澶勭悊妯″紡*/ -//鍏ㄥ眬鍙橀噺銆 /** 璁惧鐨勬爣绉扮 - * - * 鎴戜滑闇瑕佸湪"J1939_config.H"涓厤缃 - * @note 鍦ㄥ垵濮嬪寲涓祴鍊硷紝璧嬪煎弬鑰冨弬鑰1939-81鏂囨。 + * + * 鎴戜滑闇瑕佸湪"J1939_Config.h"涓厤缃 + * @note 鍦ㄥ垵濮嬪寲涓祴鍊硷紝璧嬪煎弬鑰冨弬鑰僇1939-81鏂囨。 */ -j1939_uint8_t CA_Name[J1939_DATA_LENGTH]; -j1939_uint8_t CommandedAddress; - -j1939_uint8_t J1939_Address; -J1939_FLAG J1939_Flags; -J1939_MESSAGE OneMessage; -CAN_NODE Can_Node; -//鑺傜偣鍦板潃 -j1939_uint8_t NodeAddress_1; -j1939_uint8_t NodeAddress_2; -j1939_uint8_t NodeAddress_3; -j1939_uint8_t NodeAddress_4; -//鎺ュ彈鍒楅槦鍏ㄥ眬鍙橀噺(CAN_NODE_1) -j1939_uint8_t RXHead_1; -j1939_uint8_t RXTail_1; -j1939_uint8_t RXQueueCount_1; -J1939_MESSAGE RXQueue_1[J1939_RX_QUEUE_SIZE]; -//鍙戦佸垪闃熷叏灞鍙橀噺 (CAN_NODE_1) -j1939_uint8_t TXHead_1; -j1939_uint8_t TXTail_1; -j1939_uint8_t TXQueueCount_1; -J1939_MESSAGE TXQueue_1[J1939_TX_QUEUE_SIZE]; -//鎺ュ彈鍒楅槦鍏ㄥ眬鍙橀噺(CAN_NODE_2) -j1939_uint8_t RXHead_2; -j1939_uint8_t RXTail_2; -j1939_uint8_t RXQueueCount_2; -J1939_MESSAGE RXQueue_2[J1939_RX_QUEUE_SIZE]; -//鍙戦佸垪闃熷叏灞鍙橀噺 (CAN_NODE_2) -j1939_uint8_t TXHead_2; -j1939_uint8_t TXTail_2; -j1939_uint8_t TXQueueCount_2; -J1939_MESSAGE TXQueue_2[J1939_TX_QUEUE_SIZE]; -//鎺ュ彈鍒楅槦鍏ㄥ眬鍙橀噺(CAN_NODE_3) -j1939_uint8_t RXHead_3; -j1939_uint8_t RXTail_3; -j1939_uint8_t RXQueueCount_3; -J1939_MESSAGE RXQueue_3[J1939_RX_QUEUE_SIZE]; -//鍙戦佸垪闃熷叏灞鍙橀噺 (CAN_NODE_3) -j1939_uint8_t TXHead_3; -j1939_uint8_t TXTail_3; -j1939_uint8_t TXQueueCount_3; -J1939_MESSAGE TXQueue_3[J1939_TX_QUEUE_SIZE]; -//鎺ュ彈鍒楅槦鍏ㄥ眬鍙橀噺(CAN_NODE_4) -j1939_uint8_t RXHead_4; -j1939_uint8_t RXTail_4; -j1939_uint8_t RXQueueCount_4; -J1939_MESSAGE RXQueue_4[J1939_RX_QUEUE_SIZE]; -//鍙戦佸垪闃熷叏灞鍙橀噺 (CAN_NODE_4) -j1939_uint8_t TXHead_4; -j1939_uint8_t TXTail_4; -j1939_uint8_t TXQueueCount_4; -J1939_MESSAGE TXQueue_4[J1939_TX_QUEUE_SIZE]; - -struct Request_List REQUEST_LIST; +j1939_uint8_t CA_Name[J1939_DATA_LENGTH]; +j1939_uint8_t CommandedAddress; + +j1939_uint8_t J1939_Address; +J1939_FLAG_t J1939_Flags; +J1939_MESSAGE_t OneMessage; +CAN_NODE_t Can_Node; + +/* 鑺傜偣鍦板潃 */ +j1939_uint8_t NodeAddress[J1939_NODE_NUM]; + +/* 鎺ュ彈闃熷垪鍏ㄥ眬鍙橀噺(CAN_NODE) */ +j1939_uint8_t RXHead [J1939_NODE_NUM]; +j1939_uint8_t RXTail [J1939_NODE_NUM]; +j1939_uint8_t RXQueueCount [J1939_NODE_NUM]; +J1939_MESSAGE_t RXQueue [J1939_NODE_NUM][J1939_RX_QUEUE_SIZE]; + +/* 鍙戦侀槦鍒楀叏灞鍙橀噺 (CAN_NODE) */ +j1939_uint8_t TXHead [J1939_NODE_NUM]; +j1939_uint8_t TXTail [J1939_NODE_NUM]; +j1939_uint8_t TXQueueCount [J1939_NODE_NUM]; +J1939_MESSAGE_t TXQueue [J1939_NODE_NUM][J1939_TX_QUEUE_SIZE]; + +struct RequestList REQUEST_LIST; #if J1939_TP_RX_TX -//TP鍗忚鍏ㄥ眬鍙橀噺 -J1939_TP_Flags J1939_TP_Flags_t; -J1939_TRANSPORT_RX_INFO TP_RX_MSG; -J1939_TRANSPORT_TX_INFO TP_TX_MSG; -#endif //J1939_TP_RX_TX +/* TP鍗忚鍏ㄥ眬鍙橀噺 */ +J1939_TP_FLAGS_t J1939_TP_Flags_t; +J1939_TRANSPORT_RX_INFO_t TP_RX_MSG; +J1939_TRANSPORT_TX_INFO_t TP_TX_MSG; -static void J1939_ReceiveMessages( void ); -static j1939_uint8_t J1939_TransmitMessages( void ); +/* 澹版槑TP杞鍑芥暟 */ +static void J1939_TP_Poll(void); +#endif /* J1939_TP_RX_TX */ + +static void J1939_ReceiveMessages(void); +static j1939_uint8_t J1939_TransmitMessages(void); +static void J1939_Response(const j1939_uint32_t PGN); /** -* @note 纭欢婊ゆ尝鍣2 鎴 杞欢婊ゆ尝鍣 婊ゆ尝閰嶇疆锛堣缃甈S娈碉級\n -*/ -void SetAddressFilter( j1939_uint8_t Address ) -{ - /*杞欢婊ゆ尝*/ + * @note 纭欢婊ゆ尝鍣2 鎴 杞欢婊ゆ尝鍣 婊ゆ尝閰嶇疆锛堣缃甈S娈碉級\n + */ +void SetAddressFilter(j1939_uint8_t Address) +{ + /* 杞欢婊ゆ尝 */ #if J1939SoftwareFilterEn == J1939_TRUE - switch (Can_Node) - { - case Select_CAN_NODE_1: - { - NodeAddress_1 = Address; - break; - } - case Select_CAN_NODE_2: - { - NodeAddress_2 = Address; - break; - } - case Select_CAN_NODE_3: - { - NodeAddress_3 = Address; - break; - } - case Select_CAN_NODE_4: - { - NodeAddress_4 = Address; - break; - } - default : - { - break; - } - } -#endif//J1939SoftwareFilterEn - /*纭欢婊ゆ尝*/ - Port_SetAddressFilter(Address); -} + NodeAddress[Can_Node] = Address; +#endif /* J1939SoftwareFilterEn */ + + /* 纭欢婊ゆ尝 */ + Port_SetAddressFilter(Address); +} /** -* @param[in] J1939_MESSAGE * -* @note 鍙戦*MsgPtr鐨勪俊鎭紝鎵鏈夌殑鏁版嵁瀛楁锛堟瘮濡傛暟鎹暱搴︺佷紭鍏堢骇銆佸拰婧愬湴鍧锛夊繀椤诲凡缁忚缃俓n -*/ -void SendOneMessage( J1939_MESSAGE *MsgPtr ) -{ - //璁剧疆娑堟伅鐨勬渶鍚庨儴鍒,纭繚DataLength瑙勮寖銆傦紙鍙傝僀AN B2.0锛 - MsgPtr->Mxe.Res = 0;//鍙傝僇1939鐨勬暟鎹摼璺眰锛圫AE J1939-21锛 - MsgPtr->Mxe.RTR = 0; - if (MsgPtr->Mxe.DataLength > 8) - MsgPtr->Mxe.DataLength = 8; - //鍙戦佷竴甯ф秷鎭紝灏 J1939_MESSAGE 涓殑鎵鏈夋秷鎭姞杞介亾can妯″潡鑷湁鐨勭粨鏋勪腑 - Port_CAN_Transmit(MsgPtr); -} + * @param[in] J1939_MESSAGE * + * @note 鍙戦*MsgPtr鐨勪俊鎭紝鎵鏈夌殑鏁版嵁瀛楁锛堟瘮濡傛暟鎹暱搴︺佷紭鍏堢骇銆佸拰婧愬湴鍧锛夊繀椤诲凡缁忚缃俓n + */ +void SendOneMessage(J1939_MESSAGE_t *MsgPtr) +{ + /* 璁剧疆娑堟伅鐨勬渶鍚庨儴鍒,纭繚DataLength瑙勮寖銆傦紙鍙傝僀AN 2.0B锛 */ + MsgPtr->Mxe.Res = 0; /* 鍙傝僇1939鐨勬暟鎹摼璺眰锛圫AE J1939-21锛 */ + MsgPtr->Mxe.RTR = 0; + + if (MsgPtr->Mxe.DataLength > 8) { + MsgPtr->Mxe.DataLength = 8; + } + + /* 鍙戦佷竴甯ф秷鎭紝灏 J1939_MESSAGE 涓殑鎵鏈夋秷鎭姞杞介亾can妯″潡鑷湁鐨勭粨鏋勪腑 */ + Port_CAN_Transmit(MsgPtr); +} /** -* @param[in] MsgPtr 鐢ㄦ埛瑕佸嚭闃熺殑娑堟伅 -* @param[in] _Can_Node 瑕佸嚭闃熺殑CAN纭欢缂栧彿 -* @return RC_SUCCESS 娑堟伅鍑洪槦鎴愬姛 -* @return RC_QUEUEEMPTY 娌℃湁娑堟伅杩斿洖 -* @note 浠庢帴鍙楅槦鍒椾腑璇诲彇涓涓俊鎭埌*MsgPtr銆傚鏋滄垜浠敤鐨勬槸涓柇锛岄渶瑕佸皢涓柇澶辫兘锛屽湪鑾峰彇鎺ュ彈闃熷垪鏁版嵁鏃 -*/ -j1939_uint8_t J1939_DequeueMessage( J1939_MESSAGE *MsgPtr, CAN_NODE _Can_Node) -{ - j1939_uint8_t _rc = RC_SUCCESS; - - //***************************鍏虫帴鍙椾腑鏂******************************** - #if J1939_POLL_ECAN == J1939_FALSE + * @param[in] MsgPtr 鐢ㄦ埛瑕佸嚭闃熺殑娑堟伅 + * @param[in] _Can_Node 瑕佸嚭闃熺殑CAN纭欢缂栧彿 + * @return RC_SUCCESS 娑堟伅鍑洪槦鎴愬姛 + * @return RC_QUEUEEMPTY 娌℃湁娑堟伅杩斿洖 + * @note 浠庢帴鍙楅槦鍒椾腑璇诲彇涓涓俊鎭埌*MsgPtr銆傚鏋滄垜浠敤鐨勬槸涓柇锛岄渶瑕佸皢涓柇澶辫兘锛屽湪鑾峰彇鎺ュ彈闃熷垪鏁版嵁鏃 + */ +J1939_Status_t J1939_DequeueMessage(J1939_MESSAGE_t *MsgPtr, CAN_NODE_t _Can_Node) +{ + J1939_Status_t _rc = RC_SUCCESS; + + /*************************鍏虫帴鍙椾腑鏂*************************/ Port_RXinterruptDisable(); - #endif - switch (_Can_Node) - { - case Select_CAN_NODE_1: - { - if (RXQueueCount_1 == 0) - { - _rc = RC_QUEUEEMPTY; - } - else - { - *MsgPtr = RXQueue_1[RXHead_1]; - RXHead_1 ++; - if (RXHead_1 >= J1939_RX_QUEUE_SIZE) - RXHead_1 = 0; - RXQueueCount_1 --; - } - break; - } - case Select_CAN_NODE_2: - { - if (RXQueueCount_2 == 0) - { - _rc = RC_QUEUEEMPTY; - } - else - { - *MsgPtr = RXQueue_2[RXHead_2]; - RXHead_2 ++; - if (RXHead_2 >= J1939_RX_QUEUE_SIZE) - RXHead_2 = 0; - RXQueueCount_2 --; - } - break; - } - case Select_CAN_NODE_3: - { - if (RXQueueCount_3 == 0) - { - _rc = RC_QUEUEEMPTY; - } - else - { - *MsgPtr = RXQueue_3[RXHead_3]; - RXHead_3 ++; - if (RXHead_3 >= J1939_RX_QUEUE_SIZE) - RXHead_3 = 0; - RXQueueCount_3 --; - } - break; - } - case Select_CAN_NODE_4: - { - if (RXQueueCount_4 == 0) - { - _rc = RC_QUEUEEMPTY; - } - else - { - *MsgPtr = RXQueue_4[RXHead_4]; - RXHead_4 ++; - if (RXHead_4 >= J1939_RX_QUEUE_SIZE) - RXHead_4 = 0; - RXQueueCount_4 --; - } - break; - } - default : - { - _rc = RC_CANNOTRECEIVE; - break; - } - } - //***************************寮鎺ュ彈涓柇******************************** -#if J1939_POLL_ECAN == J1939_FALSE - Port_RXinterruptEnable(); -#endif - return _rc; + if (_Can_Node < J1939_NODE_NUM) { + if (RXQueueCount[_Can_Node] == 0) { + _rc = RC_QUEUEEMPTY; + } else { + *MsgPtr = RXQueue[_Can_Node][RXHead[_Can_Node]]; + RXHead[_Can_Node]++; + + if (RXHead[_Can_Node] >= J1939_RX_QUEUE_SIZE) { + RXHead[_Can_Node] = 0; + } + + RXQueueCount[_Can_Node]--; + } + } else { + /* 鑻 _Can_Node 绱㈠紩瓒呰繃褰撳墠鍗忚鏍堟敮鎸佽妭鐐规暟锛屽垯杩斿洖 RC_CANNOTRECEIVE */ + _rc = RC_CANNOTRECEIVE; + } + + /*************************寮鎺ュ彈涓柇*************************/ + Port_RXinterruptEnable(); + + return _rc; } + /** -* @param[in] MsgPtr 瀛樺偍璇诲彇娑堟伅鐨勭紦瀛 -* @param[in] _Can_Node 璇诲彇娑堟伅鐨凜AN纭欢缂栧彿锛堜粠鍝竴璺疌AN璇诲彇鏁版嵁锛 -* @return RC_SUCCESS 璇诲彇娑堟伅鎴愬姛锛 -* @return RC_QUEUEEMPTY 璇诲彇娑堟伅涓嶆垚鍔燂紝娌℃湁娑堟伅銆 -* @note 浠庢帴鍙楅槦鍒椾腑璇诲彇涓涓俊鎭埌*MsgPtr銆 -*/ -j1939_uint8_t J1939_Read_Message( J1939_MESSAGE *MsgPtr, CAN_NODE _Can_Node) + * @param[in] MsgPtr 瀛樺偍璇诲彇娑堟伅鐨勭紦瀛 + * @param[in] _Can_Node 璇诲彇娑堟伅鐨凜AN纭欢缂栧彿锛堜粠鍝竴璺疌AN璇诲彇鏁版嵁锛 + * @return RC_SUCCESS 璇诲彇娑堟伅鎴愬姛锛 + * @return RC_QUEUEEMPTY 璇诲彇娑堟伅涓嶆垚鍔燂紝娌℃湁娑堟伅銆 + * @note 浠庢帴鍙楅槦鍒椾腑璇诲彇涓涓俊鎭埌*MsgPtr銆 + */ +J1939_Status_t J1939_Read_Message(J1939_MESSAGE_t *MsgPtr, CAN_NODE_t _Can_Node) { - return J1939_DequeueMessage(MsgPtr,_Can_Node); + return J1939_DequeueMessage(MsgPtr, _Can_Node); } + /** -* @param[in] MsgPtr 鐢ㄦ埛瑕佸叆闃熺殑娑堟伅 -* @param[in] _Can_Node 瑕佸叆闃熺殑CAN纭欢缂栧彿锛堣閫夋嫨鐨勪娇鐢ㄧ殑CAN纭欢缂栧彿锛 -* @return RC_SUCCESS 娑堟伅鍏ラ槦鎴愬姛 -* @return RC_QUEUEFULL 鍙戦佸垪闃熸弧锛屾秷鎭叆闃熷け璐 -* @return RC_CANNOTTRANSMIT 绯荤粺鐩墠涓嶈兘鍙戦佹秷鎭 -* @note 杩欐绋嬪簭锛屽皢*MsgPtr鏀惧叆鍙戦佹秷鎭垪闃熶腑\n - 濡傛灉淇℃伅涓嶈兘鍏ラ槦鎴栬呭彂閫侊紝灏嗘湁涓涓浉搴旂殑杩斿洖鎻愮ず锛孿n - 濡傛灉鍙戦佷腑鏂璁剧疆锛堝彲鐢級锛屽綋娑堟伅鍒楅槦鍚庯紝鍙戦佷腑鏂浣胯兘 -*/ -j1939_uint8_t J1939_EnqueueMessage( J1939_MESSAGE *MsgPtr, CAN_NODE _Can_Node) -{ - j1939_uint8_t _rc = RC_SUCCESS; - -#if J1939_POLL_ECAN == J1939_FALSE + * @param[in] MsgPtr 鐢ㄦ埛瑕佸叆闃熺殑娑堟伅 + * @param[in] _Can_Node 瑕佸叆闃熺殑CAN纭欢缂栧彿锛堣閫夋嫨鐨勪娇鐢ㄧ殑CAN纭欢缂栧彿锛 + * @return RC_SUCCESS 娑堟伅鍏ラ槦鎴愬姛 + * @return RC_QUEUEFULL 鍙戦侀槦鍒楁弧锛屾秷鎭叆闃熷け璐 + * @return RC_CANNOTTRANSMIT 绯荤粺鐩墠涓嶈兘鍙戦佹秷鎭 + * @note 杩欐绋嬪簭锛屽皢*MsgPtr鏀惧叆鍙戦佹秷鎭槦鍒椾腑\n + 濡傛灉淇℃伅涓嶈兘鍏ラ槦鎴栬呭彂閫侊紝灏嗘湁涓涓浉搴旂殑杩斿洖鎻愮ず锛孿n + 濡傛灉鍙戦佷腑鏂璁剧疆锛堝彲鐢級锛屽綋娑堟伅闃熷垪鍚庯紝鍙戦佷腑鏂浣胯兘 + */ +J1939_Status_t J1939_EnqueueMessage(J1939_MESSAGE_t *MsgPtr, CAN_NODE_t _Can_Node) +{ + J1939_Status_t _rc = RC_SUCCESS; + Port_TXinterruptDisable(); -#endif - - if (0) + + if (0) { _rc = RC_CANNOTTRANSMIT; - else - { - switch (_Can_Node) - { - case Select_CAN_NODE_1: - { - if ((J1939_OVERWRITE_TX_QUEUE == J1939_TRUE) || - (TXQueueCount_1 < J1939_TX_QUEUE_SIZE)) - { - if (TXQueueCount_1 < J1939_TX_QUEUE_SIZE) - { - TXQueueCount_1 ++; - TXTail_1 ++; - if (TXTail_1 >= J1939_TX_QUEUE_SIZE) - TXTail_1 = 0; - }else{ - J1939_Flags.TransmitMessagesdCover = 1;//鍙戦佹暟鎹瑕嗙洊锛屼笂涓甯ф暟鎹瑕嗙洊 - } - TXQueue_1[TXTail_1] = *MsgPtr; - } - else - _rc = RC_QUEUEFULL; - break; - } - case Select_CAN_NODE_2: - { - if ((J1939_OVERWRITE_TX_QUEUE == J1939_TRUE) || - (TXQueueCount_2 < J1939_TX_QUEUE_SIZE)) - { - if (TXQueueCount_2 < J1939_TX_QUEUE_SIZE) - { - TXQueueCount_2 ++; - TXTail_2 ++; - if (TXTail_2 >= J1939_TX_QUEUE_SIZE) - TXTail_2 = 0; - }else{ - J1939_Flags.TransmitMessagesdCover = 1;//鍙戦佹暟鎹瑕嗙洊锛屼笂涓甯ф暟鎹瑕嗙洊 - } - TXQueue_2[TXTail_2] = *MsgPtr; - } - else - _rc = RC_QUEUEFULL; - break; - } - case Select_CAN_NODE_3: - { - if ((J1939_OVERWRITE_TX_QUEUE == J1939_TRUE) || - (TXQueueCount_3 < J1939_TX_QUEUE_SIZE)) - { - if (TXQueueCount_3 < J1939_TX_QUEUE_SIZE) - { - TXQueueCount_3 ++; - TXTail_3 ++; - if (TXTail_3 >= J1939_TX_QUEUE_SIZE) - TXTail_3 = 0; - }else{ - J1939_Flags.TransmitMessagesdCover = 1;//鍙戦佹暟鎹瑕嗙洊锛屼笂涓甯ф暟鎹瑕嗙洊 - } - TXQueue_3[TXTail_3] = *MsgPtr; - } - else - _rc = RC_QUEUEFULL; - break; - } - case Select_CAN_NODE_4: - { - if ((J1939_OVERWRITE_TX_QUEUE == J1939_TRUE) || - (TXQueueCount_4 < J1939_TX_QUEUE_SIZE)) - { - if (TXQueueCount_4 < J1939_TX_QUEUE_SIZE) - { - TXQueueCount_4 ++; - TXTail_4 ++; - if (TXTail_4 >= J1939_TX_QUEUE_SIZE) - TXTail_4 = 0; - }else{ - J1939_Flags.TransmitMessagesdCover = 1;//鍙戦佹暟鎹瑕嗙洊锛屼笂涓甯ф暟鎹瑕嗙洊 - } - TXQueue_4[TXTail_4] = *MsgPtr; - } - else - _rc = RC_QUEUEFULL; - break; - } - default : - { - break; - } - } - } - -#if J1939_POLL_ECAN == J1939_FALSE + } else { + if ((J1939_OVERWRITE_TX_QUEUE == J1939_TRUE) || (TXQueueCount[_Can_Node] < J1939_TX_QUEUE_SIZE)) { + if (TXQueueCount[_Can_Node] < J1939_TX_QUEUE_SIZE) { + TXQueueCount[_Can_Node]++; + TXTail[_Can_Node]++; + + if (TXTail[_Can_Node] >= J1939_TX_QUEUE_SIZE) { + TXTail[_Can_Node] = 0; + } + } else { + J1939_Flags.TransmitMessagesdCover = 1; /* 鍙戦佹暟鎹瑕嗙洊锛屼笂涓甯ф暟鎹瑕嗙洊 */ + } + + TXQueue[_Can_Node][TXTail[_Can_Node]] = *MsgPtr; + } else { + _rc = RC_QUEUEFULL; + } + } + Port_TXinterruptEnable(); - //瑙﹀彂鍙戦佷腑鏂 + + /* 瑙﹀彂鍙戦佷腑鏂 */ Port_TXinterruptOk(); -#endif + return _rc; -} +} + /** -* @param[in] MsgPtr 瀛樺偍鍙戦佹秷鎭殑缂撳瓨 -* @param[in] _Can_Node 鍙戦佹秷鎭殑CAN纭欢缂栧彿锛堜粠鍝竴璺疌AN鍙戦佹暟鎹級 -* @return RC_SUCCESS 鍙戦佹秷鎭垚鍔 -* @return RC_QUEUEFULL 鍙戦佹秷鎭笉鎴愬姛锛屽彂閫佸垪闃熸弧锛屾秷鎭叆闃熷け璐 -* @return RC_CANNOTTRANSMIT 鍙戦佹秷鎭笉鎴愬姛锛岀郴缁熺洰鍓嶄笉鑳藉彂閫佹秷鎭 -* @note 濡傛灉淇℃伅涓嶈兘鍏ラ槦鎴栬呭彂閫侊紝灏嗘湁涓涓浉搴旂殑杩斿洖鎻愮ず锛孿n -*/ -j1939_uint8_t J1939_Send_Message( J1939_MESSAGE *MsgPtr, CAN_NODE _Can_Node) + * @param[in] MsgPtr 瀛樺偍鍙戦佹秷鎭殑缂撳瓨 + * @param[in] _Can_Node 鍙戦佹秷鎭殑CAN纭欢缂栧彿锛堜粠鍝竴璺疌AN鍙戦佹暟鎹級 + * @return RC_SUCCESS 鍙戦佹秷鎭垚鍔 + * @return RC_QUEUEFULL 鍙戦佹秷鎭笉鎴愬姛锛屽彂閫侀槦鍒楁弧锛屾秷鎭叆闃熷け璐 + * @return RC_CANNOTTRANSMIT 鍙戦佹秷鎭笉鎴愬姛锛岀郴缁熺洰鍓嶄笉鑳藉彂閫佹秷鎭 + * @note 濡傛灉淇℃伅涓嶈兘鍏ラ槦鎴栬呭彂閫侊紝灏嗘湁涓涓浉搴旂殑杩斿洖鎻愮ず锛孿n + */ +J1939_Status_t J1939_Send_Message(J1939_MESSAGE_t *MsgPtr, CAN_NODE_t _Can_Node) { - return J1939_EnqueueMessage(MsgPtr,_Can_Node); + return J1939_EnqueueMessage(MsgPtr, _Can_Node); } + /** -* -* @note 杩欐浠g爜鍦ㄧ郴缁熷垵濮嬪寲涓璋冪敤,锛堟斁鍦–AN璁惧鍒濆鍖栦箣鍚庯級\n - 鍒濆鍖朖1939鍏ㄥ眬鍙橀噺\n -*/ -void J1939_Initialization() + * + * @note 杩欐浠g爜鍦ㄧ郴缁熷垵濮嬪寲涓璋冪敤,锛堟斁鍦–AN璁惧鍒濆鍖栦箣鍚庯級\n + 鍒濆鍖朖1939鍏ㄥ眬鍙橀噺\n + */ +void J1939_Initialization(void) { - /*鍒濆鍖栧叏灞鍙橀噺*/ - J1939_Flags.FlagVal = 0; //娌℃湁澹版槑鍦板潃锛屽叾浠栫殑鏍囪瘑浣嶅皢琚缃负0锛堝浣嶏級 - - /*鍒濆鍖栨帴鍙楀拰鍙戦佸垪闃*/ - TXHead_1 = 0; - TXHead_2 = 0; - TXHead_3 = 0; - TXHead_4 = 0; - TXTail_1 = 0xFF; - TXTail_2 = 0xFF; - TXTail_3 = 0xFF; - TXTail_4 = 0xFF; - RXHead_1 = 0; - RXHead_2 = 0; - RXHead_3 = 0; - RXHead_4 = 0; - RXTail_1 = 0xFF; - RXTail_2 = 0xFF; - RXTail_3 = 0xFF; - RXTail_4 = 0xFF; - TXQueueCount_1 = 0; - TXQueueCount_2 = 0; - TXQueueCount_3 = 0; - TXQueueCount_4 = 0; - RXQueueCount_1 = 0; - RXQueueCount_2 = 0; - RXQueueCount_3 = 0; - RXQueueCount_4 = 0; - /*鍒濆鍖栬妭鐐瑰湴鍧*/ - NodeAddress_1 = J1939_STARTING_ADDRESS_1; - NodeAddress_2 = J1939_STARTING_ADDRESS_2; - NodeAddress_3 = J1939_STARTING_ADDRESS_3; - NodeAddress_4 = J1939_STARTING_ADDRESS_4; - /*鍒濆鍖朇AN鑺傜偣鐨勯夋嫨*/ + /* 鍒濆鍖栧叏灞鍙橀噺 */ + J1939_Flags.FlagVal = 0; /* 娌℃湁澹版槑鍦板潃锛屽叾浠栫殑鏍囪瘑浣嶅皢琚缃负0锛堝浣嶏級 */ + + /* 鍒濆鍖栨帴鍙楀拰鍙戦侀槦鍒 */ + for (j1939_uint8_t i = 0; i < J1939_NODE_NUM; i++) + { + TXHead[i] = 0; + TXTail[i] = 0xFF; + RXHead[i] = 0; + RXTail[i] = 0xFF; + TXQueueCount[i] = 0; + RXQueueCount[i] = 0; + + /* 鍒濆鍖栬妭鐐瑰湴鍧 */ + NodeAddress[i] = J1939_STARTING_ADDRESS[i]; + } + + /* 鍒濆鍖朇AN鑺傜偣鐨勯夋嫨 */ Can_Node = Select_CAN_NODE_1; - /*鍒濆鍖栬姹傞摼琛*/ + + /* 鍒濆鍖栬姹傞摼琛 */ REQUEST_LIST.PGN = 0; REQUEST_LIST.data = J1939_NULL; - REQUEST_LIST.update = J1939_NULL; - REQUEST_LIST.lenght = 0; - REQUEST_LIST.Can_Node = Select_CAN_NODE_Null; - REQUEST_LIST.next = J1939_NULL; - /*灏員P鍗忚缃负绌洪棽*/ + REQUEST_LIST.update = J1939_NULL; + REQUEST_LIST.length = 0; + REQUEST_LIST.Can_Node = Select_CAN_NODE_Null; + REQUEST_LIST.next = J1939_NULL; + + /* 灏員P鍗忚缃负绌洪棽 */ #if J1939_TP_RX_TX J1939_TP_Flags_t.state = J1939_TP_NULL; J1939_TP_Flags_t.TP_RX_CAN_NODE = Select_CAN_NODE_Null; @@ -466,1293 +233,1071 @@ void J1939_Initialization() TP_TX_MSG.packets_request_num = 0; TP_TX_MSG.packets_total = 0; - TP_TX_MSG.packet_offset_p = 0; - TP_TX_MSG.time = 0; - TP_TX_MSG.state = J1939_TP_TX_WAIT; + TP_TX_MSG.packet_offset_p = 0; + TP_TX_MSG.time = 0; + TP_TX_MSG.state = J1939_TP_TX_WAIT; TP_RX_MSG.packets_ok_num = 0; - TP_RX_MSG.packets_total = 0; - TP_RX_MSG.time = 0; - TP_RX_MSG.state = J1939_TP_RX_WAIT; + TP_RX_MSG.packets_total = 0; + TP_RX_MSG.time = 0; + TP_RX_MSG.state = J1939_TP_RX_WAIT; #endif -} +} /** -* @note 杩欎釜鍑芥暟琚皟鐢紝褰撹澶囦骇鐢烠AN涓柇锛堝彲鑳芥槸鎺ュ彈涓柇锛屼篃鍙兘鏄彂閫佷腑鏂級\n - 棣栧厛鎴戜滑瑕佹竻闄や腑鏂爣璇嗕綅\n - 鐒跺悗璋冪敤鎺ュ彈鎴栬呭彂閫佸嚱鏁般 -*/ -#if J1939_POLL_ECAN == J1939_FALSE -void J1939_ISR( void ) -{ - //鍒ゆ柇鐩稿叧鏍囪瘑浣,鏄帴鍙楄繕鏄彂閫 - //娓呴櫎鏍囪瘑浣 + * @note 杩欎釜鍑芥暟琚皟鐢紝褰撹澶囦骇鐢烠AN涓柇锛堝彲鑳芥槸鎺ュ彈涓柇锛屼篃鍙兘鏄彂閫佷腑鏂級\n + 棣栧厛鎴戜滑瑕佹竻闄や腑鏂爣璇嗕綅\n + 鐒跺悗璋冪敤鎺ュ彈鎴栬呭彂閫佸嚱鏁般 + */ +#if J1939_POLL_ECAN == J1939_FALSE +void J1939_ISR(void) +{ + /* 鍒ゆ柇鐩稿叧鏍囪瘑浣,鏄帴鍙楄繕鏄彂閫 */ + /* 娓呴櫎鏍囪瘑浣 */ Port_CAN_identifier_clc(); - //璋冪敤鐩稿叧鐨勫鐞嗗嚱鏁 - J1939_ReceiveMessages(); - J1939_TransmitMessages(); - #if J1939_TP_RX_TX - J1939_TP_Poll(); - #endif //J1939_TP_RX_TX - //鍙兘瀛樺湪鍥犱负閿欒浜х敓涓柇锛岀洿鎺ユ竻闄ょ浉鍏崇殑鏍囪瘑浣 -} -#endif - + /* 璋冪敤鐩稿叧鐨勫鐞嗗嚱鏁 */ + J1939_ReceiveMessages(); + J1939_TransmitMessages(); +#if J1939_TP_RX_TX + J1939_TP_Poll(); +#endif /* J1939_TP_RX_TX */ + /* 鍙兘瀛樺湪鍥犱负閿欒浜х敓涓柇锛岀洿鎺ユ竻闄ょ浉鍏崇殑鏍囪瘑浣 */ +} +#endif + /** -* @param[in] ElapsedTime 涓涓ぇ姒傜殑姣鏁帮紝閫氬父璁剧疆 5 鎴 3 -* @note 濡傛灉鎴戜滑閲囩敤杞鐨勬柟寮忚幏鍙栦俊鎭紝杩欎釜鍑芥暟姣忓嚑涓绉掑皢琚皟鐢ㄤ竴娆°俓n - 涓嶆柇鐨勬帴鍙楁秷鎭拰鍙戦佹秷鎭粠娑堟伅闃熷垪涓璡n - 姝ゅ锛屽鏋滄垜浠鍦ㄧ瓑寰呬竴涓湴鍧绔炰簤鍙嶅簲銆俓n - 濡傛灉瓒呮椂锛屾垜浠彧鎺ユ敹鐗瑰畾鐨勬秷鎭紙鐩爣鍦板潃 = J1939_Address锛塡n - - 濡傛灉璁惧浣跨敤涓柇锛屾鍑芥暟琚皟鐢紝鍦ㄨ皟鐢↗1939_Initialization锛堬級鍑芥暟鍚庯紝鍥犱负\n - J1939_Initialization锛堬級鍙兘鍒濆鍖朩aitingForAddressClaimContention鏍囪瘑浣嶄负1.\n - - 濡傛灉鎺ュ彈鍒板懡浠ゅ湴鍧娑堟伅锛岃繖涓嚱鏁颁篃蹇呴』琚皟鐢紝浠ラ槻涓囦竴鎬荤嚎瑕佹眰鎴戜滑鏀瑰彉鍦板潃\n - - 濡傛灉浣跨敤涓柇妯″紡锛屾湰绋嬪簭灏嗕笉浼氬鐞嗘帴鍙楀拰鍙戦佹秷鎭紝鍙鐞嗗湴鍧绔炰簤瓒呮椂銆俓n -*/ -//澹版槑TP杞鍑芥暟 -void J1939_TP_Poll(); -void J1939_Poll( ) + * @param[in] ElapsedTime 涓涓ぇ姒傜殑姣鏁帮紝閫氬父璁剧疆 5 鎴 3 + * @note 濡傛灉鎴戜滑閲囩敤杞鐨勬柟寮忚幏鍙栦俊鎭紝杩欎釜鍑芥暟姣忓嚑涓绉掑皢琚皟鐢ㄤ竴娆°俓n + 涓嶆柇鐨勬帴鍙楁秷鎭拰鍙戦佹秷鎭粠娑堟伅闃熷垪涓璡n + 姝ゅ锛屽鏋滄垜浠鍦ㄧ瓑寰呬竴涓湴鍧绔炰簤鍙嶅簲銆俓n + 濡傛灉瓒呮椂锛屾垜浠彧鎺ユ敹鐗瑰畾鐨勬秷鎭紙鐩爣鍦板潃 = J1939_Address锛塡n + + 濡傛灉璁惧浣跨敤涓柇锛屾鍑芥暟琚皟鐢紝鍦ㄨ皟鐢↗1939_Initialization锛堬級鍑芥暟鍚庯紝鍥犱负\n + J1939_Initialization锛堬級鍙兘鍒濆鍖朩aitingForAddressClaimContention鏍囪瘑浣嶄负1.\n + + 濡傛灉鎺ュ彈鍒板懡浠ゅ湴鍧娑堟伅锛岃繖涓嚱鏁颁篃蹇呴』琚皟鐢紝浠ラ槻涓囦竴鎬荤嚎瑕佹眰鎴戜滑鏀瑰彉鍦板潃\n + + 濡傛灉浣跨敤涓柇妯″紡锛屾湰绋嬪簭灏嗕笉浼氬鐞嗘帴鍙楀拰鍙戦佹秷鎭紝鍙鐞嗗湴鍧绔炰簤瓒呮椂銆俓n + */ +void J1939_Poll(void) { - //鎴戜滑蹇呴』璋冪敤J1939_ReceiveMessages鎺ュ彈鍑芥暟锛屽湪鏃堕棿琚噸缃负0涔嬪墠銆 + /* 鎴戜滑蹇呴』璋冪敤J1939_ReceiveMessages鎺ュ彈鍑芥暟锛屽湪鏃堕棿琚噸缃负0涔嬪墠銆 */ #if J1939_POLL_ECAN == J1939_TRUE - Can_Node = Select_CAN_NODE_1; - J1939_Address = NodeAddress_1; - J1939_ReceiveMessages(); - J1939_TransmitMessages(); - Can_Node = Select_CAN_NODE_2; - J1939_Address = NodeAddress_2; - J1939_ReceiveMessages(); - J1939_TransmitMessages(); - Can_Node = Select_CAN_NODE_3; - J1939_Address = NodeAddress_3; - J1939_ReceiveMessages(); - J1939_TransmitMessages(); - Can_Node = Select_CAN_NODE_4; - J1939_Address = NodeAddress_4; - J1939_ReceiveMessages(); - J1939_TransmitMessages(); + Can_Node = Select_CAN_NODE_1; + J1939_Address = NodeAddress[0]; + J1939_ReceiveMessages(); + J1939_TransmitMessages(); + Can_Node = Select_CAN_NODE_2; + J1939_Address = NodeAddress[1]; + J1939_ReceiveMessages(); + J1939_TransmitMessages(); + Can_Node = Select_CAN_NODE_3; + J1939_Address = NodeAddress[2]; + J1939_ReceiveMessages(); + J1939_TransmitMessages(); + Can_Node = Select_CAN_NODE_4; + J1939_Address = NodeAddress[3]; + J1939_ReceiveMessages(); + J1939_TransmitMessages(); #if J1939_TP_RX_TX - J1939_TP_Poll(); -#endif //J1939_TP_RX_TX -#endif //J1939_POLL_ECAN == J1939_TRUE -} -void J1939_Response(const j1939_uint32_t PGN); + J1939_TP_Poll(); +#endif /* J1939_TP_RX_TX */ +#endif /* J1939_POLL_ECAN == J1939_TRUE */ +} #if J1939SoftwareFilterEn == J1939_TRUE /** -* @return RC_SUCCESS 娑堟伅鏄彲浠ユ帴鍙 -* @return RC_CANNOTTRANSMIT 娑堟伅鏄笉鍙互鎺ュ彈 -* @note 杞欢婊ゆ尝鍣╘n -* @note 鍩轰簬SAE J1939鍗忚锛屾垜浠渶瑕丆AN鎺у埗鍣ㄦ彁渚涜嚦灏3涓护娉㈠櫒缁橨1939鍗忚浠g爜銆備笁涓护娉㈠櫒鍒嗗埆閰嶇疆濡備笅锛 - 1. 璁剧疆婊ゆ尝鍣0锛屽彧鎺ュ彈骞挎挱淇℃伅锛圥F = 240 -255锛夈 - 2. 璁剧疆璁剧疆婊ゆ尝鍣1锛2鍙帴鍙楀叏灞鍦板潃锛圝1939_GLOBAL_ADDRESS锛 - 3. 闅忕潃绋嬪簭鐨勮繍琛岋紝灏嗘敼鍙樻护娉㈠櫒2锛屾潵閫傚簲绋嬪簭閫昏緫銆 -*/ -j1939_uint8_t J1939_Messages_Filter(J1939_MESSAGE *MsgPtr) + * @return RC_SUCCESS 娑堟伅鏄彲浠ユ帴鍙 + * @return RC_CANNOTTRANSMIT 娑堟伅鏄笉鍙互鎺ュ彈 + * @note 杞欢婊ゆ尝鍣╘n + * @note 鍩轰簬SAE J1939鍗忚锛屾垜浠渶瑕丆AN鎺у埗鍣ㄦ彁渚涜嚦灏3涓护娉㈠櫒缁橨1939鍗忚浠g爜銆備笁涓护娉㈠櫒鍒嗗埆閰嶇疆濡備笅锛 + 1. 璁剧疆婊ゆ尝鍣0锛屽彧鎺ュ彈骞挎挱淇℃伅锛圥F = 240 -255锛夈 + 2. 璁剧疆璁剧疆婊ゆ尝鍣1锛2鍙帴鍙楀叏灞鍦板潃锛圝1939_GLOBAL_ADDRESS锛 + 3. 闅忕潃绋嬪簭鐨勮繍琛岋紝灏嗘敼鍙樻护娉㈠櫒2锛屾潵閫傚簲绋嬪簭閫昏緫銆 + */ +J1939_Status_t J1939_Messages_Filter(J1939_MESSAGE_t *MsgPtr) { - /*婊ゆ尝鍣0*/ - if((MsgPtr->Mxe.PDUFormat) >= 240) - { + /* 婊ゆ尝鍣0 */ + if ((MsgPtr->Mxe.PDUFormat) >= 240) { return RC_SUCCESS; } - /*婊ゆ尝鍣1*/ - if(((MsgPtr->Mxe.PDUFormat) < 240) && (MsgPtr->Mxe.PDUSpecific == J1939_GLOBAL_ADDRESS)) - { + + /* 婊ゆ尝鍣1 */ + if (((MsgPtr->Mxe.PDUFormat) < 240) && (MsgPtr->Mxe.PDUSpecific == J1939_PS_DA_GLOBAL)) { return RC_SUCCESS; } - /*婊ゆ尝鍣2*/ - switch (Can_Node) - { - case Select_CAN_NODE_1: - { - if(((MsgPtr->Mxe.PDUFormat) < 240) && (MsgPtr->Mxe.PDUSpecific == NodeAddress_1)) - { - return RC_SUCCESS; - } - break; - } - case Select_CAN_NODE_2: - { - if(((MsgPtr->Mxe.PDUFormat) < 240) && (MsgPtr->Mxe.PDUSpecific == NodeAddress_2)) - { - return RC_SUCCESS; - } - break; - } - case Select_CAN_NODE_3: - { - if(((MsgPtr->Mxe.PDUFormat) < 240) && (MsgPtr->Mxe.PDUSpecific == NodeAddress_3)) - { - return RC_SUCCESS; - } - break; - } - case Select_CAN_NODE_4: - { - if(((MsgPtr->Mxe.PDUFormat) < 240) && (MsgPtr->Mxe.PDUSpecific == NodeAddress_4)) - { - return RC_SUCCESS; - } - break; - } - default : - { - break; - } - } + + /* 婊ゆ尝鍣2 */ + if (((MsgPtr->Mxe.PDUFormat) < 240) && (MsgPtr->Mxe.PDUSpecific == NodeAddress[Can_Node])) { + return RC_SUCCESS; + } + return RC_CANNOTTRANSMIT; } -#endif //J1939SoftwareFilterEn +#endif /* J1939SoftwareFilterEn */ /** -* @note 杩欐绋嬪簭琚皟鐢紝褰揅AN鏀跺彂鍣ㄦ帴鍙楁暟鎹紙涓柇 鎴栬 杞锛夈俓n - 濡傛灉涓涓俊鎭鎺ュ彈, 瀹冨皢琚皟鐢╘n - 濡傛灉淇℃伅鏄竴涓綉缁滅鐞嗕俊鎭垨闀垮抚浼犺緭锛圱P锛夛紝鎺ュ彈鐨勪俊鎭皢琚姞宸ュ鐞嗭紝鍦ㄨ繖涓嚱鏁颁腑銆俓n - 鍚﹀垯, 淇℃伅灏嗘斁缃湪鐢ㄦ埛鐨勬帴鏀堕槦鍒椼俓n - 娉ㄦ剰锛氬湪杩欐绋嬪簭杩愯鏈熼棿涓柇鏄け鑳界殑銆俓n -*/ -void J1939_ReceiveMessages( void ) + * @note 杩欐绋嬪簭琚皟鐢紝褰揅AN鏀跺彂鍣ㄦ帴鍙楁暟鎹紙涓柇 鎴栬 杞锛夈俓n + 濡傛灉涓涓俊鎭鎺ュ彈, 瀹冨皢琚皟鐢╘n + 濡傛灉淇℃伅鏄竴涓綉缁滅鐞嗕俊鎭垨闀垮抚浼犺緭锛圱P锛夛紝鎺ュ彈鐨勪俊鎭皢琚姞宸ュ鐞嗭紝鍦ㄨ繖涓嚱鏁颁腑銆俓n + 鍚﹀垯, 淇℃伅灏嗘斁缃湪鐢ㄦ埛鐨勬帴鏀堕槦鍒椼俓n + 娉ㄦ剰锛氬湪杩欐绋嬪簭杩愯鏈熼棿涓柇鏄け鑳界殑銆俓n + */ +void J1939_ReceiveMessages(void) { #if J1939_TP_RX_TX - j1939_uint32_t _pgn = 0; -#endif //J1939_TP_RX_TX - /*浠庢帴鏀剁紦瀛樹腑璇诲彇淇℃伅鍒癘neMessage涓紝OneMessage鏄竴涓叏灞鍙橀噺*/ - /*Port_CAN_Receive鍑芥暟璇诲彇鍒版暟鎹繑鍥1锛屾病鏈夋暟鎹垯杩斿洖0*/ - if(Port_CAN_Receive(&OneMessage)) - { + j1939_uint32_t _pgn = 0; +#endif /* J1939_TP_RX_TX */ + + /* 浠庢帴鏀剁紦瀛樹腑璇诲彇淇℃伅鍒癘neMessage涓紝OneMessage鏄竴涓叏灞鍙橀噺 */ + /* Port_CAN_Receive鍑芥暟璇诲彇鍒版暟鎹繑鍥1锛屾病鏈夋暟鎹垯杩斿洖0 */ + if (Port_CAN_Receive(&OneMessage)) { #if J1939SoftwareFilterEn == J1939_TRUE - if(J1939_Messages_Filter(&OneMessage) != RC_SUCCESS) - { - return ; - } -#endif //J1939SoftwareFilterEn - switch( OneMessage.Mxe.PDUFormat) - { + + if (J1939_Messages_Filter(&OneMessage) != RC_SUCCESS) { + return; + } + +#endif /* J1939SoftwareFilterEn */ + + switch (OneMessage.Mxe.PDUFormat) { #if J1939_TP_RX_TX - case J1939_PF_TP_CM: //鍙傝僇1939-21 TP澶氬抚浼犺緭鍗忚 - _pgn = (j1939_uint32_t)((OneMessage.Mxe.Data[7]<<16)&0xFF0000) - +(j1939_uint32_t)((OneMessage.Mxe.Data[6]<<8)&0xFF00) - +(j1939_uint32_t)((OneMessage.Mxe.Data[5])&0xFF); - if((J1939_TP_Flags_t.state == J1939_TP_NULL) && (TP_RX_MSG.state == J1939_TP_RX_WAIT)) - { - if(OneMessage.Mxe.Data[0] == 16) - { - J1939_TP_Flags_t.state = J1939_TP_RX; - J1939_TP_Flags_t.TP_RX_CAN_NODE = Can_Node; - - TP_RX_MSG.tp_rx_msg.SA = OneMessage.Mxe.SourceAddress; - TP_RX_MSG.tp_rx_msg.PGN = (j1939_uint32_t)((OneMessage.Mxe.Data[7]<<16)&0xFF0000) - +(j1939_uint32_t)((OneMessage.Mxe.Data[6]<<8)&0xFF00) - +(j1939_uint32_t)((OneMessage.Mxe.Data[5])&0xFF); - /*濡傛灉绯荤粺绻佸繖*/ - if(TP_RX_MSG.osbusy) - { - TP_RX_MSG.state = J1939_TP_RX_ERROR; - break; - } - /*鍒ゆ柇鏄惁鏈夎冻澶熺殑鍐呭瓨鎺ユ敹鏁版嵁锛屽鏋滄病鏈夌洿鎺ワ紝鏂紑杩炴帴*/ - if(((j1939_uint32_t)((OneMessage.Mxe.Data[2]<<8)&0xFF00) - +(j1939_uint32_t)((OneMessage.Mxe.Data[1])&0xFF)) > J1939_TP_MAX_MESSAGE_LENGTH) - { - TP_RX_MSG.state = J1939_TP_RX_ERROR; - break; - } - TP_RX_MSG.tp_rx_msg.byte_count = ((j1939_uint32_t)((OneMessage.Mxe.Data[2]<<8)&0xFF00) - +(j1939_uint32_t)((OneMessage.Mxe.Data[1])&0xFF)); - TP_RX_MSG.packets_total = OneMessage.Mxe.Data[3]; - TP_RX_MSG.time = J1939_TP_T2; - TP_RX_MSG.state = J1939_TP_RX_READ_DATA; - break; + + case J1939_PF_TP_CM: /* 鍙傝僇1939-21 TP澶氬抚浼犺緭鍗忚 */ + _pgn = (j1939_uint32_t) ((OneMessage.Mxe.Data[7] << 16) & 0xFF0000) + + (j1939_uint32_t) ((OneMessage.Mxe.Data[6] << 8) & 0xFF00) + + (j1939_uint32_t) ((OneMessage.Mxe.Data[5]) & 0xFF); + + if ((J1939_TP_Flags_t.state == J1939_TP_NULL) && (TP_RX_MSG.state == J1939_TP_RX_WAIT)) { + if (OneMessage.Mxe.Data[0] == 16) { + J1939_TP_Flags_t.state = J1939_TP_RX; + J1939_TP_Flags_t.TP_RX_CAN_NODE = Can_Node; + + TP_RX_MSG.tp_rx_msg.SA = OneMessage.Mxe.SourceAddress; + TP_RX_MSG.tp_rx_msg.PGN = (j1939_uint32_t) ((OneMessage.Mxe.Data[7] << 16) & 0xFF0000) + + (j1939_uint32_t) ((OneMessage.Mxe.Data[6] << 8) & 0xFF00) + + (j1939_uint32_t) ((OneMessage.Mxe.Data[5]) & 0xFF); + + /* 濡傛灉绯荤粺绻佸繖 */ + if (TP_RX_MSG.osbusy) { + TP_RX_MSG.state = J1939_TP_RX_ERROR; + break; + } + + /* 鍒ゆ柇鏄惁鏈夎冻澶熺殑鍐呭瓨鎺ユ敹鏁版嵁锛屽鏋滄病鏈夌洿鎺ワ紝鏂紑杩炴帴 */ + if (((j1939_uint32_t) ((OneMessage.Mxe.Data[2] << 8) & 0xFF00) + + (j1939_uint32_t) ((OneMessage.Mxe.Data[1]) & 0xFF)) > J1939_TP_MAX_MESSAGE_LENGTH) { + TP_RX_MSG.state = J1939_TP_RX_ERROR; + break; + } + + TP_RX_MSG.tp_rx_msg.byte_count = ((j1939_uint32_t) ((OneMessage.Mxe.Data[2] << 8) & 0xFF00) + + (j1939_uint32_t) ((OneMessage.Mxe.Data[1]) & 0xFF)); + TP_RX_MSG.packets_total = OneMessage.Mxe.Data[3]; + TP_RX_MSG.time = J1939_TP_T2; + TP_RX_MSG.state = J1939_TP_RX_READ_DATA; + break; } + goto PutInReceiveQueue; break; - } - if(J1939_TP_Flags_t.state == J1939_TP_TX) - { - /*鏍¢獙PGN*/ - if (_pgn == TP_TX_MSG.tp_tx_msg.PGN) - { - switch(OneMessage.Mxe.Data[0]) - { - case J1939_RTS_CONTROL_BYTE: - /* 绋嬪簭杩愯鍒拌繖閲岋紝璇存槑宸茬粡涓庣綉缁滀腑璁惧1寤虹珛铏氭嫙閾炬帴锛堜綔涓哄彂閫佺锛夛紝浣嗘槸鏀跺埌璁惧2鐨勯摼鎺ヨ姹傦紝骞朵笖鍚屼竴涓狿GN娑堟伅璇锋眰*/ - /* 鏍规嵁J1939-21鏁版嵁閾捐矾灞傜殑瑙勫畾锛屾垜浠淇濇寔鍘熸湁鐨勯摼鎺ワ紝涓嶅仛浠讳綍浜嬶紝璁惧2浼氬簲涓鸿秴鏃惰嚜鍔ㄦ斁寮冮摼鎺*/ - break; - case J1939_CTS_CONTROL_BYTE: - if((J1939_TP_TX_CM_WAIT == TP_TX_MSG.state) || (J1939_TP_WAIT_ACK == TP_TX_MSG.state)) - { - /* 鍙戦佺瓑寰呬繚鎸 */ - if(0x00u == OneMessage.Mxe.Data[1]) - { - /* 鍒锋柊绛夊緟璁℃暟鍣 */ - TP_TX_MSG.time = J1939_TP_T4; - } - else - { - if((OneMessage.Mxe.Data[2]+OneMessage.Mxe.Data[1]) > (TP_TX_MSG.packets_total+1)) - { - /*璇锋眰瓒呭嚭鏁版嵁鍖呰寖鍥*/ - TP_TX_MSG.state = J1939_TP_TX_ERROR; - } - else - { /* response parameter OK */ - TP_TX_MSG.packets_request_num = OneMessage.Mxe.Data[1]; - TP_TX_MSG.packet_offset_p = (j1939_uint8_t)(OneMessage.Mxe.Data[2] - 1); - TP_TX_MSG.state = J1939_TP_TX_DT; - } - - } - } - break; - case J1939_EOMACK_CONTROL_BYTE: - if(J1939_TP_WAIT_ACK == TP_TX_MSG.state) - { - TP_TX_MSG.state = J1939_TX_DONE; - } - //杩欓噷鍙互澧炲姞涓涓鏁版嵁鐨勬牎楠 - break; - case J1939_CONNABORT_CONTROL_BYTE: - //鏀跺埌涓涓斁寮冭繛鎺ワ紝浠涔堥兘涓嶅仛锛屽崗璁細鍦ㄤ竴娈靛欢鏃舵椂闂村悗涓诲姩鏀惧純閾炬帴 - break; - default: - break; - } - } - } - goto PutInReceiveQueue; - break; -#endif//J1939_TP_RX_TX + } + + if (J1939_TP_Flags_t.state == J1939_TP_TX) { + /* 鏍¢獙PGN */ + if (_pgn == TP_TX_MSG.tp_tx_msg.PGN) { + switch (OneMessage.Mxe.Data[0]) { + case J1939_CONTROL_BYTE_RTS: + /* 绋嬪簭杩愯鍒拌繖閲岋紝璇存槑宸茬粡涓庣綉缁滀腑璁惧1寤虹珛铏氭嫙閾炬帴锛堜綔涓哄彂閫佺锛夛紝浣嗘槸鏀跺埌璁惧2鐨勯摼鎺ヨ姹傦紝骞朵笖鍚屼竴涓狿GN娑堟伅璇锋眰*/ + /* 鏍规嵁J1939-21鏁版嵁閾捐矾灞傜殑瑙勫畾锛屾垜浠淇濇寔鍘熸湁鐨勯摼鎺ワ紝涓嶅仛浠讳綍浜嬶紝璁惧2浼氬簲涓鸿秴鏃惰嚜鍔ㄦ斁寮冮摼鎺*/ + break; + + case J1939_CONTROL_BYTE_CTS: + if ((J1939_TP_TX_CM_WAIT == TP_TX_MSG.state) || (J1939_TP_WAIT_ACK == TP_TX_MSG.state)) { + /* 鍙戦佺瓑寰呬繚鎸 */ + if (0x00u == OneMessage.Mxe.Data[1]) { + /* 鍒锋柊绛夊緟璁℃暟鍣 */ + TP_TX_MSG.time = J1939_TP_T4; + } else { + if ((OneMessage.Mxe.Data[2] + OneMessage.Mxe.Data[1]) + > (TP_TX_MSG.packets_total + 1)) { + /* 璇锋眰瓒呭嚭鏁版嵁鍖呰寖鍥 */ + TP_TX_MSG.state = J1939_TP_TX_ERROR; + } else { + /* response parameter OK */ + TP_TX_MSG.packets_request_num = OneMessage.Mxe.Data[1]; + TP_TX_MSG.packet_offset_p = (j1939_uint8_t) (OneMessage.Mxe.Data[2] - 1); + TP_TX_MSG.state = J1939_TP_TX_DT; + } + + } + } + + break; + + case J1939_CONTROL_BYTE_EOMACK: + if (J1939_TP_WAIT_ACK == TP_TX_MSG.state) { + TP_TX_MSG.state = J1939_TX_DONE; + } + + /* 杩欓噷鍙互澧炲姞涓涓鏁版嵁鐨勬牎楠 */ + break; + + case J1939_CONTROL_BYTE_CONNABORT: + /* 鏀跺埌涓涓斁寮冭繛鎺ワ紝浠涔堥兘涓嶅仛锛屽崗璁細鍦ㄤ竴娈靛欢鏃舵椂闂村悗涓诲姩鏀惧純閾炬帴 */ + break; + + default: + break; + } + } + } + + goto PutInReceiveQueue; + break; +#endif /* J1939_TP_RX_TX */ #if J1939_TP_RX_TX - case J1939_PF_DT: - if((TP_RX_MSG.state == J1939_TP_RX_DATA_WAIT)&&(TP_RX_MSG.tp_rx_msg.SA == OneMessage.Mxe.SourceAddress)) - { - TP_RX_MSG.tp_rx_msg.data[(OneMessage.Mxe.Data[0]-1)*7u]=OneMessage.Mxe.Data[1]; - TP_RX_MSG.tp_rx_msg.data[(OneMessage.Mxe.Data[0]-1)*7u+1]=OneMessage.Mxe.Data[2]; - TP_RX_MSG.tp_rx_msg.data[(OneMessage.Mxe.Data[0]-1)*7u+2]=OneMessage.Mxe.Data[3]; - TP_RX_MSG.tp_rx_msg.data[(OneMessage.Mxe.Data[0]-1)*7u+3]=OneMessage.Mxe.Data[4]; - TP_RX_MSG.tp_rx_msg.data[(OneMessage.Mxe.Data[0]-1)*7u+4]=OneMessage.Mxe.Data[5]; - TP_RX_MSG.tp_rx_msg.data[(OneMessage.Mxe.Data[0]-1)*7u+5]=OneMessage.Mxe.Data[6]; - TP_RX_MSG.tp_rx_msg.data[(OneMessage.Mxe.Data[0]-1)*7u+6]=OneMessage.Mxe.Data[7]; - /*鐗规畩澶勭悊閲嶆柊鎺ュ彈宸叉帴鍙楄繃鐨勬暟鎹寘*/ - if((OneMessage.Mxe.Data[0]) > TP_RX_MSG.packets_ok_num) - { - TP_RX_MSG.packets_ok_num++; - } - TP_RX_MSG.time = J1939_TP_T1; - /*鍒ゆ柇鏄惁鏀跺埌鍋舵暟涓暟鎹寘鎴栬呰鍙栧埌鏈鍚庝竴涓暟鎹寘*/ - if((TP_RX_MSG.packets_ok_num%2 == 0) ||(TP_RX_MSG.packets_ok_num == TP_RX_MSG.packets_total)) - { - TP_RX_MSG.state = J1939_TP_RX_READ_DATA; - break ; - } - break ; + + case J1939_PF_TP_DT: + if ((TP_RX_MSG.state == J1939_TP_RX_DATA_WAIT) + && (TP_RX_MSG.tp_rx_msg.SA == OneMessage.Mxe.SourceAddress)) { + TP_RX_MSG.tp_rx_msg.data[(OneMessage.Mxe.Data[0] - 1) * 7u] = OneMessage.Mxe.Data[1]; + TP_RX_MSG.tp_rx_msg.data[(OneMessage.Mxe.Data[0] - 1) * 7u + 1] = OneMessage.Mxe.Data[2]; + TP_RX_MSG.tp_rx_msg.data[(OneMessage.Mxe.Data[0] - 1) * 7u + 2] = OneMessage.Mxe.Data[3]; + TP_RX_MSG.tp_rx_msg.data[(OneMessage.Mxe.Data[0] - 1) * 7u + 3] = OneMessage.Mxe.Data[4]; + TP_RX_MSG.tp_rx_msg.data[(OneMessage.Mxe.Data[0] - 1) * 7u + 4] = OneMessage.Mxe.Data[5]; + TP_RX_MSG.tp_rx_msg.data[(OneMessage.Mxe.Data[0] - 1) * 7u + 5] = OneMessage.Mxe.Data[6]; + TP_RX_MSG.tp_rx_msg.data[(OneMessage.Mxe.Data[0] - 1) * 7u + 6] = OneMessage.Mxe.Data[7]; + + /* 鐗规畩澶勭悊閲嶆柊鎺ュ彈宸叉帴鍙楄繃鐨勬暟鎹寘 */ + if ((OneMessage.Mxe.Data[0]) > TP_RX_MSG.packets_ok_num) { + TP_RX_MSG.packets_ok_num++; + } + + TP_RX_MSG.time = J1939_TP_T1; + + /* 鍒ゆ柇鏄惁鏀跺埌鍋舵暟涓暟鎹寘鎴栬呰鍙栧埌鏈鍚庝竴涓暟鎹寘 */ + if ((TP_RX_MSG.packets_ok_num % 2 == 0) || (TP_RX_MSG.packets_ok_num == TP_RX_MSG.packets_total)) { + TP_RX_MSG.state = J1939_TP_RX_READ_DATA; + break; + } + + break; } - //绋嬪簭涓嶅彲鑳借繍琛屽埌杩欙紝浣嗘槸鎴戜滑涓嶈兘鏀惧純鎺ュ彈鐨勬暟鎹寘 + + /* 绋嬪簭涓嶅彲鑳借繍琛屽埌杩欙紝浣嗘槸鎴戜滑涓嶈兘鏀惧純鎺ュ彈鐨勬暟鎹寘 */ goto PutInReceiveQueue; -#endif//J1939_TP_RX_TX - case J1939_PF_REQUEST: - /*鐢∣neMessage.Mxe.PGN 鏉ュ瓨涓嬭璇锋眰鐨凱GN*/ - if(OneMessage.Mxe.Data[1] < 240) - { - OneMessage.Mxe.PGN = (j1939_uint32_t)((OneMessage.Mxe.Data[2]<<16)&0x030000) - +(j1939_uint32_t)((OneMessage.Mxe.Data[1]<<8)&0xFF00) - +0x00; - }else{ - OneMessage.Mxe.PGN = (j1939_uint32_t)((OneMessage.Mxe.Data[2]<<16)&0x030000) - +(j1939_uint32_t)((OneMessage.Mxe.Data[1]<<8)&0xFF00) - +(j1939_uint32_t)((OneMessage.Mxe.Data[0])&0xFF); - } - J1939_Response(OneMessage.Mxe.PGN); - break; - default: -PutInReceiveQueue: - { -/* -if(OneMessage.Mxe.PDUFormat < 240){ - OneMessage.Mxe.PGN = (j1939_uint32_t)((OneMessage.Array[0]<<16)&0x030000) - +(j1939_uint32_t)((OneMessage.Array[1]<<8)&0xFF00) - +0x00; -}else{ - OneMessage.Mxe.PGN = (j1939_uint32_t)((OneMessage.Array[0]<<16)&0x030000) - +(j1939_uint32_t)((OneMessage.Array[1]<<8)&0xFF00) - +(j1939_uint32_t)((OneMessage.Array[2])&0xFF); -} -*/ - if(OneMessage.Mxe.PDUFormat < 240){ - OneMessage.Mxe.PGN = (OneMessage.Mxe.Res << 17) - +(OneMessage.Mxe.DataPage << 16) - +(OneMessage.Mxe.PDUFormat << 8); - }else{ - OneMessage.Mxe.PGN = (OneMessage.Mxe.Res << 17) - +(OneMessage.Mxe.DataPage << 16) - +(OneMessage.Mxe.PDUFormat << 8) - + OneMessage.Mxe.PDUSpecific; - } - - switch (Can_Node) - { - case Select_CAN_NODE_1: - { - if ( (J1939_OVERWRITE_RX_QUEUE == J1939_TRUE) || - (RXQueueCount_1 < J1939_RX_QUEUE_SIZE)) - { - if (RXQueueCount_1 < J1939_RX_QUEUE_SIZE) - { - RXQueueCount_1 ++; - RXTail_1 ++; - if (RXTail_1 >= J1939_RX_QUEUE_SIZE) - RXTail_1 = 0; - }else{ - J1939_Flags.ReceivedMessagesdCover = 1; //浜х敓鏁版嵁瑕嗙洊 - J1939_Flags.ReceivedMessagesdCoverOrDroppedNode = Select_CAN_NODE_1; - } - RXQueue_1[RXTail_1] = OneMessage; - } - else - J1939_Flags.ReceivedMessagesDropped = 1; //浜х敓鏁版嵁婧㈠嚭 - break; - } - case Select_CAN_NODE_2: - { - if ( (J1939_OVERWRITE_RX_QUEUE == J1939_TRUE) || - (RXQueueCount_2 < J1939_RX_QUEUE_SIZE)) - { - if (RXQueueCount_2 < J1939_RX_QUEUE_SIZE) - { - RXQueueCount_2 ++; - RXTail_2 ++; - if (RXTail_2 >= J1939_RX_QUEUE_SIZE) - RXTail_2 = 0; - }else{ - J1939_Flags.ReceivedMessagesdCover = 1; //浜х敓鏁版嵁瑕嗙洊 - J1939_Flags.ReceivedMessagesdCoverOrDroppedNode = Select_CAN_NODE_2; - } - RXQueue_2[RXTail_2] = OneMessage; - } - else - J1939_Flags.ReceivedMessagesDropped = 1; - break; - } - case Select_CAN_NODE_3: - { - if ( (J1939_OVERWRITE_RX_QUEUE == J1939_TRUE) || - (RXQueueCount_3 < J1939_RX_QUEUE_SIZE)) - { - if (RXQueueCount_3 < J1939_RX_QUEUE_SIZE) - { - RXQueueCount_3 ++; - RXTail_3 ++; - if (RXTail_3 >= J1939_RX_QUEUE_SIZE) - RXTail_3 = 0; - }else{ - J1939_Flags.ReceivedMessagesdCover = 1; //浜х敓鏁版嵁瑕嗙洊 - J1939_Flags.ReceivedMessagesdCoverOrDroppedNode = Select_CAN_NODE_3; - } - RXQueue_3[RXTail_3] = OneMessage; - } - else - J1939_Flags.ReceivedMessagesDropped = 1; - break; - } - case Select_CAN_NODE_4: - { - if ( (J1939_OVERWRITE_RX_QUEUE == J1939_TRUE) || - (RXQueueCount_4 < J1939_RX_QUEUE_SIZE)) - { - if (RXQueueCount_4 < J1939_RX_QUEUE_SIZE) - { - RXQueueCount_4 ++; - RXTail_4 ++; - if (RXTail_4 >= J1939_RX_QUEUE_SIZE) - RXTail_4 = 0; - }else{ - J1939_Flags.ReceivedMessagesdCover = 1; //浜х敓鏁版嵁瑕嗙洊 - J1939_Flags.ReceivedMessagesdCoverOrDroppedNode = Select_CAN_NODE_4; - } - RXQueue_4[RXTail_4] = OneMessage; - } - else - J1939_Flags.ReceivedMessagesDropped = 1; - break; - } - default : - { - break; - } - } - } - - } - } +#endif /* J1939_TP_RX_TX */ + + case J1939_PF_REQUEST: + + /* 鐢∣neMessage.Mxe.PGN 鏉ュ瓨涓嬭璇锋眰鐨凱GN */ + if (OneMessage.Mxe.Data[1] < 240) { + OneMessage.Mxe.PGN = (j1939_uint32_t) ((OneMessage.Mxe.Data[2] << 16) & 0x030000) + + (j1939_uint32_t) ((OneMessage.Mxe.Data[1] << 8) & 0xFF00) + + 0x00; + } else { + OneMessage.Mxe.PGN = (j1939_uint32_t) ((OneMessage.Mxe.Data[2] << 16) & 0x030000) + + (j1939_uint32_t) ((OneMessage.Mxe.Data[1] << 8) & 0xFF00) + + (j1939_uint32_t) ((OneMessage.Mxe.Data[0]) & 0xFF); + } -} + J1939_Response(OneMessage.Mxe.PGN); + break; + + default: +#if J1939_TP_RX_TX +PutInReceiveQueue: { + /* + if(OneMessage.Mxe.PDUFormat < 240){ + OneMessage.Mxe.PGN = (j1939_uint32_t)((OneMessage.Array[0]<<16)&0x030000) + +(j1939_uint32_t)((OneMessage.Array[1]<<8)&0xFF00) + +0x00; + }else{ + OneMessage.Mxe.PGN = (j1939_uint32_t)((OneMessage.Array[0]<<16)&0x030000) + +(j1939_uint32_t)((OneMessage.Array[1]<<8)&0xFF00) + +(j1939_uint32_t)((OneMessage.Array[2])&0xFF); + } + */ + if (OneMessage.Mxe.PDUFormat < 240) { + OneMessage.Mxe.PGN = (OneMessage.Mxe.Res << 17) + + (OneMessage.Mxe.DataPage << 16) + + (OneMessage.Mxe.PDUFormat << 8); + } else { + OneMessage.Mxe.PGN = (OneMessage.Mxe.Res << 17) + + (OneMessage.Mxe.DataPage << 16) + + (OneMessage.Mxe.PDUFormat << 8) + + OneMessage.Mxe.PDUSpecific; + } + + if ((J1939_OVERWRITE_RX_QUEUE == J1939_TRUE) || (RXQueueCount[Can_Node] < J1939_RX_QUEUE_SIZE)) { + if (RXQueueCount[Can_Node] < J1939_RX_QUEUE_SIZE) { + RXQueueCount[Can_Node]++; + RXTail[Can_Node]++; + + if (RXTail[Can_Node] >= J1939_RX_QUEUE_SIZE) { + RXTail[Can_Node] = 0; + } + } else { + J1939_Flags.ReceivedMessagesdCover = 1; /* 浜х敓鏁版嵁瑕嗙洊 */ + J1939_Flags.ReceivedMessagesdCoverOrDroppedNode = Can_Node; + } + + RXQueue[Can_Node][RXTail[Can_Node]] = OneMessage; + } else { + J1939_Flags.ReceivedMessagesDropped = 1; /* 浜х敓鏁版嵁婧㈠嚭 */ + } + } +#endif /* J1939_TP_RX_TX */ + break; + } + } +} /** -* @return RC_SUCCESS 淇℃伅鍙戦佹垚鍔 -* @return RC_CANNOTTRANSMIT 绯荤粺娌℃湁鍙戦佹秷鎭,娌℃湁瑕佸彂閫佺殑娑堟伅,鎴栭敊璇殑CAN璁惧 -* @note 璋冪敤杩欎釜鍑芥暟鍚庯紝濡傛灉鍙戦佹秷鎭垪闃熶腑鏈夋秷鎭氨浣嶏紝鍒欎細鍙戦佹秷鎭 锛屽鏋滀笉鑳藉彂閫佹秷鎭紝鐩稿叧鐨勯敊璇唬鐮佸皢杩斿洖銆俓n - 绋嬪簭杩愯鏈熼棿锛屼腑鏂槸琚け鑳界殑銆 -*/ -static j1939_uint8_t J1939_TransmitMessages() -{ - switch (Can_Node) - { - case Select_CAN_NODE_1: - { - if (TXQueueCount_1 == 0) - { - //濡傛灉娌℃湁瑕佸彂閫佺殑娑堟伅浠庡彂閫佹秷鎭垪闃熶腑锛屾仮澶嶄腑鏂(娓呯┖鍙戦佹爣璇嗕綅) - #if J1939_POLL_ECAN == J1939_FALSE - Port_TXinterruptEnable(); - #endif - return RC_CANNOTTRANSMIT; - } - else - { - while(TXQueueCount_1 > 0) - { - /*纭繚涓婃鏁版嵁鍙戦佹垚鍔*/ - /**************鍙鍔犱竴涓垽鏂嚱鏁**************************/ - - TXQueue_1[TXHead_1].Mxe.SourceAddress = NodeAddress_1; - - SendOneMessage( (J1939_MESSAGE *) &(TXQueue_1[TXHead_1]) ); - TXHead_1 ++; - if (TXHead_1 >= J1939_TX_QUEUE_SIZE) - TXHead_1 = 0; - TXQueueCount_1 --; - } - - /*閰嶇疆浜嗕竴浜涙爣璇嗕綅锛屼娇鑳戒腑鏂*/ - #if J1939_POLL_ECAN == J1939_FALSE - Port_TXinterruptEnable(); - #endif - } - break; - } - case Select_CAN_NODE_2: - { - if (TXQueueCount_2 == 0) - { - //濡傛灉娌℃湁瑕佸彂閫佺殑娑堟伅浠庡彂閫佹秷鎭垪闃熶腑锛屾仮澶嶄腑鏂(娓呯┖鍙戦佹爣璇嗕綅) - #if J1939_POLL_ECAN == J1939_FALSE - Port_TXinterruptEnable(); - #endif - return RC_CANNOTTRANSMIT; - } - else - { - - while(TXQueueCount_2 > 0) - { - /*纭繚涓婃鏁版嵁鍙戦佹垚鍔*/ - /**************鍙鍔犱竴涓垽鏂嚱鏁**************************/ - - TXQueue_2[TXHead_2].Mxe.SourceAddress = NodeAddress_2; - - SendOneMessage( (J1939_MESSAGE *) &(TXQueue_2[TXHead_2]) ); - TXHead_2 ++; - if (TXHead_2 >= J1939_TX_QUEUE_SIZE) - TXHead_2 = 0; - TXQueueCount_2 --; - } - - /*閰嶇疆浜嗕竴浜涙爣璇嗕綅锛屼娇鑳戒腑鏂*/ - #if J1939_POLL_ECAN == J1939_FALSE - Port_TXinterruptEnable(); - #endif - } - break; - } - case Select_CAN_NODE_3: - { - if (TXQueueCount_3 == 0) - { - //濡傛灉娌℃湁瑕佸彂閫佺殑娑堟伅浠庡彂閫佹秷鎭垪闃熶腑锛屾仮澶嶄腑鏂(娓呯┖鍙戦佹爣璇嗕綅) - #if J1939_POLL_ECAN == J1939_FALSE - Port_TXinterruptEnable(); - #endif - return RC_CANNOTTRANSMIT; - } - else - { - while(TXQueueCount_3 > 0) - { - /*纭繚涓婃鏁版嵁鍙戦佹垚鍔*/ - /**************鍙鍔犱竴涓垽鏂嚱鏁**************************/ - - TXQueue_3[TXHead_3].Mxe.SourceAddress = NodeAddress_3; - - SendOneMessage( (J1939_MESSAGE *) &(TXQueue_3[TXHead_3]) ); - TXHead_3 ++; - if (TXHead_3 >= J1939_TX_QUEUE_SIZE) - TXHead_3 = 0; - TXQueueCount_3 --; - } - - /*閰嶇疆浜嗕竴浜涙爣璇嗕綅锛屼娇鑳戒腑鏂*/ - #if J1939_POLL_ECAN == J1939_FALSE - Port_TXinterruptEnable(); - #endif - } - break; - } - case Select_CAN_NODE_4: - { - if (TXQueueCount_4 == 0) - { - //濡傛灉娌℃湁瑕佸彂閫佺殑娑堟伅浠庡彂閫佹秷鎭垪闃熶腑锛屾仮澶嶄腑鏂(娓呯┖鍙戦佹爣璇嗕綅) - #if J1939_POLL_ECAN == J1939_FALSE - Port_TXinterruptEnable(); - #endif - return RC_CANNOTTRANSMIT; - } - else - { - - while(TXQueueCount_4 > 0) - { - /*纭繚涓婃鏁版嵁鍙戦佹垚鍔*/ - /**************鍙鍔犱竴涓垽鏂嚱鏁**************************/ - - TXQueue_4[TXHead_4].Mxe.SourceAddress = NodeAddress_4; - - SendOneMessage( (J1939_MESSAGE *) &(TXQueue_4[TXHead_4]) ); - TXHead_4 ++; - if (TXHead_4 >= J1939_TX_QUEUE_SIZE) - TXHead_4 = 0; - TXQueueCount_4 --; - } - - /*閰嶇疆浜嗕竴浜涙爣璇嗕綅锛屼娇鑳戒腑鏂*/ - #if J1939_POLL_ECAN == J1939_FALSE - Port_TXinterruptEnable(); - #endif - } - break; - } - default : - { - return RC_CANNOTTRANSMIT; - break; - } - } - - return RC_SUCCESS; + * @return RC_SUCCESS 淇℃伅鍙戦佹垚鍔 + * @return RC_CANNOTTRANSMIT 绯荤粺娌℃湁鍙戦佹秷鎭,娌℃湁瑕佸彂閫佺殑娑堟伅,鎴栭敊璇殑CAN璁惧 + * @note 璋冪敤杩欎釜鍑芥暟鍚庯紝濡傛灉鍙戦佹秷鎭槦鍒椾腑鏈夋秷鎭氨浣嶏紝鍒欎細鍙戦佹秷鎭 锛屽鏋滀笉鑳藉彂閫佹秷鎭紝鐩稿叧鐨勯敊璇唬鐮佸皢杩斿洖銆俓n + 绋嬪簭杩愯鏈熼棿锛屼腑鏂槸琚け鑳界殑銆 + */ +static J1939_Status_t J1939_TransmitMessages(void) +{ + if (TXQueueCount[Can_Node] == 0) { + /* 濡傛灉娌℃湁瑕佸彂閫佺殑娑堟伅浠庡彂閫佹秷鎭槦鍒椾腑锛屾仮澶嶄腑鏂(娓呯┖鍙戦佹爣璇嗕綅) */ + Port_TXinterruptEnable(); + + return RC_CANNOTTRANSMIT; + } else { + while (TXQueueCount[Can_Node] > 0) { + /* 纭繚涓婃鏁版嵁鍙戦佹垚鍔 */ + /**************鍙鍔犱竴涓垽鏂嚱鏁**************************/ + + TXQueue[Can_Node][TXHead[Can_Node]].Mxe.SourceAddress = NodeAddress[Can_Node]; + + SendOneMessage((J1939_MESSAGE_t *) & (TXQueue[Can_Node][TXHead[Can_Node]])); + TXHead[Can_Node]++; + + if (TXHead[Can_Node] >= J1939_TX_QUEUE_SIZE) { + TXHead[Can_Node] = 0; + } + + TXQueueCount[Can_Node]--; + } + + /* 閰嶇疆浜嗕竴浜涙爣璇嗕綅锛屼娇鑳戒腑鏂 */ + Port_TXinterruptEnable(); + } + + return RC_SUCCESS; } + #if J1939_TP_RX_TX /** -* @note 鍙戦乀P.DT锛屽弬鑰僇1939-21 -*/ + * @note 鍙戦乀P.DT锛屽弬鑰僇1939-21 + */ void J1939_TP_DT_Packet_send(void) { - J1939_MESSAGE _msg; - j1939_uint16_t _packet_offset_p; - j1939_int32_t _i=0; - _msg.Mxe.Priority = J1939_TP_DT_PRIORITY; - _msg.Mxe.DataPage =0; - _msg.Mxe.PDUFormat = J1939_PF_DT; - _msg.Mxe.DestinationAddress = TP_TX_MSG.tp_tx_msg.SA; - _msg.Mxe.DataLength = 8; - - - /*鑾峰彇璇锋眰鍙戦佺殑鏁版嵁鍖呮暟閲*/ - if(TP_TX_MSG.packets_request_num > 0) - { - TP_TX_MSG.packets_request_num--; - /*鑾峰彇鏁版嵁鍋忕Щ鎸囬拡*/ - _packet_offset_p = (j1939_uint16_t)(TP_TX_MSG.packet_offset_p*7u); - /*鍔犺浇鏁版嵁鍖呯紪鍙*/ - _msg.Mxe.Data[0] = (j1939_uint8_t)(1u + TP_TX_MSG.packet_offset_p); + J1939_MESSAGE_t _msg; + j1939_uint16_t _packet_offset_p; + j1939_int32_t _i = 0; + _msg.Mxe.Priority = J1939_PRIORITY_TP_DT; + _msg.Mxe.DataPage = 0; + _msg.Mxe.PDUFormat = J1939_PF_TP_DT; + _msg.Mxe.DestinationAddress = TP_TX_MSG.tp_tx_msg.SA; + _msg.Mxe.DataLength = 8; - for(_i = 0; _i<7; _i++) - { - _msg.Mxe.Data[_i+1] = TP_TX_MSG.tp_tx_msg.data[_packet_offset_p + _i]; + /* 鑾峰彇璇锋眰鍙戦佺殑鏁版嵁鍖呮暟閲 */ + if (TP_TX_MSG.packets_request_num > 0) { + TP_TX_MSG.packets_request_num--; + /* 鑾峰彇鏁版嵁鍋忕Щ鎸囬拡 */ + _packet_offset_p = (j1939_uint16_t) (TP_TX_MSG.packet_offset_p * 7u); + /* 鍔犺浇鏁版嵁鍖呯紪鍙 */ + _msg.Mxe.Data[0] = (j1939_uint8_t) (1u + TP_TX_MSG.packet_offset_p); + + for (_i = 0; _i < 7; _i++) { + _msg.Mxe.Data[_i + 1] = TP_TX_MSG.tp_tx_msg.data[_packet_offset_p + _i]; } - /*鏄惁鏄渶鍚庝竴鍖呮暟鎹秷鎭*/ - if(TP_TX_MSG.packet_offset_p == (TP_TX_MSG.packets_total - 1u)) - { - /*鍙傛暟缇ゆ槸鍚﹁兘琚~婊★紝鏄惁闇瑕佸~鍏咃紝*/ - if ( _packet_offset_p > TP_TX_MSG.tp_tx_msg.byte_count - 7 ) - { - /*璁$畻闇瑕佸~鍏呯殑鏁版嵁鏁*/ - _i = TP_TX_MSG.tp_tx_msg.byte_count- _packet_offset_p - 7 ; - - for ( ; _i < 0 ; _i++ ) - { - /*鎴戜滑榛樿J1939鐨勫弬鏁扮兢澶у皬涓8*/ - _msg.Mxe.Data[_i+8] = J1939_RESERVED_BYTE ; + + /* 鏄惁鏄渶鍚庝竴鍖呮暟鎹秷鎭 */ + if (TP_TX_MSG.packet_offset_p == (TP_TX_MSG.packets_total - 1u)) { + /* 鍙傛暟缇ゆ槸鍚﹁兘琚~婊★紝鏄惁闇瑕佸~鍏 */ + if (_packet_offset_p > TP_TX_MSG.tp_tx_msg.byte_count - 7) { + /* 璁$畻闇瑕佸~鍏呯殑鏁版嵁鏁 */ + _i = TP_TX_MSG.tp_tx_msg.byte_count - _packet_offset_p - 7; + + for (; _i < 0; _i++) { + /* 鎴戜滑榛樿J1939鐨勫弬鏁扮兢澶у皬涓8 */ + _msg.Mxe.Data[_i + 8] = J1939_CONTROL_BYTE_RESERVED; } } - TP_TX_MSG.packets_request_num = 0; TP_TX_MSG.packet_offset_p = 0; TP_TX_MSG.time = J1939_TP_T3; - /* 璺宠浆姝ラ锛岀瓑寰呯粨鏉熺‘璁ゆ垨鍒欓噸鏂板彂閫佹暟鎹姹*/ + /* 璺宠浆姝ラ锛岀瓑寰呯粨鏉熺‘璁ゆ垨鍒欓噸鏂板彂閫佹暟鎹姹 */ TP_TX_MSG.state = J1939_TP_WAIT_ACK; - } - else - { - /*涓轰笅涓涓暟鎹彂閫佸仛鍑嗗*/ - TP_TX_MSG.packet_offset_p++; - TP_TX_MSG.state = J1939_TP_TX_DT; + } else { + /* 涓轰笅涓涓暟鎹彂閫佸仛鍑嗗 */ + TP_TX_MSG.packet_offset_p++; + TP_TX_MSG.state = J1939_TP_TX_DT; } - /*鍙兘闃熷垪宸叉弧锛屽彂涓嶅嚭鍘伙紝浣嗘槸杩欓噷涓嶈兘闈犺繑鍥炲艰繘琛屾棤闄愮殑姝荤瓑*/ + /* 鍙兘闃熷垪宸叉弧锛屽彂涓嶅嚭鍘伙紝浣嗘槸杩欓噷涓嶈兘闈犺繑鍥炲艰繘琛屾棤闄愮殑姝荤瓑 */ J1939_EnqueueMessage(&_msg, Can_Node); - } - else - { + } else { - TP_TX_MSG.packets_request_num = 0; - TP_TX_MSG.packet_offset_p = 0; - TP_TX_MSG.time = J1939_TP_T3; - TP_TX_MSG.state = J1939_TP_WAIT_ACK; + TP_TX_MSG.packets_request_num = 0; + TP_TX_MSG.packet_offset_p = 0; + TP_TX_MSG.time = J1939_TP_T3; + TP_TX_MSG.state = J1939_TP_WAIT_ACK; } } + /** -* @note 鍙戦乀P銆侰M-RTS,16,23,4,255,PGN娑堟伅锛屽弬鑰僇1939-21锛 -*/ + * @note 鍙戦乀P銆侰M-RTS,16,23,4,255,PGN娑堟伅锛屽弬鑰僇1939-21锛 + */ void J1939_CM_Start(void) { - j1939_uint32_t pgn_num; - J1939_MESSAGE _msg; + j1939_uint32_t pgn_num; + J1939_MESSAGE_t _msg; pgn_num = TP_TX_MSG.tp_tx_msg.PGN; - _msg.Mxe.Priority = J1939_TP_CM_PRIORITY; - _msg.Mxe.DataPage =0; + _msg.Mxe.Priority = J1939_PRIORITY_TP_CM; + _msg.Mxe.DataPage = 0; _msg.Mxe.PDUFormat = J1939_PF_TP_CM; _msg.Mxe.DestinationAddress = TP_TX_MSG.tp_tx_msg.SA; _msg.Mxe.DataLength = 8; - _msg.Mxe.Data[0] = J1939_RTS_CONTROL_BYTE; - _msg.Mxe.Data[1] = (j1939_uint8_t) TP_TX_MSG.tp_tx_msg.byte_count ; - _msg.Mxe.Data[2] = (j1939_uint8_t) ((TP_TX_MSG.tp_tx_msg.byte_count)>>8); + _msg.Mxe.Data[0] = J1939_CONTROL_BYTE_RTS; + _msg.Mxe.Data[1] = (j1939_uint8_t) TP_TX_MSG.tp_tx_msg.byte_count; + _msg.Mxe.Data[2] = (j1939_uint8_t) ((TP_TX_MSG.tp_tx_msg.byte_count) >> 8); _msg.Mxe.Data[3] = TP_TX_MSG.packets_total; - _msg.Mxe.Data[4] = J1939_RESERVED_BYTE; - _msg.Mxe.Data[7] = (j1939_uint8_t)((pgn_num>>16) & 0xff); - _msg.Mxe.Data[6] = (j1939_uint8_t)(pgn_num>>8 & 0xff); - _msg.Mxe.Data[5] = (j1939_uint8_t)(pgn_num & 0xff); + _msg.Mxe.Data[4] = J1939_CONTROL_BYTE_RESERVED; + _msg.Mxe.Data[7] = (j1939_uint8_t) ((pgn_num >> 16) & 0xff); + _msg.Mxe.Data[6] = (j1939_uint8_t) (pgn_num >> 8 & 0xff); + _msg.Mxe.Data[5] = (j1939_uint8_t) (pgn_num & 0xff); - /*鍙兘闃熷垪宸叉弧锛屽彂涓嶅嚭鍘伙紝浣嗘槸杩欓噷涓嶈兘闈犺繑鍥炲艰繘琛屾棤闄愮殑姝荤瓑*/ + /* 鍙兘闃熷垪宸叉弧锛屽彂涓嶅嚭鍘伙紝浣嗘槸杩欓噷涓嶈兘闈犺繑鍥炲艰繘琛屾棤闄愮殑姝荤瓑 */ J1939_EnqueueMessage(&_msg, Can_Node); - /*鍒锋柊绛夊緟鏃堕棿锛岃Е鍙戜笅涓涓楠わ紙锛*/ + /* 鍒锋柊绛夊緟鏃堕棿锛岃Е鍙戜笅涓涓楠 */ TP_TX_MSG.time = J1939_TP_T3; TP_TX_MSG.state = J1939_TP_TX_CM_WAIT; - } + /** -* @note 涓柇TP閾炬帴 -*/ + * @note 涓柇TP閾炬帴 + */ void J1939_TP_TX_Abort(void) { - J1939_MESSAGE _msg; - j1939_uint32_t pgn_num; - - pgn_num = TP_TX_MSG.tp_tx_msg.PGN; - - _msg.Mxe.Priority = J1939_TP_CM_PRIORITY; - _msg.Mxe.DataPage =0; - _msg.Mxe.PDUFormat = J1939_PF_TP_CM; - _msg.Mxe.DestinationAddress = TP_TX_MSG.tp_tx_msg.SA; - _msg.Mxe.DataLength = 8; - _msg.Mxe.Data[0] = J1939_CONNABORT_CONTROL_BYTE; - _msg.Mxe.Data[1] = J1939_RESERVED_BYTE; - _msg.Mxe.Data[2] = J1939_RESERVED_BYTE; - _msg.Mxe.Data[3] = J1939_RESERVED_BYTE; - _msg.Mxe.Data[4] = J1939_RESERVED_BYTE; - _msg.Mxe.Data[7] = (j1939_uint8_t)((pgn_num>>16) & 0xff); - _msg.Mxe.Data[6] = (j1939_uint8_t)(pgn_num>>8 & 0xff); - _msg.Mxe.Data[5] = (j1939_uint8_t)(pgn_num & 0xff); - - /*鍙兘闃熷垪宸叉弧锛屽彂涓嶅嚭鍘伙紝浣嗘槸杩欓噷涓嶈兘闈犺繑鍥炲艰繘琛屾棤闄愮殑姝荤瓑*/ + J1939_MESSAGE_t _msg; + j1939_uint32_t pgn_num; + + pgn_num = TP_TX_MSG.tp_tx_msg.PGN; + + _msg.Mxe.Priority = J1939_PRIORITY_TP_CM; + _msg.Mxe.DataPage = 0; + _msg.Mxe.PDUFormat = J1939_PF_TP_CM; + _msg.Mxe.DestinationAddress = TP_TX_MSG.tp_tx_msg.SA; + _msg.Mxe.DataLength = 8; + _msg.Mxe.Data[0] = J1939_CONTROL_BYTE_CONNABORT; + _msg.Mxe.Data[1] = J1939_CONTROL_BYTE_RESERVED; + _msg.Mxe.Data[2] = J1939_CONTROL_BYTE_RESERVED; + _msg.Mxe.Data[3] = J1939_CONTROL_BYTE_RESERVED; + _msg.Mxe.Data[4] = J1939_CONTROL_BYTE_RESERVED; + _msg.Mxe.Data[7] = (j1939_uint8_t) ((pgn_num >> 16) & 0xff); + _msg.Mxe.Data[6] = (j1939_uint8_t) (pgn_num >> 8 & 0xff); + _msg.Mxe.Data[5] = (j1939_uint8_t) (pgn_num & 0xff); + + /* 鍙兘闃熷垪宸叉弧锛屽彂涓嶅嚭鍘伙紝浣嗘槸杩欓噷涓嶈兘闈犺繑鍥炲艰繘琛屾棤闄愮殑姝荤瓑 */ J1939_EnqueueMessage(&_msg, Can_Node); - /*缁撴潫鍙戦*/ + /* 缁撴潫鍙戦 */ TP_TX_MSG.state = J1939_TX_DONE; - } + /** -* @note 涓柇TP閾炬帴 -*/ + * @note 涓柇TP閾炬帴 + */ void J1939_TP_RX_Abort(void) { - J1939_MESSAGE _msg; - j1939_uint32_t pgn_num; - - pgn_num = TP_RX_MSG.tp_rx_msg.PGN; - - _msg.Mxe.Priority = J1939_TP_CM_PRIORITY; - _msg.Mxe.DataPage =0; - _msg.Mxe.PDUFormat = J1939_PF_TP_CM; - _msg.Mxe.DestinationAddress = TP_RX_MSG.tp_rx_msg.SA; - _msg.Mxe.DataLength = 8; - _msg.Mxe.Data[0] = J1939_CONNABORT_CONTROL_BYTE; - _msg.Mxe.Data[1] = J1939_RESERVED_BYTE; - _msg.Mxe.Data[2] = J1939_RESERVED_BYTE; - _msg.Mxe.Data[3] = J1939_RESERVED_BYTE; - _msg.Mxe.Data[4] = J1939_RESERVED_BYTE; - _msg.Mxe.Data[7] = (j1939_uint8_t)((pgn_num>>16) & 0xff); - _msg.Mxe.Data[6] = (j1939_uint8_t)(pgn_num>>8 & 0xff); - _msg.Mxe.Data[5] = (j1939_uint8_t)(pgn_num & 0xff); - - /*鍙兘闃熷垪宸叉弧锛屽彂涓嶅嚭鍘伙紝浣嗘槸杩欓噷涓嶈兘闈犺繑鍥炲艰繘琛屾棤闄愮殑姝荤瓑*/ + J1939_MESSAGE_t _msg; + j1939_uint32_t pgn_num; + + pgn_num = TP_RX_MSG.tp_rx_msg.PGN; + + _msg.Mxe.Priority = J1939_PRIORITY_TP_CM; + _msg.Mxe.DataPage = 0; + _msg.Mxe.PDUFormat = J1939_PF_TP_CM; + _msg.Mxe.DestinationAddress = TP_RX_MSG.tp_rx_msg.SA; + _msg.Mxe.DataLength = 8; + _msg.Mxe.Data[0] = J1939_CONTROL_BYTE_CONNABORT; + _msg.Mxe.Data[1] = J1939_CONTROL_BYTE_RESERVED; + _msg.Mxe.Data[2] = J1939_CONTROL_BYTE_RESERVED; + _msg.Mxe.Data[3] = J1939_CONTROL_BYTE_RESERVED; + _msg.Mxe.Data[4] = J1939_CONTROL_BYTE_RESERVED; + _msg.Mxe.Data[7] = (j1939_uint8_t) ((pgn_num >> 16) & 0xff); + _msg.Mxe.Data[6] = (j1939_uint8_t) (pgn_num >> 8 & 0xff); + _msg.Mxe.Data[5] = (j1939_uint8_t) (pgn_num & 0xff); + + /* 鍙兘闃熷垪宸叉弧锛屽彂涓嶅嚭鍘伙紝浣嗘槸杩欓噷涓嶈兘闈犺繑鍥炲艰繘琛屾棤闄愮殑姝荤瓑 */ J1939_EnqueueMessage(&_msg, Can_Node); - /*缁撴潫鍙戦*/ + /* 缁撴潫鍙戦 */ TP_RX_MSG.state = J1939_RX_DONE; - } + /** -* @note TP鐨勮鏃跺櫒 -*/ + * @note TP鐨勮鏃跺櫒 + */ j1939_uint8_t J1939_TP_TX_RefreshCMTimer(j1939_uint16_t dt_ms) { - if((J1939_TP_TX_CM_WAIT == TP_TX_MSG.state)||(J1939_TP_WAIT_ACK == TP_TX_MSG.state)) - { - if(TP_TX_MSG.time > dt_ms) - { - TP_TX_MSG.time = TP_TX_MSG.time - dt_ms; - return J1939_TP_TIMEOUT_NORMAL; - } - else - { - /*瓒呮椂 */ - TP_TX_MSG.time = 0u; - return J1939_TP_TIMEOUT_ABNORMAL; - } - - } - else - { - return J1939_TP_TIMEOUT_NORMAL; - } + if ((J1939_TP_TX_CM_WAIT == TP_TX_MSG.state) || (J1939_TP_WAIT_ACK == TP_TX_MSG.state)) { + if (TP_TX_MSG.time > dt_ms) { + TP_TX_MSG.time = TP_TX_MSG.time - dt_ms; + return J1939_TP_TIMEOUT_NORMAL; + } else { + /* 瓒呮椂 */ + TP_TX_MSG.time = 0u; + return J1939_TP_TIMEOUT_ABNORMAL; + } + + } else { + return J1939_TP_TIMEOUT_NORMAL; + } } + /** -* @note TP鐨勮鏃跺櫒 -*/ + * @note TP鐨勮鏃跺櫒 + */ j1939_uint8_t J1939_TP_RX_RefreshCMTimer(j1939_uint16_t dt_ms) { - if((J1939_TP_RX_DATA_WAIT == TP_RX_MSG.state)) - { - if(TP_RX_MSG.time > dt_ms) - { - TP_RX_MSG.time = TP_RX_MSG.time - dt_ms; - return J1939_TP_TIMEOUT_NORMAL; - } - else - { - /*瓒呮椂 */ - TP_RX_MSG.time = 0u; - return J1939_TP_TIMEOUT_ABNORMAL; - } - - } - else - { - return J1939_TP_TIMEOUT_NORMAL; - } + if ((J1939_TP_RX_DATA_WAIT == TP_RX_MSG.state)) { + if (TP_RX_MSG.time > dt_ms) { + TP_RX_MSG.time = TP_RX_MSG.time - dt_ms; + return J1939_TP_TIMEOUT_NORMAL; + } else { + /* 瓒呮椂 */ + TP_RX_MSG.time = 0u; + return J1939_TP_TIMEOUT_ABNORMAL; + } + + } else { + return J1939_TP_TIMEOUT_NORMAL; + } } /** -* @note 鍙戦佽鍙栨暟鎹 TP.CM_CTS 鍜 EndofMsgAck娑堟伅銆 -*/ -void J1939_read_DT_Packet() + * @note 鍙戦佽鍙栨暟鎹 TP.CM_CTS 鍜 EndofMsgAck娑堟伅銆 + */ +void J1939_read_DT_Packet(void) { - J1939_MESSAGE _msg; - j1939_uint32_t pgn_num; - pgn_num = TP_RX_MSG.tp_rx_msg.PGN; - - _msg.Mxe.Priority = J1939_TP_CM_PRIORITY; - _msg.Mxe.DataPage =0; - _msg.Mxe.PDUFormat = J1939_PF_TP_CM; - _msg.Mxe.DestinationAddress = TP_RX_MSG.tp_rx_msg.SA; - _msg.Mxe.DataLength = 8; - - /*濡傛灉绯荤粺绻佸繖,淇濇寔閾炬帴浣嗘槸涓嶄紶閫佹秷鎭*/ - if(TP_RX_MSG.osbusy) - { - _msg.Mxe.Data[0] = J1939_CTS_CONTROL_BYTE; - _msg.Mxe.Data[1] = 0; - _msg.Mxe.Data[2] = J1939_RESERVED_BYTE; - _msg.Mxe.Data[3] = J1939_RESERVED_BYTE; - _msg.Mxe.Data[4] = J1939_RESERVED_BYTE; - _msg.Mxe.Data[7] = (j1939_uint8_t)((pgn_num>>16) & 0xff); - _msg.Mxe.Data[6] = (j1939_uint8_t)(pgn_num>>8 & 0xff); - _msg.Mxe.Data[5] = (j1939_uint8_t)(pgn_num & 0xff); - /*鍙兘闃熷垪宸叉弧锛屽彂涓嶅嚭鍘伙紝浣嗘槸杩欓噷涓嶈兘闈犺繑鍥炲艰繘琛屾棤闄愮殑姝荤瓑*/ + J1939_MESSAGE_t _msg; + j1939_uint32_t pgn_num; + pgn_num = TP_RX_MSG.tp_rx_msg.PGN; + + _msg.Mxe.Priority = J1939_PRIORITY_TP_CM; + _msg.Mxe.DataPage = 0; + _msg.Mxe.PDUFormat = J1939_PF_TP_CM; + _msg.Mxe.DestinationAddress = TP_RX_MSG.tp_rx_msg.SA; + _msg.Mxe.DataLength = 8; + + /* 濡傛灉绯荤粺绻佸繖,淇濇寔閾炬帴浣嗘槸涓嶄紶閫佹秷鎭 */ + if (TP_RX_MSG.osbusy) { + _msg.Mxe.Data[0] = J1939_CONTROL_BYTE_CTS; + _msg.Mxe.Data[1] = 0; + _msg.Mxe.Data[2] = J1939_CONTROL_BYTE_RESERVED; + _msg.Mxe.Data[3] = J1939_CONTROL_BYTE_RESERVED; + _msg.Mxe.Data[4] = J1939_CONTROL_BYTE_RESERVED; + _msg.Mxe.Data[7] = (j1939_uint8_t) ((pgn_num >> 16) & 0xff); + _msg.Mxe.Data[6] = (j1939_uint8_t) (pgn_num >> 8 & 0xff); + _msg.Mxe.Data[5] = (j1939_uint8_t) (pgn_num & 0xff); + /* 鍙兘闃熷垪宸叉弧锛屽彂涓嶅嚭鍘伙紝浣嗘槸杩欓噷涓嶈兘闈犺繑鍥炲艰繘琛屾棤闄愮殑姝荤瓑 */ J1939_EnqueueMessage(&_msg, Can_Node); - return ; - } - if(TP_RX_MSG.packets_total > TP_RX_MSG.packets_ok_num) - { - /*鏈鍚庝竴娆″搷搴旓紝濡傛灉涓嶈冻2鍖呮暟鎹*/ - if((TP_RX_MSG.packets_total - TP_RX_MSG.packets_ok_num)==1) - { - _msg.Mxe.Data[0] = J1939_CTS_CONTROL_BYTE; - _msg.Mxe.Data[1] = 1; - _msg.Mxe.Data[2] = TP_RX_MSG.packets_total; - _msg.Mxe.Data[3] = J1939_RESERVED_BYTE; - _msg.Mxe.Data[4] = J1939_RESERVED_BYTE; - _msg.Mxe.Data[7] = (j1939_uint8_t)((pgn_num>>16) & 0xff); - _msg.Mxe.Data[6] = (j1939_uint8_t)(pgn_num>>8 & 0xff); - _msg.Mxe.Data[5] = (j1939_uint8_t)(pgn_num & 0xff); - /*鍙兘闃熷垪宸叉弧锛屽彂涓嶅嚭鍘伙紝浣嗘槸杩欓噷涓嶈兘闈犺繑鍥炲艰繘琛屾棤闄愮殑姝荤瓑*/ + return; + } + + if (TP_RX_MSG.packets_total > TP_RX_MSG.packets_ok_num) { + /* 鏈鍚庝竴娆″搷搴旓紝濡傛灉涓嶈冻2鍖呮暟鎹 */ + if ((TP_RX_MSG.packets_total - TP_RX_MSG.packets_ok_num) == 1) { + _msg.Mxe.Data[0] = J1939_CONTROL_BYTE_CTS; + _msg.Mxe.Data[1] = 1; + _msg.Mxe.Data[2] = TP_RX_MSG.packets_total; + _msg.Mxe.Data[3] = J1939_CONTROL_BYTE_RESERVED; + _msg.Mxe.Data[4] = J1939_CONTROL_BYTE_RESERVED; + _msg.Mxe.Data[7] = (j1939_uint8_t) ((pgn_num >> 16) & 0xff); + _msg.Mxe.Data[6] = (j1939_uint8_t) (pgn_num >> 8 & 0xff); + _msg.Mxe.Data[5] = (j1939_uint8_t) (pgn_num & 0xff); + /* 鍙兘闃熷垪宸叉弧锛屽彂涓嶅嚭鍘伙紝浣嗘槸杩欓噷涓嶈兘闈犺繑鍥炲艰繘琛屾棤闄愮殑姝荤瓑 */ J1939_EnqueueMessage(&_msg, Can_Node); - TP_RX_MSG.state = J1939_TP_RX_DATA_WAIT; - return ; - } - _msg.Mxe.Data[0] = J1939_CTS_CONTROL_BYTE; - _msg.Mxe.Data[1] = 2; - _msg.Mxe.Data[2] = (TP_RX_MSG.packets_ok_num + 1); - _msg.Mxe.Data[3] = J1939_RESERVED_BYTE; - _msg.Mxe.Data[4] = J1939_RESERVED_BYTE; - _msg.Mxe.Data[7] = (j1939_uint8_t)((pgn_num>>16) & 0xff); - _msg.Mxe.Data[6] = (j1939_uint8_t)(pgn_num>>8 & 0xff); - _msg.Mxe.Data[5] = (j1939_uint8_t)(pgn_num & 0xff); - - /*鍙兘闃熷垪宸叉弧锛屽彂涓嶅嚭鍘伙紝浣嗘槸杩欓噷涓嶈兘闈犺繑鍥炲艰繘琛屾棤闄愮殑姝荤瓑*/ + TP_RX_MSG.state = J1939_TP_RX_DATA_WAIT; + return; + } + + _msg.Mxe.Data[0] = J1939_CONTROL_BYTE_CTS; + _msg.Mxe.Data[1] = 2; + _msg.Mxe.Data[2] = (TP_RX_MSG.packets_ok_num + 1); + _msg.Mxe.Data[3] = J1939_CONTROL_BYTE_RESERVED; + _msg.Mxe.Data[4] = J1939_CONTROL_BYTE_RESERVED; + _msg.Mxe.Data[7] = (j1939_uint8_t) ((pgn_num >> 16) & 0xff); + _msg.Mxe.Data[6] = (j1939_uint8_t) (pgn_num >> 8 & 0xff); + _msg.Mxe.Data[5] = (j1939_uint8_t) (pgn_num & 0xff); + + /* 鍙兘闃熷垪宸叉弧锛屽彂涓嶅嚭鍘伙紝浣嗘槸杩欓噷涓嶈兘闈犺繑鍥炲艰繘琛屾棤闄愮殑姝荤瓑 */ J1939_EnqueueMessage(&_msg, Can_Node); - TP_RX_MSG.state = J1939_TP_RX_DATA_WAIT; - return ; - }else - { - /*鍙戦佷紶杈撴甯哥粨鏉熸秷鎭紝EndofMsgAck*/ - _msg.Mxe.Data[0] = J1939_EOMACK_CONTROL_BYTE; - _msg.Mxe.Data[1] = (TP_RX_MSG.tp_rx_msg.byte_count & 0x00ff); - _msg.Mxe.Data[2] = ((TP_RX_MSG.tp_rx_msg.byte_count >> 8) & 0x00ff); - _msg.Mxe.Data[3] = TP_RX_MSG.packets_total; - _msg.Mxe.Data[4] = J1939_RESERVED_BYTE; - _msg.Mxe.Data[7] = (j1939_uint8_t)((pgn_num>>16) & 0xff); - _msg.Mxe.Data[6] = (j1939_uint8_t)(pgn_num>>8 & 0xff); - _msg.Mxe.Data[5] = (j1939_uint8_t)(pgn_num & 0xff); - /*鍙兘闃熷垪宸叉弧锛屽彂涓嶅嚭鍘伙紝浣嗘槸杩欓噷涓嶈兘闈犺繑鍥炲艰繘琛屾棤闄愮殑姝荤瓑*/ + TP_RX_MSG.state = J1939_TP_RX_DATA_WAIT; + return; + } else { + /* 鍙戦佷紶杈撴甯哥粨鏉熸秷鎭紝EndofMsgAck */ + _msg.Mxe.Data[0] = J1939_CONTROL_BYTE_EOMACK; + _msg.Mxe.Data[1] = (TP_RX_MSG.tp_rx_msg.byte_count & 0x00ff); + _msg.Mxe.Data[2] = ((TP_RX_MSG.tp_rx_msg.byte_count >> 8) & 0x00ff); + _msg.Mxe.Data[3] = TP_RX_MSG.packets_total; + _msg.Mxe.Data[4] = J1939_CONTROL_BYTE_RESERVED; + _msg.Mxe.Data[7] = (j1939_uint8_t) ((pgn_num >> 16) & 0xff); + _msg.Mxe.Data[6] = (j1939_uint8_t) (pgn_num >> 8 & 0xff); + _msg.Mxe.Data[5] = (j1939_uint8_t) (pgn_num & 0xff); + /* 鍙兘闃熷垪宸叉弧锛屽彂涓嶅嚭鍘伙紝浣嗘槸杩欓噷涓嶈兘闈犺繑鍥炲艰繘琛屾棤闄愮殑姝荤瓑 */ J1939_EnqueueMessage(&_msg, Can_Node); - TP_RX_MSG.state = J1939_RX_DONE; - return ; - } + TP_RX_MSG.state = J1939_RX_DONE; + return; + } } + /** -* @note TP鍗忚鐨勫績璺筹紝涓轰簡婊¤冻鍦ㄦ荤嚎鐨勮鏃跺噯纭紝10ms杞涓娆 J1939_TP_TX_RefreshCMTimer(10)\n - 濡傛灉鎯宠鏇撮珮鐨勫垎杈ㄧ巼锛1ms杞涓娆★紝浣嗘槸瑕佹敼涓嬮潰璁℃椂鍑芥暟 J1939_TP_TX_RefreshCMTimer(1) -*/ -void J1939_TP_Poll() + * @note TP鍗忚鐨勫績璺筹紝涓轰簡婊¤冻鍦ㄦ荤嚎鐨勮鏃跺噯纭紝10ms杞涓娆 J1939_TP_TX_RefreshCMTimer(10)\n + 濡傛灉鎯宠鏇撮珮鐨勫垎杈ㄧ巼锛1ms杞涓娆★紝浣嗘槸瑕佹敼涓嬮潰璁℃椂鍑芥暟 J1939_TP_TX_RefreshCMTimer(1) + */ +void J1939_TP_Poll(void) { - if(J1939_TP_Flags_t.state == J1939_TP_NULL || J1939_TP_Flags_t.state == J1939_TP_OSBUSY) - { - return ; - } - if(J1939_TP_Flags_t.state == J1939_TP_RX) - { - Can_Node = J1939_TP_Flags_t.TP_RX_CAN_NODE; - switch(TP_RX_MSG.state) - { - case J1939_TP_RX_WAIT: - ; - break; - case J1939_TP_RX_READ_DATA: - /*鍙戦佽鍙栨暟鎹 TP.CM_CTS 鍜 EndofMsgAck娑堟伅*/ - J1939_read_DT_Packet(); - break; - case J1939_TP_RX_DATA_WAIT: - /*绛夊緟TP.DT甯т紶杈撶殑娑堟伅*/ - if(J1939_TP_TIMEOUT_ABNORMAL == J1939_TP_RX_RefreshCMTimer(10)) - { - /* 绛夊緟瓒呮椂锛屽彂鐢熻繛鎺ュ紓甯革紝璺宠浆鍒板紓甯告楠 */ - TP_RX_MSG.state = J1939_TP_RX_ERROR; - } - break; - case J1939_TP_RX_ERROR: - J1939_TP_RX_Abort(); - J1939_TP_Flags_t.TP_RX_CAN_NODE = Select_CAN_NODE_Null; - break; - case J1939_RX_DONE: - TP_RX_MSG.packets_ok_num = 0; - TP_RX_MSG.packets_total = 0; - TP_RX_MSG.time = J1939_TP_T3; - TP_RX_MSG.state = J1939_TP_RX_WAIT; - J1939_TP_Flags_t.state = J1939_TP_NULL; - break; - default: - break; - } - return ; - } - if(J1939_TP_Flags_t.state == J1939_TP_TX) - { - Can_Node = J1939_TP_Flags_t.TP_TX_CAN_NODE; - switch (TP_TX_MSG.state) - { - case J1939_TP_TX_WAIT: - /*娌℃湁瑕佸彂閫佺殑鏁版嵁*/ - break; - case J1939_TP_TX_CM_START: - /*鍙戦乀P.CM_RTS甯т紶杈撶殑娑堟伅(鍙傝僯1939-21)*/ - J1939_CM_Start(); - break; - case J1939_TP_TX_CM_WAIT: - /*绛夊緟TP.CM_CTS甯т紶杈撶殑娑堟伅*/ - if(J1939_TP_TIMEOUT_ABNORMAL == J1939_TP_TX_RefreshCMTimer(10)) - { - /* 绛夊緟瓒呮椂锛屽彂鐢熻繛鎺ュ紓甯革紝璺宠浆鍒板紓甯告楠 */ - TP_TX_MSG.state = J1939_TP_TX_ERROR; - } - break; - case J1939_TP_TX_DT: - J1939_TP_DT_Packet_send(); - break; - case J1939_TP_WAIT_ACK: - /*绛夊緟TP.EndofMsgACK甯т紶杈撶殑娑堟伅*/ - if(J1939_TP_TIMEOUT_ABNORMAL == J1939_TP_TX_RefreshCMTimer(10)) - { - /* 绛夊緟瓒呮椂锛屽彂鐢熻繛鎺ュ紓甯革紝璺宠浆鍒板紓甯告楠 */ - TP_TX_MSG.state = J1939_TP_TX_ERROR; - } - break; - case J1939_TP_TX_ERROR: - J1939_TP_TX_Abort(); - - break; - case J1939_TX_DONE: - TP_TX_MSG.packets_request_num = 0; - TP_TX_MSG.packet_offset_p = 0; - TP_TX_MSG.time = J1939_TP_T3; - TP_TX_MSG.state = J1939_TP_TX_WAIT; - J1939_TP_Flags_t.state = J1939_TP_NULL; - break; - default: - //绋嬪簭涓嶄細杩愯鍒拌繖閲屾潵锛屽彲浠ュ鍔犱竴涓皟璇曡緭鍑 - break; - } - return ; - } + if (J1939_TP_Flags_t.state == J1939_TP_NULL || J1939_TP_Flags_t.state == J1939_TP_OSBUSY) { + return; + } + + if (J1939_TP_Flags_t.state == J1939_TP_RX) { + Can_Node = J1939_TP_Flags_t.TP_RX_CAN_NODE; + + switch (TP_RX_MSG.state) { + case J1939_TP_RX_WAIT: + ; + break; + + case J1939_TP_RX_READ_DATA: + /* 鍙戦佽鍙栨暟鎹 TP.CM_CTS 鍜 EndofMsgAck娑堟伅 */ + J1939_read_DT_Packet(); + break; + + case J1939_TP_RX_DATA_WAIT: + + /* 绛夊緟TP.DT甯т紶杈撶殑娑堟伅 */ + if (J1939_TP_TIMEOUT_ABNORMAL == J1939_TP_RX_RefreshCMTimer(10)) { + /* 绛夊緟瓒呮椂锛屽彂鐢熻繛鎺ュ紓甯革紝璺宠浆鍒板紓甯告楠 */ + TP_RX_MSG.state = J1939_TP_RX_ERROR; + } + + break; + + case J1939_TP_RX_ERROR: + J1939_TP_RX_Abort(); + J1939_TP_Flags_t.TP_RX_CAN_NODE = Select_CAN_NODE_Null; + break; + + case J1939_RX_DONE: + TP_RX_MSG.packets_ok_num = 0; + TP_RX_MSG.packets_total = 0; + TP_RX_MSG.time = J1939_TP_T3; + TP_RX_MSG.state = J1939_TP_RX_WAIT; + J1939_TP_Flags_t.state = J1939_TP_NULL; + break; + + default: + break; + } + + return; + } + + if (J1939_TP_Flags_t.state == J1939_TP_TX) { + Can_Node = J1939_TP_Flags_t.TP_TX_CAN_NODE; + + switch (TP_TX_MSG.state) { + case J1939_TP_TX_WAIT: + /* 娌℃湁瑕佸彂閫佺殑鏁版嵁 */ + break; + + case J1939_TP_TX_CM_START: + /* 鍙戦乀P.CM_RTS甯т紶杈撶殑娑堟伅(鍙傝僇1939-21) */ + J1939_CM_Start(); + break; + + case J1939_TP_TX_CM_WAIT: + + /* 绛夊緟TP.CM_CTS甯т紶杈撶殑娑堟伅 */ + if (J1939_TP_TIMEOUT_ABNORMAL == J1939_TP_TX_RefreshCMTimer(10)) { + /* 绛夊緟瓒呮椂锛屽彂鐢熻繛鎺ュ紓甯革紝璺宠浆鍒板紓甯告楠 */ + TP_TX_MSG.state = J1939_TP_TX_ERROR; + } + + break; + + case J1939_TP_TX_DT: + J1939_TP_DT_Packet_send(); + break; + + case J1939_TP_WAIT_ACK: + + /* 绛夊緟TP.EndofMsgACK甯т紶杈撶殑娑堟伅 */ + if (J1939_TP_TIMEOUT_ABNORMAL == J1939_TP_TX_RefreshCMTimer(10)) { + /* 绛夊緟瓒呮椂锛屽彂鐢熻繛鎺ュ紓甯革紝璺宠浆鍒板紓甯告楠 */ + TP_TX_MSG.state = J1939_TP_TX_ERROR; + } + + break; + + case J1939_TP_TX_ERROR: + J1939_TP_TX_Abort(); + + break; + + case J1939_TX_DONE: + TP_TX_MSG.packets_request_num = 0; + TP_TX_MSG.packet_offset_p = 0; + TP_TX_MSG.time = J1939_TP_T3; + TP_TX_MSG.state = J1939_TP_TX_WAIT; + J1939_TP_Flags_t.state = J1939_TP_NULL; + break; + + default: + /* 绋嬪簭涓嶄細杩愯鍒拌繖閲屾潵锛屽彲浠ュ鍔犱竴涓皟璇曡緭鍑 */ + break; + } + + return; + } } /**杩欐槸涓涓潪闃诲io鎺ュ彛 -* -* @param[in] PGN TP浼氳瘽鐨勫弬鏁扮兢缂栧彿 -* @param[in] SA TP浼氳瘽鐨勭洰鏍囧湴鍧 -* @param[in] *data TP浼氳瘽鐨勬暟鎹紦瀛樺湴鍧 -* @param[in] data_num TP浼氳瘽鐨勬暟鎹ぇ灏 -* @param[in] _Can_Node 瑕佸叆闃熺殑CAN纭欢缂栧彿锛堣閫夋嫨鐨勪娇鐢ㄧ殑CAN纭欢缂栧彿锛 -* @return RC_SUCCESS 鎴愬姛鎵撳紑TP閾炬帴锛屽紑濮嬭繘鍏ュ彂閫佹祦绋 -* @return RC_CANNOTTRANSMIT 涓嶈兘鍙戦侊紝鍥犱负TP鍗忚宸茬粡寤虹珛铏氭嫙閾炬帴锛屽苟涓旀湭鏂紑 -* @note TP鍗忚鐨勫彂閫佸嚱鏁 -*/ -j1939_int8_t J1939_TP_TX_Message(j1939_uint32_t PGN,j1939_uint8_t DA,j1939_uint8_t *data,j1939_uint16_t data_num, CAN_NODE _Can_Node) + * + * @param[in] PGN TP浼氳瘽鐨勫弬鏁扮兢缂栧彿 + * @param[in] SA TP浼氳瘽鐨勭洰鏍囧湴鍧 + * @param[in] *data TP浼氳瘽鐨勬暟鎹紦瀛樺湴鍧 + * @param[in] data_num TP浼氳瘽鐨勬暟鎹ぇ灏 + * @param[in] _Can_Node 瑕佸叆闃熺殑CAN纭欢缂栧彿锛堣閫夋嫨鐨勪娇鐢ㄧ殑CAN纭欢缂栧彿锛 + * @return RC_SUCCESS 鎴愬姛鎵撳紑TP閾炬帴锛屽紑濮嬭繘鍏ュ彂閫佹祦绋 + * @return RC_CANNOTTRANSMIT 涓嶈兘鍙戦侊紝鍥犱负TP鍗忚宸茬粡寤虹珛铏氭嫙閾炬帴锛屽苟涓旀湭鏂紑 + * @note TP鍗忚鐨勫彂閫佸嚱鏁 + */ +J1939_Status_t J1939_TP_TX_Message(j1939_uint32_t PGN, j1939_uint8_t DA, j1939_uint8_t *data, j1939_uint16_t data_num, + CAN_NODE_t _Can_Node) { - j1939_uint16_t _byte_count =0; - /*鍙栧緱鍙戦佹潈闄*/ - if(J1939_TP_Flags_t.state == J1939_TP_NULL) - { - J1939_TP_Flags_t.state = J1939_TP_TX; - J1939_TP_Flags_t.TP_TX_CAN_NODE = _Can_Node; - }else - { - return RC_CANNOTTRANSMIT;//涓嶈兘鍙戦侊紝鍥犱负TP鍗忚宸茬粡寤虹珛铏氭嫙閾炬帴锛屽苟涓旀湭鏂紑 - } - - TP_TX_MSG.tp_tx_msg.PGN = PGN; - TP_TX_MSG.tp_tx_msg.SA = DA; - TP_TX_MSG.tp_tx_msg.byte_count = data_num; - for(_byte_count = 0;_byte_count < data_num;_byte_count++) - { - TP_TX_MSG.tp_tx_msg.data[_byte_count] = data[_byte_count]; - } - TP_TX_MSG.packet_offset_p = 0; - TP_TX_MSG.packets_request_num = 0; - TP_TX_MSG.packets_total = data_num/7; - if((data_num%7) != 0) - { - TP_TX_MSG.packets_total ++; - } - TP_TX_MSG.time = J1939_TP_T3; - //瑙﹀彂寮濮婥M_START - TP_TX_MSG.state = J1939_TP_TX_CM_START; - - - return RC_SUCCESS; + j1939_uint16_t _byte_count = 0; + + /* 鍙栧緱鍙戦佹潈闄 */ + if (J1939_TP_Flags_t.state == J1939_TP_NULL) { + J1939_TP_Flags_t.state = J1939_TP_TX; + J1939_TP_Flags_t.TP_TX_CAN_NODE = _Can_Node; + } else { + return RC_CANNOTTRANSMIT; /* 涓嶈兘鍙戦侊紝鍥犱负TP鍗忚宸茬粡寤虹珛铏氭嫙閾炬帴锛屽苟涓旀湭鏂紑 */ + } + + TP_TX_MSG.tp_tx_msg.PGN = PGN; + TP_TX_MSG.tp_tx_msg.SA = DA; + TP_TX_MSG.tp_tx_msg.byte_count = data_num; + + for (_byte_count = 0; _byte_count < data_num; _byte_count++) { + TP_TX_MSG.tp_tx_msg.data[_byte_count] = data[_byte_count]; + } + + TP_TX_MSG.packet_offset_p = 0; + TP_TX_MSG.packets_request_num = 0; + TP_TX_MSG.packets_total = data_num / 7; + + if ((data_num % 7) != 0) { + TP_TX_MSG.packets_total++; + } + + TP_TX_MSG.time = J1939_TP_T3; + /* 瑙﹀彂寮濮婥M_START */ + TP_TX_MSG.state = J1939_TP_TX_CM_START; + + return RC_SUCCESS; } /** -* @param[in] msg.data 璇诲彇鏁版嵁鐨勭紦瀛 -* @param[in] msg.data_num 璇诲彇鏁版嵁鐨勭紦瀛樺ぇ灏 -* @param[in] _Can_Node 瑕佸叆闃熺殑CAN纭欢缂栧彿锛堣閫夋嫨鐨勪娇鐢ㄧ殑CAN纭欢缂栧彿锛 -* @param[out] msg.SA 鏁版嵁婧愬湴鍧 -* @param[out] msg.byte_count 鏁版嵁澶у皬 -* @param[out] msg.PGN 鏁版嵁鍙傛暟缇ょ紪鍙 -* @return RC_CANNOTRECEIVE 涓嶈兘鎺ュ彈锛孴P鍗忚姝e湪鎺ュ彈鏁版嵁涓 -* @return RC_SUCCESS 璇诲彇鏁版嵁鎴愬姛 -* @note TP鐨勬帴鍙楀嚱鏁 , 鎺ュ彈缂撳瓨鐨勫ぇ灏忓繀椤诲ぇ浜庢帴鍙楁暟鎹殑澶у皬锛屽缓璁垵濮嬪寲缂撳瓨澶у皬鐢 J1939_TP_MAX_MESSAGE_LENGTH\n - 璇锋纭甫鍏 缂撳瓨鍖虹殑澶у皬锛屽弬鏁伴敊璇▼搴忚繍琛屾湁椋庨櫓 -*/ -j1939_int8_t J1939_TP_RX_Message(TP_RX_MESSAGE *msg, CAN_NODE _Can_Node) + * @param[in] msg.data 璇诲彇鏁版嵁鐨勭紦瀛 + * @param[in] msg.data_num 璇诲彇鏁版嵁鐨勭紦瀛樺ぇ灏 + * @param[in] _Can_Node 瑕佸叆闃熺殑CAN纭欢缂栧彿锛堣閫夋嫨鐨勪娇鐢ㄧ殑CAN纭欢缂栧彿锛 + * @param[out] msg.SA 鏁版嵁婧愬湴鍧 + * @param[out] msg.byte_count 鏁版嵁澶у皬 + * @param[out] msg.PGN 鏁版嵁鍙傛暟缇ょ紪鍙 + * @return RC_CANNOTRECEIVE 涓嶈兘鎺ュ彈锛孴P鍗忚姝e湪鎺ュ彈鏁版嵁涓 + * @return RC_SUCCESS 璇诲彇鏁版嵁鎴愬姛 + * @note TP鐨勬帴鍙楀嚱鏁 , 鎺ュ彈缂撳瓨鐨勫ぇ灏忓繀椤诲ぇ浜庢帴鍙楁暟鎹殑澶у皬锛屽缓璁垵濮嬪寲缂撳瓨澶у皬鐢 J1939_TP_MAX_MESSAGE_LENGTH\n + 璇锋纭甫鍏 缂撳瓨鍖虹殑澶у皬锛屽弬鏁伴敊璇▼搴忚繍琛屾湁椋庨櫓 + */ +J1939_Status_t J1939_TP_RX_Message(TP_RX_MESSAGE_t *msg, CAN_NODE_t _Can_Node) { - j1939_uint16_t _a = 0; - /*鍒ゆ柇鏄惁鑳借鍙栨暟鎹*/ - if(J1939_TP_Flags_t.state == J1939_TP_NULL && TP_RX_MSG.tp_rx_msg.PGN != 0) - { - J1939_TP_Flags_t.state = J1939_TP_OSBUSY; - }else - { - return RC_CANNOTRECEIVE;//涓嶈兘鎺ュ彈锛孴P鍗忚姝e湪鎺ュ彈鏁版嵁涓,鎴栨病鏈夋暟鎹 - } - //鍒ゆ柇鏄笉鏄璇诲彇閭d竴璺疌AN鏁版嵁 - if(_Can_Node != J1939_TP_Flags_t.TP_RX_CAN_NODE) - { - /*閲婃斁TP鎺ョ鏉冮檺*/ - if(J1939_TP_Flags_t.state == J1939_TP_OSBUSY) - { + j1939_uint16_t _a = 0; + + /* 鍒ゆ柇鏄惁鑳借鍙栨暟鎹 */ + if (J1939_TP_Flags_t.state == J1939_TP_NULL && TP_RX_MSG.tp_rx_msg.PGN != 0) { + J1939_TP_Flags_t.state = J1939_TP_OSBUSY; + } else { + return RC_CANNOTRECEIVE; /* 涓嶈兘鎺ュ彈锛孴P鍗忚姝e湪鎺ュ彈鏁版嵁涓,鎴栨病鏈夋暟鎹 */ + } + + /* 鍒ゆ柇鏄笉鏄璇诲彇閭d竴璺疌AN鏁版嵁 */ + if (_Can_Node != J1939_TP_Flags_t.TP_RX_CAN_NODE) { + /* 閲婃斁TP鎺ョ鏉冮檺 */ + if (J1939_TP_Flags_t.state == J1939_TP_OSBUSY) { J1939_TP_Flags_t.state = J1939_TP_NULL; } - return RC_CANNOTRECEIVE; - } - //鍒ゆ柇鏁版嵁缂撳瓨澶熶笉澶 - if((msg->data_num) < TP_RX_MSG.tp_rx_msg.byte_count) - { - return RC_CANNOTRECEIVE;//涓嶈兘鎺ュ彈锛岀紦瀛樺尯澶皬 - } - - /*鑾峰彇鏁版嵁*/ - for(_a = 0;_a < msg->data_num;_a++) - { + + return RC_CANNOTRECEIVE; + } + + /* 鍒ゆ柇鏁版嵁缂撳瓨澶熶笉澶 */ + if ((msg->data_num) < TP_RX_MSG.tp_rx_msg.byte_count) { + return RC_CANNOTRECEIVE; /* 涓嶈兘鎺ュ彈锛岀紦瀛樺尯澶皬 */ + } + + /* 鑾峰彇鏁版嵁 */ + for (_a = 0; _a < msg->data_num; _a++) { msg->data[_a] = TP_RX_MSG.tp_rx_msg.data[_a]; - } - /*鑾峰彇鏁版嵁 婧愬湴鍧*/ - msg->SA = TP_RX_MSG.tp_rx_msg.SA; - /*鑾峰彇鏁版嵁鐨勫ぇ灏*/ - msg->byte_count = TP_RX_MSG.tp_rx_msg.byte_count; - /*鑾峰彇鏁版嵁PGN*/ - msg->PGN = TP_RX_MSG.tp_rx_msg.PGN; - - /*涓㈠純璇诲彇杩囩殑鏁版嵁*/ - TP_RX_MSG.tp_rx_msg.byte_count= 0u; - TP_RX_MSG.tp_rx_msg.PGN = 0; - - /*閲婃斁TP鎺ョ鏉冮檺*/ - if(J1939_TP_Flags_t.state == J1939_TP_OSBUSY) - { - J1939_TP_Flags_t.state = J1939_TP_NULL; - } - - return RC_SUCCESS; + } + + /* 鑾峰彇鏁版嵁 婧愬湴鍧 */ + msg->SA = TP_RX_MSG.tp_rx_msg.SA; + /* 鑾峰彇鏁版嵁鐨勫ぇ灏 */ + msg->byte_count = TP_RX_MSG.tp_rx_msg.byte_count; + /* 鑾峰彇鏁版嵁PGN */ + msg->PGN = TP_RX_MSG.tp_rx_msg.PGN; + + /* 涓㈠純璇诲彇杩囩殑鏁版嵁 */ + TP_RX_MSG.tp_rx_msg.byte_count = 0u; + TP_RX_MSG.tp_rx_msg.PGN = 0; + + /* 閲婃斁TP鎺ョ鏉冮檺 */ + if (J1939_TP_Flags_t.state == J1939_TP_OSBUSY) { + J1939_TP_Flags_t.state = J1939_TP_NULL; + } + + return RC_SUCCESS; } + /** -* @param[in] pgn 琚姹傜殑鍙傛暟缇 -* @param[in] DA 鐩爣鍦板潃锛圖estinationAddress锛 褰揇A = 0xff琛ㄧず鏄叏灞璇锋眰 -* @param[in] _Can_Node 瑕佸叆闃熺殑CAN纭欢缂栧彿锛堣閫夋嫨鐨勪娇鐢ㄧ殑CAN纭欢缂栧彿锛 -* @note 璇锋眰锛堜粠鍏ㄥ眬鑼冨洿鎴栧垯鐗瑰畾鐩殑鍦扮殑锛夊弬鏁扮兢锛岃姹傝鍒橨1939-21鐨16-17椤碉紝鏈夋槑纭殑璇存槑 -*/ -void J1939_Request_PGN(j1939_uint32_t pgn ,j1939_uint8_t DA, CAN_NODE _Can_Node) + * @param[in] pgn 琚姹傜殑鍙傛暟缇 + * @param[in] DA 鐩爣鍦板潃锛圖estinationAddress锛 褰揇A = 0xff琛ㄧず鏄叏灞璇锋眰 + * @param[in] _Can_Node 瑕佸叆闃熺殑CAN纭欢缂栧彿锛堣閫夋嫨鐨勪娇鐢ㄧ殑CAN纭欢缂栧彿锛 + * @note 璇锋眰锛堜粠鍏ㄥ眬鑼冨洿鎴栧垯鐗瑰畾鐩殑鍦扮殑锛夊弬鏁扮兢锛岃姹傝鍒橨1939-21鐨16-17椤碉紝鏈夋槑纭殑璇存槑 + */ +void J1939_Request_PGN(j1939_uint32_t PGN, j1939_uint8_t DA, CAN_NODE_t _Can_Node) { - J1939_MESSAGE _msg; - - _msg.Mxe.DataPage = 0; - _msg.Mxe.Priority = J1939_REQUEST_PRIORITY; - _msg.Mxe.DestinationAddress = DA; - _msg.Mxe.DataLength = 3; - _msg.Mxe.PDUFormat = J1939_PF_REQUEST; - _msg.Mxe.Data[0] = (j1939_uint8_t)(pgn & 0x000000FF); - _msg.Mxe.Data[1] = (j1939_uint8_t)((pgn & 0x0000FF00) >> 8); - _msg.Mxe.Data[2] = (j1939_uint8_t)((pgn & 0x00FF0000) >> 16); - - while (J1939_EnqueueMessage( &_msg, _Can_Node) != RC_SUCCESS); + J1939_MESSAGE_t _msg; + + _msg.Mxe.DataPage = 0; + _msg.Mxe.Priority = J1939_PRIORITY_REQUEST; + _msg.Mxe.DestinationAddress = DA; + _msg.Mxe.DataLength = 3; + _msg.Mxe.PDUFormat = J1939_PF_REQUEST; + _msg.Mxe.Data[0] = (j1939_uint8_t) (PGN & 0x000000FF); + _msg.Mxe.Data[1] = (j1939_uint8_t) ((PGN & 0x0000FF00) >> 8); + _msg.Mxe.Data[2] = (j1939_uint8_t) ((PGN & 0x00FF0000) >> 16); + + while (J1939_EnqueueMessage(&_msg, _Can_Node) != RC_SUCCESS); } + /** -* @param[in] data 闇瑕佸彂閫佹暟鎹殑缂撳瓨 -* @param[in] dataLenght 鍙戦佹暟鎹殑缂撳瓨澶у皬 -* @param[in] PGN 闇瑕佸彂閫佹暟鎹殑PGN(鍙傛暟缇ょ紪鍙) -* @param[in] void (*dataUPFun)() 鐢ㄤ簬鏇存柊缂撳瓨data 鐨勫嚱鏁板湴鍧鎸囬拡 -* @param[in] _Can_Node 瑕佸叆闃熺殑CAN纭欢缂栧彿锛堣閫夋嫨鐨勪娇鐢ㄧ殑CAN纭欢缂栧彿锛 -* @note 鍒涘缓涓涓狿GN 鐨 璇锋眰 瀵瑰簲鐨 鍝嶅簲\n 濡傛灉鏀跺埌鏀硅姹傚垯鍏堣繍琛 REQUEST_LIST.dataUPFun(),鍦ㄥ皢鏁版嵁REQUEST_LIST.data鍙戦佸嚭鍘 -* @warning 鏈嚱鏁板彧鑳借涓茶璋冪敤锛岋紙澶氱嚎绋嬶級骞惰璋冪敤璇峰湪鍑芥暟澶栧姞浜掓枼鎿嶄綔 -*/ -void J1939_Create_Response(j1939_uint8_t data[],j1939_uint16_t dataLenght,j1939_uint32_t PGN,void (*dataUPFun)(),CAN_NODE _Can_Node) + * @param[in] data 闇瑕佸彂閫佹暟鎹殑缂撳瓨 + * @param[in] dataLength 鍙戦佹暟鎹殑缂撳瓨澶у皬 + * @param[in] PGN 闇瑕佸彂閫佹暟鎹殑PGN(鍙傛暟缇ょ紪鍙) + * @param[in] void (*dataUPFun)() 鐢ㄤ簬鏇存柊缂撳瓨data 鐨勫嚱鏁板湴鍧鎸囬拡 + * @param[in] _Can_Node 瑕佸叆闃熺殑CAN纭欢缂栧彿锛堣閫夋嫨鐨勪娇鐢ㄧ殑CAN纭欢缂栧彿锛 + * @note 鍒涘缓涓涓狿GN 鐨 璇锋眰 瀵瑰簲鐨 鍝嶅簲\n 濡傛灉鏀跺埌鏀硅姹傚垯鍏堣繍琛 REQUEST_LIST.dataUPFun(),鍦ㄥ皢鏁版嵁REQUEST_LIST.data鍙戦佸嚭鍘 + * @warning 鏈嚱鏁板彧鑳借涓茶璋冪敤锛岋紙澶氱嚎绋嬶級骞惰璋冪敤璇峰湪鍑芥暟澶栧姞浜掓枼鎿嶄綔 + */ +void J1939_Create_Response(j1939_uint8_t data[], j1939_uint16_t dataLength, j1939_uint32_t PGN, void (*dataUPFun)(), + CAN_NODE_t _Can_Node) { - /*鏌ユ壘鍙敤鐨勯摼琛ㄩ」*/ - struct Request_List * _requestList = &REQUEST_LIST; - while(J1939_NULL != _requestList->next) - { - _requestList = _requestList->next; - } - _requestList->next = (struct Request_List *)malloc(sizeof(struct Request_List)); - _requestList = _requestList->next; - - /*瀵规柊鐨勯摼琛ㄩ」璧嬪*/ - _requestList->data = data; - _requestList->lenght = dataLenght; - _requestList->PGN = PGN; - _requestList->update = dataUPFun; + /* 鏌ユ壘鍙敤鐨勯摼琛ㄩ」 */ + struct RequestList *_requestList = &REQUEST_LIST; + + while (J1939_NULL != _requestList->next) { + _requestList = _requestList->next; + } + + _requestList->next = (struct RequestList *) malloc(sizeof(struct RequestList)); + _requestList = _requestList->next; + + /* 瀵规柊鐨勯摼琛ㄩ」璧嬪 */ + _requestList->data = data; + _requestList->length = dataLength; + _requestList->PGN = PGN; + _requestList->update = dataUPFun; _requestList->Can_Node = _Can_Node; - _requestList->next = J1939_NULL; + _requestList->next = J1939_NULL; } + /** -* @note 褰撴敹鍒颁竴涓狿GN璇锋眰鍚庯紝濡傛灉鏈塕EQUEST_LIST涓湁鐩稿簲鐨凱GN锛屽垯浼氳嚜鍔ㄥ彂閫丷EQUEST_LIST涓殑PGN銆俓n - 濡傛灉娌℃湁鍒欎細鍙戦佷竴涓狽ACK; 鏈嚱鏁扮殑鍝嶅簲閫昏緫锛屽弬鑰僇1939-21 17椤佃〃4 -*/ -void J1939_Response(const j1939_uint32_t PGN) + * @note 褰撴敹鍒颁竴涓狿GN璇锋眰鍚庯紝濡傛灉鏈塕EQUEST_LIST涓湁鐩稿簲鐨凱GN锛屽垯浼氳嚜鍔ㄥ彂閫丷EQUEST_LIST涓殑PGN銆俓n + 濡傛灉娌℃湁鍒欎細鍙戦佷竴涓狽ACK; 鏈嚱鏁扮殑鍝嶅簲閫昏緫锛屽弬鑰僇1939-21 17椤佃〃4 + */ +static void J1939_Response(const j1939_uint32_t PGN) { - J1939_MESSAGE _msg; - - /*鏌ユ壘鍙敤鐨勯摼琛ㄩ」*/ - struct Request_List * _requestList = &REQUEST_LIST; - while((PGN != _requestList->PGN) || (Can_Node != _requestList->Can_Node)) - { - if(_requestList->next == J1939_NULL) - { - /*鍘熸枃妗h瀹 鍏ㄥ眬璇锋眰涓嶈鏀寔鏃朵笉鑳藉搷搴 NACK*/ - if(OneMessage.Mxe.PDUSpecific == J1939_GLOBAL_ADDRESS) - { - return; - } - if((PGN & 0xFF00) >= 0xF000) - { - return; - } - - /*娌℃湁鐩稿簲鐨凱GN鍝嶅簲琚垱寤猴紝鍚戞荤嚎鍙戦佷竴涓狽ACK*/ - _msg.Mxe.Priority = J1939_ACK_PRIORITY; - _msg.Mxe.DataPage = 0; - _msg.Mxe.PDUFormat = J1939_PF_ACKNOWLEDGMENT; - _msg.Mxe.DestinationAddress = OneMessage.Mxe.SourceAddress; - _msg.Mxe.DataLength = 8; - _msg.Mxe.SourceAddress = J1939_Address; - _msg.Mxe.Data[0] = J1939_NACK_CONTROL_BYTE; - _msg.Mxe.Data[1] = 0xFF; - _msg.Mxe.Data[2] = 0xFF; - _msg.Mxe.Data[3] = 0xFF; - _msg.Mxe.Data[4] = 0xFF; - _msg.Mxe.Data[5] = (PGN & 0x0000FF); - _msg.Mxe.Data[6] = ((PGN >> 8) & 0x0000FF); - _msg.Mxe.Data[7] = ((PGN >> 16) & 0x0000FF); - - SendOneMessage( (J1939_MESSAGE *) &_msg); - return ; - }else - { - _requestList = _requestList->next; - } - } - - /*璋冪敤dataUPFun锛堬級鍑芥暟锛屼富瑕佺敤浜庡弬鏁扮兢鏁版嵁鏇存柊*/ - if(J1939_NULL != _requestList->update) - { - _requestList->update(); - } - - /*鍝嶅簲璇锋眰*/ - if(_requestList->lenght > 8) - { - /*鍥炰竴涓‘璁ゅ搷搴斿甯(闈炲箍鎾甯)*/ - if(RC_SUCCESS != J1939_TP_TX_Message(_requestList->PGN,OneMessage.Mxe.SourceAddress,_requestList->data,_requestList->lenght,Can_Node)) - { - /*鍘熸枃妗h瀹 鍏ㄥ眬璇锋眰涓嶈鏀寔鏃朵笉鑳藉搷搴 NACK*/ - if(OneMessage.Mxe.PDUSpecific == J1939_GLOBAL_ADDRESS) - { - return; - } - - /*濡傛灉闀垮抚鍙戦佷笉鎴愬姛*/ - _msg.Mxe.Priority = J1939_ACK_PRIORITY; - _msg.Mxe.DataPage = 0; - _msg.Mxe.PDUFormat = J1939_PF_ACKNOWLEDGMENT; - _msg.Mxe.DestinationAddress = OneMessage.Mxe.SourceAddress; - _msg.Mxe.DataLength = 8; - _msg.Mxe.SourceAddress = J1939_Address; - _msg.Mxe.Data[0] = J1939_ACCESS_DENIED_CONTROL_BYTE; - _msg.Mxe.Data[1] = 0xFF; - _msg.Mxe.Data[2] = 0xFF; - _msg.Mxe.Data[3] = 0xFF; - _msg.Mxe.Data[4] = 0xFF; - _msg.Mxe.Data[5] = (PGN & 0x0000FF); - _msg.Mxe.Data[6] = ((PGN >> 8) & 0x0000FF); - _msg.Mxe.Data[7] = ((PGN >> 16) & 0x0000FF); - - SendOneMessage( (J1939_MESSAGE *) &_msg); - return ; - } - - /*鍥炰竴涓‘璁ゅ搷搴*/ - _msg.Mxe.Priority = J1939_ACK_PRIORITY; - _msg.Mxe.DataPage = 0; - _msg.Mxe.PDUFormat = J1939_PF_ACKNOWLEDGMENT; - /*鍘熸枃妗h瀹 鍏ㄥ眬璇锋眰鍝嶅簲鍒板叏灞*/ - if(OneMessage.Mxe.PDUSpecific == J1939_GLOBAL_ADDRESS) - { - _msg.Mxe.DestinationAddress = 0XFF; - }else{ - _msg.Mxe.DestinationAddress = OneMessage.Mxe.SourceAddress; - } - _msg.Mxe.DataLength = 8; - _msg.Mxe.SourceAddress = J1939_Address; - _msg.Mxe.Data[0] = J1939_ACK_CONTROL_BYTE; - _msg.Mxe.Data[1] = 0xFF; - _msg.Mxe.Data[2] = 0xFF; - _msg.Mxe.Data[3] = 0xFF; - _msg.Mxe.Data[4] = 0xFF; - _msg.Mxe.Data[5] = (PGN & 0x0000FF); - _msg.Mxe.Data[6] = ((PGN >> 8) & 0x0000FF); - _msg.Mxe.Data[7] = ((PGN >> 16) & 0x0000FF); - SendOneMessage( (J1939_MESSAGE *) &_msg); - }else{ - - /*鍥炰竴涓‘璁ゅ搷搴*/ - _msg.Mxe.Priority = J1939_ACK_PRIORITY; - _msg.Mxe.DataPage = 0; - _msg.Mxe.PDUFormat = J1939_PF_ACKNOWLEDGMENT; - _msg.Mxe.SourceAddress = J1939_Address; - /*鍘熸枃妗h瀹 鍏ㄥ眬璇锋眰鍝嶅簲鍒板叏灞*/ - if((OneMessage.Mxe.PDUSpecific == J1939_GLOBAL_ADDRESS) || ((PGN & 0xFF00) >= 0xF000)) - { - _msg.Mxe.DestinationAddress = 0XFF; - }else{ - _msg.Mxe.DestinationAddress = OneMessage.Mxe.SourceAddress; - } - _msg.Mxe.DataLength = 8; - _msg.Mxe.SourceAddress = J1939_Address; - _msg.Mxe.Data[0] = J1939_ACK_CONTROL_BYTE; - _msg.Mxe.Data[1] = 0xFF; - _msg.Mxe.Data[2] = 0xFF; - _msg.Mxe.Data[3] = 0xFF; - _msg.Mxe.Data[4] = 0xFF; - _msg.Mxe.Data[5] = (PGN & 0x0000FF); - _msg.Mxe.Data[6] = ((PGN >> 8) & 0x0000FF); - _msg.Mxe.Data[7] = ((PGN >> 16) & 0x0000FF); - SendOneMessage( (J1939_MESSAGE *) &_msg); - - /*鍥炰竴涓‘璁ゅ搷搴斿崟甯*/ - _msg.Mxe.Priority = J1939_ACK_PRIORITY; - _msg.Mxe.DataPage = (((_requestList->PGN)>>16) & 0x1); - _msg.Mxe.PDUFormat = ((_requestList->PGN)>>8) & 0xFF; - _msg.Mxe.SourceAddress = J1939_Address; - /*鍘熸枃妗h瀹 鍏ㄥ眬璇锋眰鍝嶅簲鍒板叏灞*/ - if(OneMessage.Mxe.PDUSpecific == J1939_GLOBAL_ADDRESS) - { - _msg.Mxe.DestinationAddress = 0XFF; - }else{ - _msg.Mxe.DestinationAddress = OneMessage.Mxe.SourceAddress; - } - _msg.Mxe.DataLength = _requestList->lenght; - { - j1939_uint8_t _i = 0; - for(_i = 0;_i < (_requestList->lenght);_i++) - { - _msg.Mxe.Data[_i] = _requestList->data[_i]; - } - for(;_i<8;_i++) - { - _msg.Mxe.Data[_i] = 0xFF; - } - } - SendOneMessage( (J1939_MESSAGE *) &_msg); - } + J1939_MESSAGE_t _msg; + + /* 鏌ユ壘鍙敤鐨勯摼琛ㄩ」 */ + struct RequestList *_requestList = &REQUEST_LIST; + + while ((PGN != _requestList->PGN) || (Can_Node != _requestList->Can_Node)) { + if (_requestList->next == J1939_NULL) { + /* 鍘熸枃妗h瀹 鍏ㄥ眬璇锋眰涓嶈鏀寔鏃朵笉鑳藉搷搴 NACK */ + if (OneMessage.Mxe.PDUSpecific == J1939_PS_DA_GLOBAL) { + return; + } + + if ((PGN & 0xFF00) >= 0xF000) { + return; + } + + /* 娌℃湁鐩稿簲鐨凱GN鍝嶅簲琚垱寤猴紝鍚戞荤嚎鍙戦佷竴涓狽ACK */ + _msg.Mxe.Priority = J1939_PRIORITY_ACK; + _msg.Mxe.DataPage = 0; + _msg.Mxe.PDUFormat = J1939_PF_ACKNOWLEDGMENT; + _msg.Mxe.DestinationAddress = OneMessage.Mxe.SourceAddress; + _msg.Mxe.DataLength = 8; + _msg.Mxe.SourceAddress = J1939_Address; + _msg.Mxe.Data[0] = J1939_CONTROL_BYTE_NACK; + _msg.Mxe.Data[1] = 0xFF; + _msg.Mxe.Data[2] = 0xFF; + _msg.Mxe.Data[3] = 0xFF; + _msg.Mxe.Data[4] = 0xFF; + _msg.Mxe.Data[5] = (PGN & 0x0000FF); + _msg.Mxe.Data[6] = ((PGN >> 8) & 0x0000FF); + _msg.Mxe.Data[7] = ((PGN >> 16) & 0x0000FF); + + SendOneMessage((J1939_MESSAGE_t *) &_msg); + return; + } else { + _requestList = _requestList->next; + } + } + + /* 璋冪敤dataUPFun()鍑芥暟锛屼富瑕佺敤浜庡弬鏁扮兢鏁版嵁鏇存柊 */ + if (J1939_NULL != _requestList->update) { + _requestList->update(); + } + + /* 鍝嶅簲璇锋眰 */ + if (_requestList->length > 8) { + /* 鍥炰竴涓‘璁ゅ搷搴斿甯(闈炲箍鎾甯) */ + if (RC_SUCCESS + != J1939_TP_TX_Message(_requestList->PGN, OneMessage.Mxe.SourceAddress, _requestList->data, + _requestList->length, Can_Node)) { + /* 鍘熸枃妗h瀹 鍏ㄥ眬璇锋眰涓嶈鏀寔鏃朵笉鑳藉搷搴 NACK */ + if (OneMessage.Mxe.PDUSpecific == J1939_PS_DA_GLOBAL) { + return; + } + + /* 濡傛灉闀垮抚鍙戦佷笉鎴愬姛 */ + _msg.Mxe.Priority = J1939_PRIORITY_ACK; + _msg.Mxe.DataPage = 0; + _msg.Mxe.PDUFormat = J1939_PF_ACKNOWLEDGMENT; + _msg.Mxe.DestinationAddress = OneMessage.Mxe.SourceAddress; + _msg.Mxe.DataLength = 8; + _msg.Mxe.SourceAddress = J1939_Address; + _msg.Mxe.Data[0] = J1939_CONTROL_BYTE_ACCESS_DENIED; + _msg.Mxe.Data[1] = 0xFF; + _msg.Mxe.Data[2] = 0xFF; + _msg.Mxe.Data[3] = 0xFF; + _msg.Mxe.Data[4] = 0xFF; + _msg.Mxe.Data[5] = (PGN & 0x0000FF); + _msg.Mxe.Data[6] = ((PGN >> 8) & 0x0000FF); + _msg.Mxe.Data[7] = ((PGN >> 16) & 0x0000FF); + + SendOneMessage((J1939_MESSAGE_t *) &_msg); + return; + } + + /* 鍥炰竴涓‘璁ゅ搷搴 */ + _msg.Mxe.Priority = J1939_PRIORITY_ACK; + _msg.Mxe.DataPage = 0; + _msg.Mxe.PDUFormat = J1939_PF_ACKNOWLEDGMENT; + + /* 鍘熸枃妗h瀹 鍏ㄥ眬璇锋眰鍝嶅簲鍒板叏灞 */ + if (OneMessage.Mxe.PDUSpecific == J1939_PS_DA_GLOBAL) { + _msg.Mxe.DestinationAddress = 0XFF; + } else { + _msg.Mxe.DestinationAddress = OneMessage.Mxe.SourceAddress; + } + + _msg.Mxe.DataLength = 8; + _msg.Mxe.SourceAddress = J1939_Address; + _msg.Mxe.Data[0] = J1939_CONTROL_BYTE_ACK; + _msg.Mxe.Data[1] = 0xFF; + _msg.Mxe.Data[2] = 0xFF; + _msg.Mxe.Data[3] = 0xFF; + _msg.Mxe.Data[4] = 0xFF; + _msg.Mxe.Data[5] = (PGN & 0x0000FF); + _msg.Mxe.Data[6] = ((PGN >> 8) & 0x0000FF); + _msg.Mxe.Data[7] = ((PGN >> 16) & 0x0000FF); + SendOneMessage((J1939_MESSAGE_t *) &_msg); + } else { + + /* 鍥炰竴涓‘璁ゅ搷搴 */ + _msg.Mxe.Priority = J1939_PRIORITY_ACK; + _msg.Mxe.DataPage = 0; + _msg.Mxe.PDUFormat = J1939_PF_ACKNOWLEDGMENT; + _msg.Mxe.SourceAddress = J1939_Address; + + /* 鍘熸枃妗h瀹 鍏ㄥ眬璇锋眰鍝嶅簲鍒板叏灞 */ + if ((OneMessage.Mxe.PDUSpecific == J1939_PS_DA_GLOBAL) || ((PGN & 0xFF00) >= 0xF000)) { + _msg.Mxe.DestinationAddress = 0XFF; + } else { + _msg.Mxe.DestinationAddress = OneMessage.Mxe.SourceAddress; + } + + _msg.Mxe.DataLength = 8; + _msg.Mxe.SourceAddress = J1939_Address; + _msg.Mxe.Data[0] = J1939_CONTROL_BYTE_ACK; + _msg.Mxe.Data[1] = 0xFF; + _msg.Mxe.Data[2] = 0xFF; + _msg.Mxe.Data[3] = 0xFF; + _msg.Mxe.Data[4] = 0xFF; + _msg.Mxe.Data[5] = (PGN & 0x0000FF); + _msg.Mxe.Data[6] = ((PGN >> 8) & 0x0000FF); + _msg.Mxe.Data[7] = ((PGN >> 16) & 0x0000FF); + SendOneMessage((J1939_MESSAGE_t *) &_msg); + + /* 鍥炰竴涓‘璁ゅ搷搴斿崟甯 */ + _msg.Mxe.Priority = J1939_PRIORITY_ACK; + _msg.Mxe.DataPage = (((_requestList->PGN) >> 16) & 0x1); + _msg.Mxe.PDUFormat = ((_requestList->PGN) >> 8) & 0xFF; + _msg.Mxe.SourceAddress = J1939_Address; + + /* 鍘熸枃妗h瀹 鍏ㄥ眬璇锋眰鍝嶅簲鍒板叏灞 */ + if (OneMessage.Mxe.PDUSpecific == J1939_PS_DA_GLOBAL) { + _msg.Mxe.DestinationAddress = 0XFF; + } else { + _msg.Mxe.DestinationAddress = OneMessage.Mxe.SourceAddress; + } + + _msg.Mxe.DataLength = _requestList->length; + { + j1939_uint8_t _i = 0; + + for (_i = 0; _i < (_requestList->length); _i++) { + _msg.Mxe.Data[_i] = _requestList->data[_i]; + } + + for (; _i < 8; _i++) { + _msg.Mxe.Data[_i] = 0xFF; + } + } + SendOneMessage((J1939_MESSAGE_t *) &_msg); + } } #endif diff --git a/source/J1939_Config.H b/source/J1939_Config.H index 69eb51e..81643a1 100644 --- a/source/J1939_Config.H +++ b/source/J1939_Config.H @@ -1,322 +1,60 @@ -锘/********************************************************************* - * - * J1939 Main Source Code - * - ********************************************************************* - * - * 鏈▼搴忔槸鐢盭ieTongXueFlyMe瀵圭幇鏈夌殑J1939鍗忚鏂囨。鍒嗘瀽锛屽拰瀵瑰墠杈堢殑璐$尞鎬荤粨, - * 鍐欏嚭鐨勪竴濂楀紑婧愮殑J1939椹卞姩銆 - * 鏈崗璁壒鐐癸細 - * 1.鏄撶Щ妞嶏紙涓嶉拡瀵圭壒瀹氱殑CAN纭欢锛屽彧瑕佹弧瓒矯AN2.0B鍗冲彲锛 - * 2.杞婚噺绾э紙鍙傚簲浣庣鐨凪CU锛 - * 3.鏀寔澶氫换鍔¤皟鐢ㄦ帴鍙o紙鍙敤浜庡祵鍏ュ紡绯荤粺锛 - * 4.鍙屾ā寮忥紙杞鎴栬呬腑鏂紝閫昏緫鏇村姞绠鍗曟槑浜嗭級 - * 5.涓嶆帀甯э紙鏁版嵁閲囩敤鏀跺彂鍒楅槦缂撳瓨锛 - * - * 婧愪唬鐮佷笅杞斤細 - * https://github.com/XeiTongXueFlyMe/J1939 - * 婧愪唬鐮佷复鏃舵墜鍐學eb绔欑偣锛 - * https://xeitongxueflyme.github.io/j1939doc.github.io/ - * - * Version Date Description - * ------------------------------------------------------------------- - * v1.0.0 2017/06/04 棣栦釜鐗堟湰 Version 1 娴嬭瘯鐗堝彂甯 - * v1.0.1 2017/08/04 瀹屽杽鍔熻兘 - * v1.1.0 2017/11/22 Version 1 绋冲畾鍙戝竷鐗 - * v2.0.1 2017/11/24 Version 2 娴嬭瘯鐗堝彂甯 - * v2.0.2 2018/01/03 瑙e喅V2.0.1 閬楃暀闂 - * v2.1.0 2018/01/20 Version 2 绋冲畾鍙戝竷鐗 - * Author Date changes - *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - *XeiTongXueFlyMe 7/06/04 棣栦釜鐗堟湰 - *XeiTongXueFlyMe 7/08/04 澧炲姞瀵筎P鐨勬敮鎸 - *XeiTongXueFlyMe 7/11/24 澧炲姞瀵瑰璺疌AN纭欢鐨勬敹鍙戯紝鍜屾姤鏂囧鐞 - *XeiTongXueFlyMe 7/11/29 澧炲姞璇锋眰鍜屽搷搴擜PI - *XeiTongXueFlyMe 7/12/07 閲嶅仛TP鎺ュ彈API鍑芥暟 - *XeiTongXueFlyMe 7/12/08 澧炲姞杞欢婊ゆ尝鍣 - *XeiTongXueFlyMe 8/01/03 閲嶅仛鎺ュ彈鍙戦丄PI锛岀畝鍖栧崗璁爤鍒濆鍖栬皟鐢ㄩ昏緫 - **********************************************************************/ +锘#ifndef __J1939_Config_H +#define __J1939_Config_H -#ifndef __J1939_Config_H -#define __J1939_Config_H +#include "J1939.h" -#include "J1939.H" -extern CAN_NODE Can_Node; //CAN纭欢閫夋嫨 +/******************************J1939鍔熻兘閰嶇疆******************************/ +#define J1939_NODE_NUM 4 +#define J1939_RX_QUEUE_SIZE 3 +/* 褰揗CU鏉ヤ笉鍙婂鐞嗘秷鎭紝鎺ユ敹娑堟伅闃熷垪鏄惁鍏佽琚柊鐨勬秷鎭鐩 */ +#define J1939_OVERWRITE_RX_QUEUE J1939_FALSE -/***************************J1939 鍦板潃閰嶇疆*****************************/ -//璁惧榛樿鐨勫湴鍧锛堝湴鍧鍛藉悕鏄湁瑙勫畾鐨勶紝鍙傝僇1939鐨勯檮褰旴 鍦板潃鍜屾爣璇嗙鐨勫垎閰嶏級 -#define J1939_STARTING_ADDRESS_1 0x01 -#define J1939_STARTING_ADDRESS_2 244 -#define J1939_STARTING_ADDRESS_3 247 -#define J1939_STARTING_ADDRESS_4 0 +#define J1939_TX_QUEUE_SIZE 3 +/* 褰揗CU鏉ヤ笉鍙婂鐞嗘秷鎭紝鍙戦佹秷鎭槦鍒楁槸鍚﹀厑璁歌鏂扮殑娑堟伅瑕嗙洊 */ +#define J1939_OVERWRITE_TX_QUEUE J1939_FALSE +/* 鏄惁浣跨敤杞妯″紡锛堝惁鍒欎娇鐢ㄤ腑鏂ā寮忥級 */ +#define J1939_POLL_ECAN J1939_TRUE +/* 鏄惁鍚敤杞欢婊ゆ尝鍣 */ +#define J1939SoftwareFilterEn J1939_TRUE -/******************************J1939鍔熻兘閰嶇疆***************************/ -#define J1939_RX_QUEUE_SIZE 3 -//褰搈cu鏉ヤ笉鍙婂鐞嗘秷鎭紝鎺ユ敹娑堟伅鍒楅槦鏄惁鍏佽琚柊鐨勬秷鎭鐩 -#define J1939_OVERWRITE_RX_QUEUE J1939_FALSE -#define J1939_TX_QUEUE_SIZE 3 -//褰搈cu鏉ヤ笉鍙婂鐞嗘秷鎭紝鍙戦佹秷鎭垪闃熸槸鍚﹀厑璁歌鏂扮殑娑堟伅瑕嗙洊 -#define J1939_OVERWRITE_TX_QUEUE J1939_FALSE -//鏄惁浣跨敤杞妯″紡锛堝惁鍒欎娇鐢ㄤ腑鏂ā寮忥級 -#define J1939_POLL_ECAN J1939_TRUE -//鏄惁鍚敤杞欢婊ゆ尝鍣 -#define J1939SoftwareFilterEn J1939_TRUE -/******************************J1939绉绘閰嶇疆鍑芥暟************************/ +extern CAN_NODE_t Can_Node; /* CAN纭欢閫夋嫨 */ +extern const j1939_uint8_t J1939_STARTING_ADDRESS[J1939_NODE_NUM]; -#define Port_CAN_Transmit(MsgPtr) J1939_CAN_Transmit(MsgPtr) -#define Port_CAN_Receive(MsgPtr) J1939_CAN_Receive(MsgPtr) -#define Port_SetAddressFilter(Address) J1939_SetAddressFilter(Address) -/*涓嶄娇鐢ㄤ腑鏂ā寮忥紝涓嶅涓嬮潰鐨勫嚱鏁拌繘琛岀Щ妞*/ -#if J1939_POLL_ECAN == J1939_FALSE - #define Port_RXinterruptEnable() J1939_RXinterruptEnable() - #define Port_RXinterruptDisable() J1939_RXinterruptDisable() - #define Port_TXinterruptEnable() J1939_TXinterruptEnable() - #define Port_TXinterruptDisable() J1939_TXinterruptDisable() - #define Port_TXinterruptOk() J1939_TXinterruptOk() - #define Port_CAN_identifier_clc() CAN_identifier_clc() -#endif - -/***************************************************************************************/ - -/* -*杈撳叆锛 -*杈撳嚭锛 -*璇存槑锛氬熀浜嶴AE J1939鍗忚锛屾垜浠渶瑕丆AN鎺у埗鍣ㄦ彁渚涜嚦灏3涓护娉㈠櫒缁橨1939鍗忚浠g爜銆備笁涓护娉㈠櫒鍒嗗埆閰嶇疆濡備笅锛 - 1. 璁剧疆婊ゆ尝鍣0锛屽彧鎺ュ彈骞挎挱淇℃伅锛圥F = 240 -255锛夈 - 2. 璁剧疆璁剧疆婊ゆ尝鍣1锛2鍙帴鍙楀叏灞鍦板潃锛圝1939_GLOBAL_ADDRESS锛 - 3. 闅忕潃绋嬪簭鐨勮繍琛岋紝灏嗘敼鍙樻护娉㈠櫒2锛屾潵閫傚簲绋嬪簭閫昏緫銆 - J1939_SetAddressFilter() 鏄敤鏉ヨ缃护娉㈠櫒2鐨勶紝 鍑芥暟涓昏璁剧疆PS浣嶏紙鐩爣鍦板潃锛夛紝鍏剁洰鐨勬槸锛岃鎺у埗鍣 - 鍙帴鍙楀彂閫佺粰鏈澶囩殑娑堟伅銆 -*璀﹀憡锛 婊ゆ尝鍣0锛1鏄湪CAN椹卞姩閲岄厤缃紝濡傛灉瀵圭‖浠舵护娉㈤厤缃笉鏄緢鐔熺粌锛屽彲浠ヤ娇鑳借蒋浠舵护娉㈠櫒锛#define J1939SoftwareFilterEn -*鍒欏彲璺宠繃鏈嚱鏁扮殑绉绘鍜孋AN纭欢婊ゆ尝鍣ㄧ殑閰嶇疆锛屼负浜咼1939鍗忚鏍堟ц兘鏈浼樺寲锛屽缓璁彧鏄敤纭欢婊ゆ尝銆 -*/ -void J1939_SetAddressFilter(unsigned char Ps_Address) -{ - switch (Can_Node) - { - case Select_CAN_NODE_1: - { - break; - } - case Select_CAN_NODE_2: - { - break; - } - case Select_CAN_NODE_3: - { - break; - } - case Select_CAN_NODE_4: - { - break; - } - default : - { - break; - } - } -} - -/* -*杈撳叆锛 *MsgPtr 锛屽崗璁鍙戦佺殑娑堟伅锛 -*杈撳嚭锛 -*璇存槑锛 灏嗘暟鎹 浠嶮sgPtr缁撴瀯浣撹祴鍊煎埌CAN椹卞姩鑷甫鐨勭粨鏋勪綋涓 - 鍏堝皢浼犲叆鍑芥暟鐨凪sgPtr涓殑鏁版嵁鍐欏埌CAN鐨勭粨鏋勪綋锛屽啀璋冪敤CAN椹卞姩鐨勫彂閫佸嚱鏁 - 榛樿鏀寔4璺疌AN纭欢鐨勬敹鍙戙傚灏戜簬4璺紝鍙渶閰嶇疆鐩稿簲鐨凜an_Node寮鍏充唬鐮佸尯锛 - 鍏朵粬锛圫elect_CAN_NODE锛変繚鎸佷笉鍙樸傚氨鐩存帴杩斿洖锛坆reak锛夈 -*/ -void J1939_CAN_Transmit(J1939_MESSAGE *MsgPtr) -{ - - switch (Can_Node) - { - case Select_CAN_NODE_1: - { - - /*鍔犺浇绗竴璺疌AN纭欢鐨29浣岻D*/ - - /*CAN纭欢鍔犺浇鏁版嵁闀垮害*/ - - /*CAN纭欢鍔犺浇鏁版嵁*/ - - /*CAN纭欢鍔犺浇RTR*/ - - //CAN纭欢寮濮嬪彂閫佹暟鎹 - - break; - } - case Select_CAN_NODE_2: - { - - /*鍔犺浇绗簩璺疌AN纭欢鐨29浣岻D*/ - - /*CAN纭欢鍔犺浇鏁版嵁闀垮害*/ - - /*CAN纭欢鍔犺浇鏁版嵁*/ - - /*CAN纭欢鍔犺浇RTR*/ - - //CAN纭欢寮濮嬪彂閫佹暟鎹 - break; - } - case Select_CAN_NODE_3: - { - - /*鍔犺浇绗笁璺疌AN纭欢鐨29浣岻D*/ +/******************************J1939绉绘閰嶇疆鍑芥暟******************************/ - /*CAN纭欢鍔犺浇鏁版嵁闀垮害*/ - - /*CAN纭欢鍔犺浇鏁版嵁*/ +void J1939_SetAddressFilter(j1939_uint8_t Ps_Address); +void J1939_CAN_Transmit(J1939_MESSAGE_t *MsgPtr); +int J1939_CAN_Receive(J1939_MESSAGE_t *MsgPtr); - /*CAN纭欢鍔犺浇RTR*/ +#define Port_CAN_Transmit(MsgPtr) J1939_CAN_Transmit(MsgPtr) +#define Port_CAN_Receive(MsgPtr) J1939_CAN_Receive(MsgPtr) +#define Port_SetAddressFilter(Address) J1939_SetAddressFilter(Address) - //CAN纭欢寮濮嬪彂閫佹暟鎹 - break; - } - case Select_CAN_NODE_4: - { - /*鍔犺浇绗洓璺疌AN纭欢鐨29浣岻D*/ - - /*CAN纭欢鍔犺浇鏁版嵁闀垮害*/ - - /*CAN纭欢鍔犺浇鏁版嵁*/ - - /*CAN纭欢鍔犺浇RTR*/ - - //CAN纭欢寮濮嬪彂閫佹暟鎹 - break; - } - default : - { - break; - } - } -} -/* -*杈撳叆锛 *MsgPtr 鏁版嵁瑕佸瓨鍏ョ殑鍐呭瓨鐨勬寚閽 -*杈撳嚭锛 1 | 0 -*璇存槑锛 璇诲彇CAN椹卞姩鐨勬暟鎹紝濡傛灉娌℃湁鏁版嵁锛岃繑鍥0 - 灏咰AN涓殑鏁版嵁鍙栧嚭锛屽瓨鍏1939_MESSAGE缁撴瀯浣撲腑 - 榛樿鏀寔4璺疌AN纭欢鐨勬敹鍙戙傚灏戜簬4璺紝鍙渶閰嶇疆鐩稿簲鐨凜an_Node寮鍏充唬鐮佸尯锛 - 鍏朵粬锛圫elect_CAN_NODE锛変繚鎸佷笉鍙樸傚氨鐩存帴杩斿洖锛坮eturn 0锛 -*/ - -int J1939_CAN_Receive(J1939_MESSAGE *MsgPtr) -{ - - switch (Can_Node) - { - case Select_CAN_NODE_1: - { - if("浣犵殑浠g爜")//鍒ゆ柇CAN纭欢1鏄惁鏈夋暟鎹埌鏉 - { - //浣犵殑浠g爜锛屼粠CAN纭欢1 涓皢鏁版嵁璇诲彇鍚庯紝瀛樺叆 MsgPtr - return 1; - } - return 0; - break; - } - case Select_CAN_NODE_2: - { - if("浣犵殑浠g爜")//鍒ゆ柇CAN纭欢2鏄惁鏈夋暟鎹埌鏉 - { - //浣犵殑浠g爜锛屼粠CAN纭欢2 涓皢鏁版嵁璇诲彇鍚庯紝瀛樺叆 MsgPtr - return 1; - } - return 0; - break; - - } - case Select_CAN_NODE_3: - { - if("浣犵殑浠g爜")//鍒ゆ柇CAN纭欢3鏄惁鏈夋暟鎹埌鏉 - { - //浣犵殑浠g爜锛屼粠CAN纭欢3 涓皢鏁版嵁璇诲彇鍚庯紝瀛樺叆 MsgPtr - return 1; - } - return 0; - break; - - } - case Select_CAN_NODE_4: - { - if("浣犵殑浠g爜")//鍒ゆ柇CAN纭欢4鏄惁鏈夋暟鎹埌鏉 - { - //浣犵殑浠g爜锛屼粠CAN纭欢4 涓皢鏁版嵁璇诲彇鍚庯紝瀛樺叆 MsgPtr - return 1; - } - return 0; - break; - } - default : - { - return 0;//娌℃湁娑堟伅 - break; - } - } - return 0;//娌℃湁娑堟伅 -} - -/*涓嶄娇鐢ㄤ腑鏂ā寮忥紝涓嶅涓嬮潰鐨勫嚱鏁拌繘琛岀Щ妞*/ +/* 涓嶄娇鐢ㄤ腑鏂ā寮忥紝涓嶅涓嬮潰鐨勫嚱鏁拌繘琛岀Щ妞 */ #if J1939_POLL_ECAN == J1939_FALSE -/* -*杈撳叆锛 -*杈撳嚭锛 -*璇存槑锛氫娇鑳芥帴鍙椾腑鏂 -*/ - void J1939_RXinterruptEnable() - { - ; - } -/* -*杈撳叆锛 -*杈撳嚭锛 -*璇存槑锛氬け鑳芥帴鍙椾腑鏂 -*/ - void J1939_RXinterruptDisable() - { - ; - } -/* -*杈撳叆锛 -*杈撳嚭锛 -*璇存槑锛氫娇鑳藉彂閫佷腑鏂 -*/ - void J1939_TXinterruptEnable() - { - ; - } -/* -*杈撳叆锛 -*杈撳嚭锛 -*璇存槑锛氬け鑳藉彂閫佷腑鏂 -*/ - void J1939_TXinterruptDisable() - { - ; - } -/* -*杈撳叆锛 -*杈撳嚭锛 -*璇存槑锛氳Е鍙戝彂閫佷腑鏂爣鑷翠綅锛屽綋鍗忚鏍堝湪涓柇妯″紡涓嬶紝瑕佸彂閫佹秷鎭紝灏嗚皟鐢ㄦ鍑芥暟 - CAN椹卞姩鍑芥暟锛屽氨灏嗙洿鎺ユ妸娑堟伅鍙戦佸嚭鍘伙紝涓嶉渶瑕佸崗璁湪璋冪敤浠讳綍can椹卞姩鍑芥暟 -*/ - void J1939_TXinterruptOk() - { - ; - } -/* -*杈撳叆锛 -*杈撳嚭锛 -*璇存槑锛氭竻闄AN椹卞姩鐩稿叧鐨勪腑鏂骇鐢熸爣璇嗕綅锛屽寘鎷紙鍙戦佷腑鏂爣蹇椾綅锛屾帴鍙椾腑鏂爣 - 蹇椾綅锛宑an鎬荤嚎閿欒鏍囪瘑浣嶏級 -*/ - void CAN_identifier_clc() - { - ; - } + +void J1939_RXinterruptEnable(); +void J1939_RXinterruptDisable(); +void J1939_TXinterruptEnable(); +void J1939_TXinterruptDisable(); +void J1939_TXinterruptOk(); +void CAN_identifier_clc(); + +#define Port_RXinterruptEnable() J1939_RXinterruptEnable() +#define Port_RXinterruptDisable() J1939_RXinterruptDisable() +#define Port_TXinterruptEnable() J1939_TXinterruptEnable() +#define Port_TXinterruptDisable() J1939_TXinterruptDisable() +#define Port_TXinterruptOk() J1939_TXinterruptOk() +#define Port_CAN_identifier_clc() CAN_identifier_clc() +#else +#define Port_RXinterruptEnable() +#define Port_RXinterruptDisable() +#define Port_TXinterruptEnable() +#define Port_TXinterruptDisable() +#define Port_TXinterruptOk() +#define Port_CAN_identifier_clc() #endif #endif diff --git a/source/J1939_Config.c b/source/J1939_Config.c new file mode 100644 index 0000000..5e0e872 --- /dev/null +++ b/source/J1939_Config.c @@ -0,0 +1,223 @@ +#include "J1939_Config.h" + +/******************************J1939 地址配置******************************/ +/* 设备默认的地址(地址命名是有规定的,参考J1939的附录B 地址和标识符的分配) */ +const j1939_uint8_t J1939_STARTING_ADDRESS[J1939_NODE_NUM] = { + [Select_CAN_NODE_1] = 0x01, + [Select_CAN_NODE_2] = 244, + [Select_CAN_NODE_3] = 247, + [Select_CAN_NODE_4] = 0, +}; + +/* +*输入: +*输出: +*说明:基于SAE J1939协议,我们需要CAN控制器提供至少3个滤波器给J1939协议代码。三个滤波器分别配置如下: + 1. 设置滤波器0,只接受广播信息(PF = 240 -255)。 + 2. 设置滤波器1,2只接受全局地址(J1939_GLOBAL_ADDRESS) + 3. 随着程序的运行,将改变滤波器2,来适应程序逻辑。 + J1939_SetAddressFilter() 是用来设置滤波器2的, 函数主要设置PS位(目标地址),其目的是,让控制器 + 只接受发送给本设备的消息。 +*警告: 滤波器0,1是在CAN驱动里配置,如果对硬件滤波配置不是很熟练,可以使能软件滤波器,#define J1939SoftwareFilterEn +*则可跳过本函数的移植和CAN硬件滤波器的配置,为了J1939协议栈性能最优化,建议只是用硬件滤波。 +*/ +void J1939_SetAddressFilter(j1939_uint8_t Ps_Address) +{ + switch (Can_Node) { + case Select_CAN_NODE_1: { + break; + } + + case Select_CAN_NODE_2: { + break; + } + + case Select_CAN_NODE_3: { + break; + } + + case Select_CAN_NODE_4: { + break; + } + + default: { + break; + } + } +} + +/* +*输入: *MsgPtr,协议要发送的消息, +*输出: +*说明: 将数据 从MsgPtr结构体赋值到CAN驱动自带的结构体中 + 先将传入函数的MsgPtr中的数据写到CAN的结构体,再调用CAN驱动的发送函数 + 默认支持4路CAN硬件的收发。如少于4路,只需配置相应的Can_Node开关代码区, + 其他(Select_CAN_NODE)保持不变。就直接返回(break)。 +*/ +void J1939_CAN_Transmit(J1939_MESSAGE_t *MsgPtr) +{ + switch (Can_Node) { + case Select_CAN_NODE_1: { + /* 加载第一路CAN硬件的29位ID */ + + /* CAN硬件加载数据长度 */ + + /* CAN硬件加载数据 */ + + /* CAN硬件加载RTR */ + + /* CAN硬件开始发送数据 */ + + break; + } + + case Select_CAN_NODE_2: { + /* 加载第二路CAN硬件的29位ID */ + + /* CAN硬件加载数据长度 */ + + /* CAN硬件加载数据 */ + + /* CAN硬件加载RTR */ + + /* CAN硬件开始发送数据 */ + + break; + } + + case Select_CAN_NODE_3: { + /* 加载第三路CAN硬件的29位ID */ + + /* CAN硬件加载数据长度 */ + + /* CAN硬件加载数据 */ + + /* CAN硬件加载RTR */ + + /* CAN硬件开始发送数据 */ + + break; + } + + case Select_CAN_NODE_4: { + /* 加载第四路CAN硬件的29位ID */ + + /* CAN硬件加载数据长度 */ + + /* CAN硬件加载数据 */ + + /* CAN硬件加载RTR */ + + /* CAN硬件开始发送数据 */ + + break; + } + + default: { + break; + } + } +} +/* +*输入: *MsgPtr 数据要存入的内存的指针 +*输出: 1 | 0 +*说明: 读取CAN驱动的数据,如果没有数据,返回0 + 将CAN中的数据取出,存入J1939_MESSAGE结构体中 + 默认支持4路CAN硬件的收发。如少于4路,只需配置相应的Can_Node开关代码区, + 其他(Select_CAN_NODE)保持不变。就直接返回(return 0) +*/ +int J1939_CAN_Receive(J1939_MESSAGE_t *MsgPtr) +{ + switch (Can_Node) { + case Select_CAN_NODE_1: { + if ("你的代码") + { + + /* 你的代码,从CAN硬件1 中将数据读取后,存入 MsgPtr */ + return 1; + } + + return 0; + break; + } + + case Select_CAN_NODE_2: { + break; + } + + case Select_CAN_NODE_3: { + break; + } + + case Select_CAN_NODE_4: { + break; + } + + default: { + return 0; /* 没有消息 */ + break; + } + } + + return 0; /* 没有消息 */ +} + +/*不使用中断模式,不对下面的函数进行移植*/ +#if J1939_POLL_ECAN == J1939_FALSE +/* +*输入: +*输出: +*说明:使能接受中断 +*/ +void J1939_RXinterruptEnable() +{ + ; +} +/* +*输入: +*输出: +*说明:失能接受中断 +*/ +void J1939_RXinterruptDisable() +{ + ; +} +/* +*输入: +*输出: +*说明:使能发送中断 +*/ +void J1939_TXinterruptEnable() +{ + ; +} +/* +*输入: +*输出: +*说明:失能发送中断 +*/ +void J1939_TXinterruptDisable() +{ + ; +} +/* +*输入: +*输出: +*说明:触发发送中断标致位,当协议栈在中断模式下,要发送消息,将调用此函数, + CAN驱动函数,就将直接把消息发送出去,不需要协议在调用任何can驱动函数 +*/ +void J1939_TXinterruptOk() +{ + ; +} +/* +*输入: +*输出: +*说明:清除CAN驱动相关的中断产生标识位,包括(发送中断标志位,接受中断标 + 志位,can总线错误标识位) +*/ +void CAN_identifier_clc() +{ + ; +} +#endif From 40bc97a7800c55b9639f71be69af64181cd32774 Mon Sep 17 00:00:00 2001 From: LINNY Date: Tue, 4 Aug 2020 21:12:11 +0800 Subject: [PATCH 2/7] Update CHANGELOG --- CHANGELOG | 75 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 81374b3..c3f1816 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,48 +4,49 @@ * ********************************************************************* * - * 本程序是由XieTongXueFlyMe对现有的J1939协议文档分析,和对前辈的贡献总结, - * 写出的一套开源的J1939驱动。 - * 本协议特点: - * 1.易移植(不针对特定的CAN硬件,只要满足CAN2.0B即可) - * 2.轻量级(可适应低端的MCU) - * 3.支持多任务调用接口(可用于嵌入式系统) - * 4.双模式(轮询或者中断,逻辑更加简单明了) - * 5.不掉帧(数据采用收发列队缓存) + * 鏈▼搴忔槸鐢盭ieTongXueFlyMe瀵圭幇鏈夌殑J1939鍗忚鏂囨。鍒嗘瀽锛屽拰瀵瑰墠杈堢殑璐$尞鎬荤粨, + * 鍐欏嚭鐨勪竴濂楀紑婧愮殑J1939椹卞姩銆 + * 鏈崗璁壒鐐癸細 + * 1.鏄撶Щ妞嶏紙涓嶉拡瀵圭壒瀹氱殑CAN纭欢锛屽彧瑕佹弧瓒矯AN2.0B鍗冲彲锛 + * 2.杞婚噺绾э紙鍙傚簲浣庣鐨凪CU锛 + * 3.鏀寔澶氫换鍔¤皟鐢ㄦ帴鍙o紙鍙敤浜庡祵鍏ュ紡绯荤粺锛 + * 4.鍙屾ā寮忥紙杞鎴栬呬腑鏂紝閫昏緫鏇村姞绠鍗曟槑浜嗭級 + * 5.涓嶆帀甯э紙鏁版嵁閲囩敤鏀跺彂鍒楅槦缂撳瓨锛 * - * 源代码下载: + * 婧愪唬鐮佷笅杞斤細 * https://github.com/XeiTongXueFlyMe/J1939 - * 源代码临时手册Web站点: + * 婧愪唬鐮佷复鏃舵墜鍐學eb绔欑偣锛 * https://xeitongxueflyme.github.io/j1939doc.github.io/ * * Version Date Description * ------------------------------------------------------------------- - * v1.0.0 2017/06/04 首个版本 Version 1 测试版发布 - * v1.0.1 2017/08/04 完善功能 - * v1.1.0 2017/11/22 Version 1 稳定发布版 - * v2.0.1 2017/11/24 Version 2 测试版发布 - * v2.0.2 2018/01/03 解决V2.0.1 遗留问题 - * v2.1.0 2018/01/20 Version 2 稳定发布版 + * v1.0.0 2017/06/04 棣栦釜鐗堟湰 Version 1 娴嬭瘯鐗堝彂甯 + * v1.0.1 2017/08/04 瀹屽杽鍔熻兘 + * v1.1.0 2017/11/22 Version 1 绋冲畾鍙戝竷鐗 + * v2.0.1 2017/11/24 Version 2 娴嬭瘯鐗堝彂甯 + * v2.0.2 2018/01/03 瑙e喅V2.0.1 閬楃暀闂 + * v2.1.0 2018/01/20 Version 2 绋冲畾鍙戝竷鐗 * Author Date changes *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - *XeiTongXueFlyMe 17/06/04 首个版本 - *XeiTongXueFlyMe 17/08/04 增加对TP的支持 - *XeiTongXueFlyMe 17/11/24 增加对多路CAN硬件的收发,和报文处理 - *XeiTongXueFlyMe 17/11/29 增加请求和响应API - *XeiTongXueFlyMe 17/12/07 重做TP接受API函数 - *XeiTongXueFlyMe 17/12/08 增加软件滤波器 - *XeiTongXueFlyMe 18/01/03 重做接受发送API,简化协议栈初始化调用逻辑 - *SummerFalls 20/08/04 简化了宏开关; - 统一自定义类型大小写及_t后缀; - 将多组宏定义分组并改换成枚举类型; - 调整枚举类型变量的命名中相同字段所处的位置, - 例如将 'J1939_CONTROL_BYTE_' 提前, - 方便编辑器快速联想同类型变量; - 将不同CAN节点的相关全局变量使用数组进行管理, - 去除了多个switch代码段所造成的代码重复性高的问题, - 减少了Flash占用,增强了可扩展更多CAN节点的可能性, - 同时增加代码灵活性,尽量避免增减节点时对协议栈主源文件的大量改动; - 注释统一使用 MISRA-C 的标准 C 注释:/* Comment */; - 缩进统一使用空格缩进,避免不同编辑器缩进量差异; - 将本段版本历史记录信息从各个源文件中提取出来,单独存放于 CHANGELOG 文件中。 - **********************************************************************/ \ No newline at end of file + *XeiTongXueFlyMe 17/06/04 棣栦釜鐗堟湰 + *XeiTongXueFlyMe 17/08/04 澧炲姞瀵筎P鐨勬敮鎸 + *XeiTongXueFlyMe 17/11/24 澧炲姞瀵瑰璺疌AN纭欢鐨勬敹鍙戯紝鍜屾姤鏂囧鐞 + *XeiTongXueFlyMe 17/11/29 澧炲姞璇锋眰鍜屽搷搴擜PI + *XeiTongXueFlyMe 17/12/07 閲嶅仛TP鎺ュ彈API鍑芥暟 + *XeiTongXueFlyMe 17/12/08 澧炲姞杞欢婊ゆ尝鍣 + *XeiTongXueFlyMe 18/01/03 閲嶅仛鎺ュ彈鍙戦丄PI锛岀畝鍖栧崗璁爤鍒濆鍖栬皟鐢ㄩ昏緫 + *SummerFalls 20/08/04 绠鍖栦簡瀹忓紑鍏筹紱 + 缁熶竴鑷畾涔夌被鍨嬪ぇ灏忓啓鍙奯t鍚庣紑锛 + 灏嗗缁勫畯瀹氫箟鍒嗙粍骞舵敼鎹㈡垚鏋氫妇绫诲瀷锛 + 璋冩暣鏋氫妇绫诲瀷鍙橀噺鐨勫懡鍚嶄腑鐩稿悓瀛楁鎵澶勭殑浣嶇疆锛 + 渚嬪灏 'J1939_CONTROL_BYTE_' 鎻愬墠锛 + 鏂逛究缂栬緫鍣ㄥ揩閫熻仈鎯冲悓绫诲瀷鍙橀噺锛 + 灏嗕笉鍚孋AN鑺傜偣鐨勭浉鍏冲叏灞鍙橀噺浣跨敤鏁扮粍杩涜绠$悊锛 + 鍘婚櫎浜嗗涓猻witch浠g爜娈垫墍閫犳垚鐨勪唬鐮侀噸澶嶆ч珮鐨勯棶棰橈紝 + 鍑忓皯浜咶lash鍗犵敤锛屽寮轰簡鍙墿灞曟洿澶欳AN鑺傜偣鐨勫彲鑳芥э紝 + 鍚屾椂澧炲姞浠g爜鐏垫椿鎬э紝灏介噺閬垮厤澧炲噺鑺傜偣鏃跺鍗忚鏍堜富婧愭枃浠剁殑澶ч噺鏀瑰姩锛 + 娉ㄩ噴缁熶竴浣跨敤 MISRA-C 鐨勬爣鍑 C 娉ㄩ噴锛/* Comment */锛 + 缂╄繘缁熶竴浣跨敤绌烘牸缂╄繘锛岄伩鍏嶄笉鍚岀紪杈戝櫒缂╄繘閲忓樊寮傦紱 + 灏嗘湰娈电増鏈巻鍙茶褰曚俊鎭粠鍚勪釜婧愭枃浠朵腑鎻愬彇鍑烘潵锛屽崟鐙瓨鏀句簬 CHANGELOG 鏂囦欢涓 + **********************************************************************/ + From 9ae8bcc3de725de3f03c4d7a423b2e8d42460d7a Mon Sep 17 00:00:00 2001 From: Leven Date: Tue, 15 Dec 2020 10:54:19 +0800 Subject: [PATCH 3/7] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=9A=84=E5=87=BD=E6=95=B0=E8=BF=94=E5=9B=9E=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/J1939.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/J1939.c b/source/J1939.c index c9b8e77..5163b78 100644 --- a/source/J1939.c +++ b/source/J1939.c @@ -47,7 +47,7 @@ static void J1939_TP_Poll(void); #endif /* J1939_TP_RX_TX */ static void J1939_ReceiveMessages(void); -static j1939_uint8_t J1939_TransmitMessages(void); +static J1939_Status_t J1939_TransmitMessages(void); static void J1939_Response(const j1939_uint32_t PGN); /** From 0f8898794bba5b1cd20d31b623b813dbcc698936 Mon Sep 17 00:00:00 2001 From: Leven Date: Tue, 15 Dec 2020 11:12:14 +0800 Subject: [PATCH 4/7] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E4=B9=B1=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 鏂囦欢缂栫爜鏂瑰紡鏇存敼涓虹粺涓鐨刄TF-8缂栫爜 --- source/J1939.H | 2 +- source/J1939.c | 2 +- source/J1939_Config.H | 2 +- source/J1939_Config.c | 138 +++++++++++++++++++++--------------------- 4 files changed, 72 insertions(+), 72 deletions(-) diff --git a/source/J1939.H b/source/J1939.H index f802df0..80e3ec8 100644 --- a/source/J1939.H +++ b/source/J1939.H @@ -1,4 +1,4 @@ -锘#ifndef __J1939_H +#ifndef __J1939_H #define __J1939_H #include diff --git a/source/J1939.c b/source/J1939.c index 5163b78..304392b 100644 --- a/source/J1939.c +++ b/source/J1939.c @@ -1,4 +1,4 @@ -锘#include "J1939.h" +#include "J1939.h" #include "J1939_Config.h" #include diff --git a/source/J1939_Config.H b/source/J1939_Config.H index 81643a1..488deff 100644 --- a/source/J1939_Config.H +++ b/source/J1939_Config.H @@ -1,4 +1,4 @@ -锘#ifndef __J1939_Config_H +#ifndef __J1939_Config_H #define __J1939_Config_H #include "J1939.h" diff --git a/source/J1939_Config.c b/source/J1939_Config.c index 5e0e872..f324879 100644 --- a/source/J1939_Config.c +++ b/source/J1939_Config.c @@ -1,7 +1,7 @@ #include "J1939_Config.h" -/******************************J1939 地址配置******************************/ -/* 设备默认的地址(地址命名是有规定的,参考J1939的附录B 地址和标识符的分配) */ +/******************************J1939 鍦板潃閰嶇疆******************************/ +/* 璁惧榛樿鐨勫湴鍧锛堝湴鍧鍛藉悕鏄湁瑙勫畾鐨勶紝鍙傝僇1939鐨勯檮褰旴 鍦板潃鍜屾爣璇嗙鐨勫垎閰嶏級 */ const j1939_uint8_t J1939_STARTING_ADDRESS[J1939_NODE_NUM] = { [Select_CAN_NODE_1] = 0x01, [Select_CAN_NODE_2] = 244, @@ -10,16 +10,16 @@ const j1939_uint8_t J1939_STARTING_ADDRESS[J1939_NODE_NUM] = { }; /* -*输入: -*输出: -*说明:基于SAE J1939协议,我们需要CAN控制器提供至少3个滤波器给J1939协议代码。三个滤波器分别配置如下: - 1. 设置滤波器0,只接受广播信息(PF = 240 -255)。 - 2. 设置滤波器1,2只接受全局地址(J1939_GLOBAL_ADDRESS) - 3. 随着程序的运行,将改变滤波器2,来适应程序逻辑。 - J1939_SetAddressFilter() 是用来设置滤波器2的, 函数主要设置PS位(目标地址),其目的是,让控制器 - 只接受发送给本设备的消息。 -*警告: 滤波器0,1是在CAN驱动里配置,如果对硬件滤波配置不是很熟练,可以使能软件滤波器,#define J1939SoftwareFilterEn -*则可跳过本函数的移植和CAN硬件滤波器的配置,为了J1939协议栈性能最优化,建议只是用硬件滤波。 +*杈撳叆锛 +*杈撳嚭锛 +*璇存槑锛氬熀浜嶴AE J1939鍗忚锛屾垜浠渶瑕丆AN鎺у埗鍣ㄦ彁渚涜嚦灏3涓护娉㈠櫒缁橨1939鍗忚浠g爜銆備笁涓护娉㈠櫒鍒嗗埆閰嶇疆濡備笅锛 + 1. 璁剧疆婊ゆ尝鍣0锛屽彧鎺ュ彈骞挎挱淇℃伅锛圥F = 240 -255锛夈 + 2. 璁剧疆婊ゆ尝鍣1锛2鍙帴鍙楀叏灞鍦板潃锛圝1939_GLOBAL_ADDRESS锛 + 3. 闅忕潃绋嬪簭鐨勮繍琛岋紝灏嗘敼鍙樻护娉㈠櫒2锛屾潵閫傚簲绋嬪簭閫昏緫銆 + J1939_SetAddressFilter() 鏄敤鏉ヨ缃护娉㈠櫒2鐨勶紝 鍑芥暟涓昏璁剧疆PS浣嶏紙鐩爣鍦板潃锛夛紝鍏剁洰鐨勬槸锛岃鎺у埗鍣 + 鍙帴鍙楀彂閫佺粰鏈澶囩殑娑堟伅銆 +*璀﹀憡锛 婊ゆ尝鍣0锛1鏄湪CAN椹卞姩閲岄厤缃紝濡傛灉瀵圭‖浠舵护娉㈤厤缃笉鏄緢鐔熺粌锛屽彲浠ヤ娇鑳借蒋浠舵护娉㈠櫒锛#define J1939SoftwareFilterEn +*鍒欏彲璺宠繃鏈嚱鏁扮殑绉绘鍜孋AN纭欢婊ゆ尝鍣ㄧ殑閰嶇疆锛屼负浜咼1939鍗忚鏍堟ц兘鏈浼樺寲锛屽缓璁彧鏄敤纭欢婊ゆ尝銆 */ void J1939_SetAddressFilter(j1939_uint8_t Ps_Address) { @@ -47,68 +47,68 @@ void J1939_SetAddressFilter(j1939_uint8_t Ps_Address) } /* -*输入: *MsgPtr,协议要发送的消息, -*输出: -*说明: 将数据 从MsgPtr结构体赋值到CAN驱动自带的结构体中 - 先将传入函数的MsgPtr中的数据写到CAN的结构体,再调用CAN驱动的发送函数 - 默认支持4路CAN硬件的收发。如少于4路,只需配置相应的Can_Node开关代码区, - 其他(Select_CAN_NODE)保持不变。就直接返回(break)。 +*杈撳叆锛 *MsgPtr锛屽崗璁鍙戦佺殑娑堟伅锛 +*杈撳嚭锛 +*璇存槑锛 灏嗘暟鎹 浠嶮sgPtr缁撴瀯浣撹祴鍊煎埌CAN椹卞姩鑷甫鐨勭粨鏋勪綋涓 + 鍏堝皢浼犲叆鍑芥暟鐨凪sgPtr涓殑鏁版嵁鍐欏埌CAN鐨勭粨鏋勪綋锛屽啀璋冪敤CAN椹卞姩鐨勫彂閫佸嚱鏁 + 榛樿鏀寔4璺疌AN纭欢鐨勬敹鍙戙傚灏戜簬4璺紝鍙渶閰嶇疆鐩稿簲鐨凜an_Node寮鍏充唬鐮佸尯锛 + 鍏朵粬锛圫elect_CAN_NODE锛変繚鎸佷笉鍙樸傚氨鐩存帴杩斿洖锛坆reak锛夈 */ void J1939_CAN_Transmit(J1939_MESSAGE_t *MsgPtr) { switch (Can_Node) { case Select_CAN_NODE_1: { - /* 加载第一路CAN硬件的29位ID */ + /* 鍔犺浇绗竴璺疌AN纭欢鐨29浣岻D */ - /* CAN硬件加载数据长度 */ + /* CAN纭欢鍔犺浇鏁版嵁闀垮害 */ - /* CAN硬件加载数据 */ + /* CAN纭欢鍔犺浇鏁版嵁 */ - /* CAN硬件加载RTR */ + /* CAN纭欢鍔犺浇RTR */ - /* CAN硬件开始发送数据 */ + /* CAN纭欢寮濮嬪彂閫佹暟鎹 */ break; } case Select_CAN_NODE_2: { - /* 加载第二路CAN硬件的29位ID */ + /* 鍔犺浇绗簩璺疌AN纭欢鐨29浣岻D */ - /* CAN硬件加载数据长度 */ + /* CAN纭欢鍔犺浇鏁版嵁闀垮害 */ - /* CAN硬件加载数据 */ + /* CAN纭欢鍔犺浇鏁版嵁 */ - /* CAN硬件加载RTR */ + /* CAN纭欢鍔犺浇RTR */ - /* CAN硬件开始发送数据 */ + /* CAN纭欢寮濮嬪彂閫佹暟鎹 */ break; } case Select_CAN_NODE_3: { - /* 加载第三路CAN硬件的29位ID */ + /* 鍔犺浇绗笁璺疌AN纭欢鐨29浣岻D */ - /* CAN硬件加载数据长度 */ + /* CAN纭欢鍔犺浇鏁版嵁闀垮害 */ - /* CAN硬件加载数据 */ + /* CAN纭欢鍔犺浇鏁版嵁 */ - /* CAN硬件加载RTR */ + /* CAN纭欢鍔犺浇RTR */ - /* CAN硬件开始发送数据 */ + /* CAN纭欢寮濮嬪彂閫佹暟鎹 */ break; } case Select_CAN_NODE_4: { - /* 加载第四路CAN硬件的29位ID */ + /* 鍔犺浇绗洓璺疌AN纭欢鐨29浣岻D */ - /* CAN硬件加载数据长度 */ + /* CAN纭欢鍔犺浇鏁版嵁闀垮害 */ - /* CAN硬件加载数据 */ + /* CAN纭欢鍔犺浇鏁版嵁 */ - /* CAN硬件加载RTR */ + /* CAN纭欢鍔犺浇RTR */ - /* CAN硬件开始发送数据 */ + /* CAN纭欢寮濮嬪彂閫佹暟鎹 */ break; } @@ -119,21 +119,21 @@ void J1939_CAN_Transmit(J1939_MESSAGE_t *MsgPtr) } } /* -*输入: *MsgPtr 数据要存入的内存的指针 -*输出: 1 | 0 -*说明: 读取CAN驱动的数据,如果没有数据,返回0 - 将CAN中的数据取出,存入J1939_MESSAGE结构体中 - 默认支持4路CAN硬件的收发。如少于4路,只需配置相应的Can_Node开关代码区, - 其他(Select_CAN_NODE)保持不变。就直接返回(return 0) +*杈撳叆锛 *MsgPtr 鏁版嵁瑕佸瓨鍏ョ殑鍐呭瓨鐨勬寚閽 +*杈撳嚭锛 1 | 0 +*璇存槑锛 璇诲彇CAN椹卞姩鐨勬暟鎹紝濡傛灉娌℃湁鏁版嵁锛岃繑鍥0 + 灏咰AN涓殑鏁版嵁鍙栧嚭锛屽瓨鍏1939_MESSAGE缁撴瀯浣撲腑 + 榛樿鏀寔4璺疌AN纭欢鐨勬敹鍙戙傚灏戜簬4璺紝鍙渶閰嶇疆鐩稿簲鐨凜an_Node寮鍏充唬鐮佸尯锛 + 鍏朵粬锛圫elect_CAN_NODE锛変繚鎸佷笉鍙樸傚氨鐩存帴杩斿洖锛坮eturn 0锛 */ int J1939_CAN_Receive(J1939_MESSAGE_t *MsgPtr) { switch (Can_Node) { case Select_CAN_NODE_1: { - if ("你的代码") + if ("浣犵殑浠g爜") { - /* 你的代码,从CAN硬件1 中将数据读取后,存入 MsgPtr */ + /* 浣犵殑浠g爜锛屼粠CAN纭欢1 涓皢鏁版嵁璇诲彇鍚庯紝瀛樺叆 MsgPtr */ return 1; } @@ -154,67 +154,67 @@ int J1939_CAN_Receive(J1939_MESSAGE_t *MsgPtr) } default: { - return 0; /* 没有消息 */ + return 0; /* 娌℃湁娑堟伅 */ break; } } - return 0; /* 没有消息 */ + return 0; /* 娌℃湁娑堟伅 */ } -/*不使用中断模式,不对下面的函数进行移植*/ +/*涓嶄娇鐢ㄤ腑鏂ā寮忥紝涓嶅涓嬮潰鐨勫嚱鏁拌繘琛岀Щ妞*/ #if J1939_POLL_ECAN == J1939_FALSE /* -*输入: -*输出: -*说明:使能接受中断 +*杈撳叆锛 +*杈撳嚭锛 +*璇存槑锛氫娇鑳芥帴鍙椾腑鏂 */ void J1939_RXinterruptEnable() { ; } /* -*输入: -*输出: -*说明:失能接受中断 +*杈撳叆锛 +*杈撳嚭锛 +*璇存槑锛氬け鑳芥帴鍙椾腑鏂 */ void J1939_RXinterruptDisable() { ; } /* -*输入: -*输出: -*说明:使能发送中断 +*杈撳叆锛 +*杈撳嚭锛 +*璇存槑锛氫娇鑳藉彂閫佷腑鏂 */ void J1939_TXinterruptEnable() { ; } /* -*输入: -*输出: -*说明:失能发送中断 +*杈撳叆锛 +*杈撳嚭锛 +*璇存槑锛氬け鑳藉彂閫佷腑鏂 */ void J1939_TXinterruptDisable() { ; } /* -*输入: -*输出: -*说明:触发发送中断标致位,当协议栈在中断模式下,要发送消息,将调用此函数, - CAN驱动函数,就将直接把消息发送出去,不需要协议在调用任何can驱动函数 +*杈撳叆锛 +*杈撳嚭锛 +*璇存槑锛氳Е鍙戝彂閫佷腑鏂爣鑷翠綅锛屽綋鍗忚鏍堝湪涓柇妯″紡涓嬶紝瑕佸彂閫佹秷鎭紝灏嗚皟鐢ㄦ鍑芥暟锛 + CAN椹卞姩鍑芥暟锛屽氨灏嗙洿鎺ユ妸娑堟伅鍙戦佸嚭鍘伙紝涓嶉渶瑕佸崗璁湪璋冪敤浠讳綍can椹卞姩鍑芥暟 */ void J1939_TXinterruptOk() { ; } /* -*输入: -*输出: -*说明:清除CAN驱动相关的中断产生标识位,包括(发送中断标志位,接受中断标 - 志位,can总线错误标识位) +*杈撳叆锛 +*杈撳嚭锛 +*璇存槑锛氭竻闄AN椹卞姩鐩稿叧鐨勪腑鏂骇鐢熸爣璇嗕綅锛屽寘鎷紙鍙戦佷腑鏂爣蹇椾綅锛屾帴鍙椾腑鏂爣 + 蹇椾綅锛宑an鎬荤嚎閿欒鏍囪瘑浣嶏級 */ void CAN_identifier_clc() { From 587ba5068a125a75d8dee391ab5f33c8fd4c726d Mon Sep 17 00:00:00 2001 From: Leven Date: Tue, 15 Dec 2020 11:18:56 +0800 Subject: [PATCH 5/7] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BD=BF=E7=94=A8?= =?UTF-8?q?C89=E6=A0=87=E5=87=86=E7=BC=96=E8=AF=91=E4=B8=8D=E9=80=9A?= =?UTF-8?q?=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 澧炲姞杞欢鐨勫吋瀹规 --- source/J1939.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/J1939.c b/source/J1939.c index 304392b..3f6455f 100644 --- a/source/J1939.c +++ b/source/J1939.c @@ -201,7 +201,8 @@ void J1939_Initialization(void) J1939_Flags.FlagVal = 0; /* 娌℃湁澹版槑鍦板潃锛屽叾浠栫殑鏍囪瘑浣嶅皢琚缃负0锛堝浣嶏級 */ /* 鍒濆鍖栨帴鍙楀拰鍙戦侀槦鍒 */ - for (j1939_uint8_t i = 0; i < J1939_NODE_NUM; i++) + j1939_uint8_t i; + for (i = 0; i < J1939_NODE_NUM; i++) { TXHead[i] = 0; TXTail[i] = 0xFF; From 1e3b7da1166bc3a7c180522457b8216827116461 Mon Sep 17 00:00:00 2001 From: Leven Date: Tue, 15 Dec 2020 13:50:38 +0800 Subject: [PATCH 6/7] =?UTF-8?q?style:=20=E4=BB=A3=E7=A0=81=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/J1939.c | 22 +++++------ source/J1939_Config.H | 9 ++--- source/J1939_Config.c | 87 +++++++++++++++++++++++-------------------- 3 files changed, 61 insertions(+), 57 deletions(-) diff --git a/source/J1939.c b/source/J1939.c index 3f6455f..74f8a6a 100644 --- a/source/J1939.c +++ b/source/J1939.c @@ -1,6 +1,7 @@ +#include + #include "J1939.h" #include "J1939_Config.h" -#include #define ADDRESS_CLAIM_TX 1 /**< 杩涘叆鍦板潃绔炰簤鍙戦佸鐞嗘ā寮*/ #define ADDRESS_CLAIM_RX 2 /**< 杩涘叆鍦板潃绔炰簤鎺ュ彈澶勭悊妯″紡*/ @@ -513,16 +514,15 @@ void J1939_ReceiveMessages(void) #if J1939_TP_RX_TX PutInReceiveQueue: { /* - if(OneMessage.Mxe.PDUFormat < 240){ - OneMessage.Mxe.PGN = (j1939_uint32_t)((OneMessage.Array[0]<<16)&0x030000) - +(j1939_uint32_t)((OneMessage.Array[1]<<8)&0xFF00) - +0x00; - }else{ - OneMessage.Mxe.PGN = (j1939_uint32_t)((OneMessage.Array[0]<<16)&0x030000) - +(j1939_uint32_t)((OneMessage.Array[1]<<8)&0xFF00) - +(j1939_uint32_t)((OneMessage.Array[2])&0xFF); - } - */ + if (OneMessage.Mxe.PDUFormat < 240) { + OneMessage.Mxe.PGN = (j1939_uint32_t)((OneMessage.Array[0] << 16) & 0x030000) + + (j1939_uint32_t)((OneMessage.Array[1] << 8) & 0xFF00) + + 0x00; + } else { + OneMessage.Mxe.PGN = (j1939_uint32_t)((OneMessage.Array[0] << 16) & 0x030000) + + (j1939_uint32_t)((OneMessage.Array[1] << 8) & 0xFF00) + + (j1939_uint32_t)((OneMessage.Array[2]) & 0xFF); + } */ if (OneMessage.Mxe.PDUFormat < 240) { OneMessage.Mxe.PGN = (OneMessage.Mxe.Res << 17) + (OneMessage.Mxe.DataPage << 16) diff --git a/source/J1939_Config.H b/source/J1939_Config.H index 488deff..744734e 100644 --- a/source/J1939_Config.H +++ b/source/J1939_Config.H @@ -4,6 +4,7 @@ #include "J1939.h" /******************************J1939鍔熻兘閰嶇疆******************************/ + #define J1939_NODE_NUM 4 #define J1939_RX_QUEUE_SIZE 3 @@ -26,7 +27,7 @@ extern const j1939_uint8_t J1939_STARTING_ADDRESS[J1939_NODE_NUM]; void J1939_SetAddressFilter(j1939_uint8_t Ps_Address); void J1939_CAN_Transmit(J1939_MESSAGE_t *MsgPtr); -int J1939_CAN_Receive(J1939_MESSAGE_t *MsgPtr); +int J1939_CAN_Receive(J1939_MESSAGE_t *MsgPtr); #define Port_CAN_Transmit(MsgPtr) J1939_CAN_Transmit(MsgPtr) #define Port_CAN_Receive(MsgPtr) J1939_CAN_Receive(MsgPtr) @@ -34,14 +35,12 @@ int J1939_CAN_Receive(J1939_MESSAGE_t *MsgPtr); /* 涓嶄娇鐢ㄤ腑鏂ā寮忥紝涓嶅涓嬮潰鐨勫嚱鏁拌繘琛岀Щ妞 */ #if J1939_POLL_ECAN == J1939_FALSE - void J1939_RXinterruptEnable(); void J1939_RXinterruptDisable(); void J1939_TXinterruptEnable(); void J1939_TXinterruptDisable(); void J1939_TXinterruptOk(); void CAN_identifier_clc(); - #define Port_RXinterruptEnable() J1939_RXinterruptEnable() #define Port_RXinterruptDisable() J1939_RXinterruptDisable() #define Port_TXinterruptEnable() J1939_TXinterruptEnable() @@ -55,6 +54,6 @@ void CAN_identifier_clc(); #define Port_TXinterruptDisable() #define Port_TXinterruptOk() #define Port_CAN_identifier_clc() -#endif +#endif /* #if J1939_POLL_ECAN == J1939_FALSE */ -#endif +#endif /* #ifndef __J1939_Config_H */ diff --git a/source/J1939_Config.c b/source/J1939_Config.c index f324879..2edf510 100644 --- a/source/J1939_Config.c +++ b/source/J1939_Config.c @@ -1,6 +1,7 @@ #include "J1939_Config.h" /******************************J1939 鍦板潃閰嶇疆******************************/ + /* 璁惧榛樿鐨勫湴鍧锛堝湴鍧鍛藉悕鏄湁瑙勫畾鐨勶紝鍙傝僇1939鐨勯檮褰旴 鍦板潃鍜屾爣璇嗙鐨勫垎閰嶏級 */ const j1939_uint8_t J1939_STARTING_ADDRESS[J1939_NODE_NUM] = { [Select_CAN_NODE_1] = 0x01, @@ -10,17 +11,17 @@ const j1939_uint8_t J1939_STARTING_ADDRESS[J1939_NODE_NUM] = { }; /* -*杈撳叆锛 -*杈撳嚭锛 -*璇存槑锛氬熀浜嶴AE J1939鍗忚锛屾垜浠渶瑕丆AN鎺у埗鍣ㄦ彁渚涜嚦灏3涓护娉㈠櫒缁橨1939鍗忚浠g爜銆備笁涓护娉㈠櫒鍒嗗埆閰嶇疆濡備笅锛 + * 杈撳叆锛 + * 杈撳嚭锛 + * 璇存槑锛氬熀浜嶴AE J1939鍗忚锛屾垜浠渶瑕丆AN鎺у埗鍣ㄦ彁渚涜嚦灏3涓护娉㈠櫒缁橨1939鍗忚浠g爜銆備笁涓护娉㈠櫒鍒嗗埆閰嶇疆濡備笅锛 1. 璁剧疆婊ゆ尝鍣0锛屽彧鎺ュ彈骞挎挱淇℃伅锛圥F = 240 -255锛夈 2. 璁剧疆婊ゆ尝鍣1锛2鍙帴鍙楀叏灞鍦板潃锛圝1939_GLOBAL_ADDRESS锛 3. 闅忕潃绋嬪簭鐨勮繍琛岋紝灏嗘敼鍙樻护娉㈠櫒2锛屾潵閫傚簲绋嬪簭閫昏緫銆 J1939_SetAddressFilter() 鏄敤鏉ヨ缃护娉㈠櫒2鐨勶紝 鍑芥暟涓昏璁剧疆PS浣嶏紙鐩爣鍦板潃锛夛紝鍏剁洰鐨勬槸锛岃鎺у埗鍣 鍙帴鍙楀彂閫佺粰鏈澶囩殑娑堟伅銆 -*璀﹀憡锛 婊ゆ尝鍣0锛1鏄湪CAN椹卞姩閲岄厤缃紝濡傛灉瀵圭‖浠舵护娉㈤厤缃笉鏄緢鐔熺粌锛屽彲浠ヤ娇鑳借蒋浠舵护娉㈠櫒锛#define J1939SoftwareFilterEn -*鍒欏彲璺宠繃鏈嚱鏁扮殑绉绘鍜孋AN纭欢婊ゆ尝鍣ㄧ殑閰嶇疆锛屼负浜咼1939鍗忚鏍堟ц兘鏈浼樺寲锛屽缓璁彧鏄敤纭欢婊ゆ尝銆 -*/ + * 璀﹀憡锛 婊ゆ尝鍣0锛1鏄湪CAN椹卞姩閲岄厤缃紝濡傛灉瀵圭‖浠舵护娉㈤厤缃笉鏄緢鐔熺粌锛屽彲浠ヤ娇鑳借蒋浠舵护娉㈠櫒锛#define J1939SoftwareFilterEn + * 鍒欏彲璺宠繃鏈嚱鏁扮殑绉绘鍜孋AN纭欢婊ゆ尝鍣ㄧ殑閰嶇疆锛屼负浜咼1939鍗忚鏍堟ц兘鏈浼樺寲锛屽缓璁彧鏄敤纭欢婊ゆ尝銆 + */ void J1939_SetAddressFilter(j1939_uint8_t Ps_Address) { switch (Can_Node) { @@ -47,13 +48,13 @@ void J1939_SetAddressFilter(j1939_uint8_t Ps_Address) } /* -*杈撳叆锛 *MsgPtr锛屽崗璁鍙戦佺殑娑堟伅锛 -*杈撳嚭锛 -*璇存槑锛 灏嗘暟鎹 浠嶮sgPtr缁撴瀯浣撹祴鍊煎埌CAN椹卞姩鑷甫鐨勭粨鏋勪綋涓 + * 杈撳叆锛 *MsgPtr锛屽崗璁鍙戦佺殑娑堟伅锛 + * 杈撳嚭锛 + * 璇存槑锛 灏嗘暟鎹 浠嶮sgPtr缁撴瀯浣撹祴鍊煎埌CAN椹卞姩鑷甫鐨勭粨鏋勪綋涓 鍏堝皢浼犲叆鍑芥暟鐨凪sgPtr涓殑鏁版嵁鍐欏埌CAN鐨勭粨鏋勪綋锛屽啀璋冪敤CAN椹卞姩鐨勫彂閫佸嚱鏁 榛樿鏀寔4璺疌AN纭欢鐨勬敹鍙戙傚灏戜簬4璺紝鍙渶閰嶇疆鐩稿簲鐨凜an_Node寮鍏充唬鐮佸尯锛 鍏朵粬锛圫elect_CAN_NODE锛変繚鎸佷笉鍙樸傚氨鐩存帴杩斿洖锛坆reak锛夈 -*/ + */ void J1939_CAN_Transmit(J1939_MESSAGE_t *MsgPtr) { switch (Can_Node) { @@ -118,21 +119,21 @@ void J1939_CAN_Transmit(J1939_MESSAGE_t *MsgPtr) } } } + /* -*杈撳叆锛 *MsgPtr 鏁版嵁瑕佸瓨鍏ョ殑鍐呭瓨鐨勬寚閽 -*杈撳嚭锛 1 | 0 -*璇存槑锛 璇诲彇CAN椹卞姩鐨勬暟鎹紝濡傛灉娌℃湁鏁版嵁锛岃繑鍥0 + * 杈撳叆锛*MsgPtr 鏁版嵁瑕佸瓨鍏ョ殑鍐呭瓨鐨勬寚閽 + * 杈撳嚭锛 1 | 0 + * 璇存槑锛 璇诲彇CAN椹卞姩鐨勬暟鎹紝濡傛灉娌℃湁鏁版嵁锛岃繑鍥0 灏咰AN涓殑鏁版嵁鍙栧嚭锛屽瓨鍏1939_MESSAGE缁撴瀯浣撲腑 榛樿鏀寔4璺疌AN纭欢鐨勬敹鍙戙傚灏戜簬4璺紝鍙渶閰嶇疆鐩稿簲鐨凜an_Node寮鍏充唬鐮佸尯锛 鍏朵粬锛圫elect_CAN_NODE锛変繚鎸佷笉鍙樸傚氨鐩存帴杩斿洖锛坮eturn 0锛 -*/ + */ int J1939_CAN_Receive(J1939_MESSAGE_t *MsgPtr) { switch (Can_Node) { case Select_CAN_NODE_1: { if ("浣犵殑浠g爜") { - /* 浣犵殑浠g爜锛屼粠CAN纭欢1 涓皢鏁版嵁璇诲彇鍚庯紝瀛樺叆 MsgPtr */ return 1; } @@ -165,57 +166,61 @@ int J1939_CAN_Receive(J1939_MESSAGE_t *MsgPtr) /*涓嶄娇鐢ㄤ腑鏂ā寮忥紝涓嶅涓嬮潰鐨勫嚱鏁拌繘琛岀Щ妞*/ #if J1939_POLL_ECAN == J1939_FALSE /* -*杈撳叆锛 -*杈撳嚭锛 -*璇存槑锛氫娇鑳芥帴鍙椾腑鏂 -*/ + * 杈撳叆锛 + * 杈撳嚭锛 + * 璇存槑锛氫娇鑳芥帴鍙椾腑鏂 + */ void J1939_RXinterruptEnable() { ; } + /* -*杈撳叆锛 -*杈撳嚭锛 -*璇存槑锛氬け鑳芥帴鍙椾腑鏂 -*/ + * 杈撳叆锛 + * 杈撳嚭锛 + * 璇存槑锛氬け鑳芥帴鍙椾腑鏂 + */ void J1939_RXinterruptDisable() { ; } + /* -*杈撳叆锛 -*杈撳嚭锛 -*璇存槑锛氫娇鑳藉彂閫佷腑鏂 -*/ + * 杈撳叆锛 + * 杈撳嚭锛 + * 璇存槑锛氫娇鑳藉彂閫佷腑鏂 + */ void J1939_TXinterruptEnable() { ; } + /* -*杈撳叆锛 -*杈撳嚭锛 -*璇存槑锛氬け鑳藉彂閫佷腑鏂 -*/ + * 杈撳叆锛 + * 杈撳嚭锛 + * 璇存槑锛氬け鑳藉彂閫佷腑鏂 + */ void J1939_TXinterruptDisable() { ; } + /* -*杈撳叆锛 -*杈撳嚭锛 -*璇存槑锛氳Е鍙戝彂閫佷腑鏂爣鑷翠綅锛屽綋鍗忚鏍堝湪涓柇妯″紡涓嬶紝瑕佸彂閫佹秷鎭紝灏嗚皟鐢ㄦ鍑芥暟锛 - CAN椹卞姩鍑芥暟锛屽氨灏嗙洿鎺ユ妸娑堟伅鍙戦佸嚭鍘伙紝涓嶉渶瑕佸崗璁湪璋冪敤浠讳綍can椹卞姩鍑芥暟 -*/ + * 杈撳叆锛 + * 杈撳嚭锛 + * 璇存槑锛氳Е鍙戝彂閫佷腑鏂爣鑷翠綅锛屽綋鍗忚鏍堝湪涓柇妯″紡涓嬶紝瑕佸彂閫佹秷鎭紝灏嗚皟鐢ㄦ鍑芥暟锛 + CAN椹卞姩鍑芥暟锛屽氨灏嗙洿鎺ユ妸娑堟伅鍙戦佸嚭鍘伙紝涓嶉渶瑕佸崗璁湪璋冪敤浠讳綍can椹卞姩鍑芥暟 + */ void J1939_TXinterruptOk() { ; } + /* -*杈撳叆锛 -*杈撳嚭锛 -*璇存槑锛氭竻闄AN椹卞姩鐩稿叧鐨勪腑鏂骇鐢熸爣璇嗕綅锛屽寘鎷紙鍙戦佷腑鏂爣蹇椾綅锛屾帴鍙椾腑鏂爣 - 蹇椾綅锛宑an鎬荤嚎閿欒鏍囪瘑浣嶏級 -*/ + * 杈撳叆锛 + * 杈撳嚭锛 + * 璇存槑锛氭竻闄AN椹卞姩鐩稿叧鐨勪腑鏂骇鐢熸爣璇嗕綅锛屽寘鎷紙鍙戦佷腑鏂爣蹇椾綅锛屾帴鍙椾腑鏂爣蹇椾綅锛宑an鎬荤嚎閿欒鏍囪瘑浣嶏級 + */ void CAN_identifier_clc() { ; From 7ee160c23a473d3880d2aabdfdf8079928895bed Mon Sep 17 00:00:00 2001 From: TOMMY Date: Sun, 28 Feb 2021 08:51:39 +0800 Subject: [PATCH 7/7] Update readme.md --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index bbc9fd8..a67dcce 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,4 @@ -# 绠杩 +# 绠杩 1. 婧愪唬鐮佷笅杞斤細 >