请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

开源的J1939协议栈(移植性强)

[复制链接]
翠儿同学 发布时间:2017-7-20 11:25

; Z- A  O5 B, N: K

( w2 C  E2 G  c3 K: g" t; v! H发现一个刚开源的J1939协议栈,亲们相关地址如下:& C- ^$ M! `$ G. J& ]

. D& H* a, k: W1 e  i2 {& e: [github下载地址:http://github.com/XeiTongXueFlyMe/J1939
简述:
文档分为两个独立的文件,source文件存放协议栈,example存放J1939协议栈的移植示例,每个示例可单独编译运行。将不断的更新移植示例。
协议特性:
  • 易移植(不针对特定的CAN硬件,只要满足CAN2.0B即可)
  • 轻量级(可适应低端的MCU)
  • 支持多任务调用接口(可用于嵌入式系统)
  • 双模式(轮询或者中断,逻辑更加简单明了)
  • 不掉帧(数据采用收发列队缓存)( b7 g+ k& D, x+ l; l
协议格式:
  • UTF-8
  • 本仓库存在两条分支
    • j1939_main 源代码分支
    • master 源代码 + 移植示例分支
      8 c( \# `0 E* u! |# Q( ?

    / \% {; K2 {4 J! b8 S! s- l
J1939协议栈接口
  • J1939_Initialization(BOOL)
  • J1939_ISR(void)
  • J1939_Poll(unsigned long ElapsedTime)
  • J1939_DequeueMessage(J1939_MESSAGE *MsgPtr)
  • J1939_EnqueueMessage(J1939_MESSAGE *MsgPtr)$ M2 e3 Z" d& |. Y" R
源代码分析网址:源代码移植:协议中参考的资料:示例:
  • 轮询模式简单使用示例
  • 备注:接受处理,不是标准的接受处理。这里只是测试接受0 T3 a0 [8 K5 K) {3 R
void main( void ){    can_init();    J1939_Initialization( TRUE );    //等待地址超时    while (J1939_Flags.WaitingForAddressClaimContention)        J1939_Poll(5);    //设备确认总线上没有,竞争地址的设备存在    while (1)    {    /***********************发送数据***************************/        Msg.DataPage                = 0;        Msg.Priority                = J1939_CONTROL_PRIORITY;        Msg.DestinationAddress      = OTHER_NODE;        Msg.DataLength              = 8;        Msg.PDUFormat               = 0xfe;        Msg.Data[0]         = 0xFF;        Msg.Data[1]         = 0xFF;        Msg.Data[2]         = 0xFF;        Msg.Data[3]         = 0xFF;        Msg.Data[4]         = 0xFF;        Msg.Data[5]         = 0xFF;        Msg.Data[6]         = 0xFF;        Msg.Data[7]         = 0xFF;         while (J1939_EnqueueMessage( &Msg ) != RC_SUCCESS)            J1939_Poll(5);     /***********************处理接受数据*************************/        while (RXQueueCount > 0)        {            J1939_DequeueMessage( &Msg );            if (Msg.PDUFormat == 0x01)                //你的功能码;            else if (Msg.PDUFormat == 0x02)                //你的功能码;        }        J1939_Poll(20);    }}
  • 中断模式
    ! O6 s! J5 o1 x
void main(){    can_init();    J1939_Initialization( TRUE );    //等待地址超时    while (J1939_Flags.WaitingForAddressClaimContention)        J1939_Poll(5);    //设备确认总线上没有,竞争地址的设备存在    while (1)    {        //判断接受列队中,存在多少个接受消息(RXQueueCount )        while (RXQueueCount > 0)        {            //读取接受列队中的数据到Msg (出队)            J1939_DequeueMessage( &Msg );            /*判断是否是数据请求帧*/            if (Msg.PDUFormat == J1939_PF_REQUEST)            {                //判断参数群是否被本设备支持                if ((Msg.Data[0] == J1939_PGN0_REQ_ENGINE_SPEED) &&                     (Msg.Data[1] == J1939_PGN1_REQ_ENGINE_SPEED) &&                     (Msg.Data[2] == J1939_PGN2_REQ_ENGINE_SPEED))                {                    if (某种原因不能响应)                    {                        /*********发送不能响应(参考J1939-21)*************/                        Msg.Priority            = J1939_ACK_PRIORITY;                        Msg.DataPage            = 0;                        Msg.PDUFormat           = J1939_PF_ACKNOWLEDGMENT;                        Msg.DestinationAddress  = Msg.SourceAddress;                        Msg.DataLength          = 8;                        Msg.Data[0]         = J1939_NACK_CONTROL_BYTE;                        Msg.Data[1]         = 0xFF;                        Msg.Data[2]         = 0xFF;                        Msg.Data[3]         = 0xFF;                        Msg.Data[4]         = 0xFF;                        Msg.Data[5]         = J1939_PGN0_REQ_ENGINE_SPEED;                        Msg.Data[6]         = J1939_PGN1_REQ_ENGINE_SPEED;                        Msg.Data[7]         = J1939_PGN2_REQ_ENGINE_SPEED;                    }                    else                    {                    /*******************上传相关的参数群*****************/                        Msg.Priority    = J1939_INFO_PRIORITY;                        Msg.DataPage    = J1939_PGN2_REQ_ENGINE_SPEED & 0x01;                        Msg.PDUFormat   = J1939_PGN1_REQ_ENGINE_SPEED;                        Msg.GroupExtension = J1939_PGN0_REQ_ENGINE_SPEED;                        Msg.DataLength  = 1;                        Msg.Data[0]     = EngineSpeed;                    }                    while (J1939_EnqueueMessage( &Msg ) != RC_SUCCESS);                }            }        }    }}协议参考文献:1. SAE J1939 J1939概述2. SAE J1939-01 卡车,大客车控制通信文档(大概的浏览J1939协议的用法)3. SAE J1939-11 物理层文档4. SAE J1939-13 物理层文档5. SAE J1939-15 物理层文档6. SAE J1939-21 数据链路层文档(定义信息帧的数据结构,编码规则)7. SAE J1939-31 网络层文档(定义网络层的链接协议)8. SAE J1939-71 应用层文档(定义常用物理参数格式)9. SAE J1939-73 应用层文档(用于故障诊断)10. SAE J1939-74 应用层文档(可配置信息)11. SAE J1939-75 应用层文档(发电机组和工业设备)12. SAE J1939-81 网络管理协议
7 k7 z( ^, w* x( Q
收藏 9 评论8 发布时间:2017-7-20 11:25

举报

8个回答
Inc_brza 回答时间:2017-7-20 12:57:00
顶,这是can的协议栈?
斜阳 回答时间:2017-7-20 18:19:37
mark一下备用
王力斯 回答时间:2017-11-22 23:00:12
感谢大神分享   顶一个
feiteng0814 回答时间:2018-1-25 20:58:45
这个不是汽车行业的协议!~赞一个
qthomas 回答时间:2018-3-16 10:48:34
哥们,移植的部分看不到了啊,方便发一下吗,qthomas1988@163.com
acquire 回答时间:2018-3-22 22:12:14
移植部份该么做呢?
落落 回答时间:2018-7-3 16:46:27
你好!看了下作者提供的移植说明,还是有部分不太清除,能否指导下!
mmuuss586 回答时间:2018-12-5 15:26:42

& J! b! }. i$ S5 }7 d% a' l+ h不错,感谢分享

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版