搜索
查看: 8196|回复: 8

[分享] 开源的J1939协议栈(移植性强)

[复制链接]

该用户从未签到

1

主题

1

帖子

0

蝴蝶豆

新手上路

最后登录
2017-7-20
发表于 2017-7-20 11:25:07 | 显示全部楼层 |阅读模式


发现一个刚开源的J1939协议栈,亲们相关地址如下:

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

J1939协议栈接口
  • J1939_Initialization(BOOL)
  • J1939_ISR(void)
  • J1939_Poll(unsigned long ElapsedTime)
  • J1939_DequeueMessage(J1939_MESSAGE *MsgPtr)
  • J1939_EnqueueMessage(J1939_MESSAGE *MsgPtr)
源代码分析网址:源代码移植:协议中参考的资料:示例:
  • 轮询模式简单使用示例
  • 备注:接受处理,不是标准的接受处理。这里只是测试接受
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);    }}
  • 中断模式
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 网络管理协议
回复

使用道具 举报

该用户从未签到

35

主题

458

帖子

93

蝴蝶豆

版主

最后登录
2020-9-9
发表于 2017-7-20 12:57:00 | 显示全部楼层
顶,这是can的协议栈?
回复 支持 反对

使用道具 举报

该用户从未签到

29

主题

1285

帖子

59

蝴蝶豆

论坛元老

最后登录
2021-6-27
发表于 2017-7-20 18:19:37 | 显示全部楼层
mark一下备用
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

22

帖子

0

蝴蝶豆

中级会员

最后登录
2024-3-29
发表于 2017-11-22 23:00:12 | 显示全部楼层
感谢大神分享   顶一个
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

91

帖子

22

蝴蝶豆

高级会员

最后登录
2020-9-8
发表于 2018-1-25 20:58:45 | 显示全部楼层
这个不是汽车行业的协议!~赞一个
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1

帖子

0

蝴蝶豆

初级会员

最后登录
2020-5-15
发表于 2018-3-16 10:48:34 | 显示全部楼层
哥们,移植的部分看不到了啊,方便发一下吗,qthomas1988@163.com
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

5

帖子

1

蝴蝶豆

新手上路

最后登录
2018-4-15
发表于 2018-3-22 22:12:14 | 显示全部楼层
移植部份该么做呢?
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

12

帖子

0

蝴蝶豆

初级会员

最后登录
2019-10-8
发表于 2018-7-3 16:46:27 | 显示全部楼层
你好!看了下作者提供的移植说明,还是有部分不太清除,能否指导下!
回复 支持 反对

使用道具 举报

该用户从未签到

62

主题

3651

帖子

100

蝴蝶豆

论坛元老

最后登录
2021-4-30
发表于 2018-12-5 15:26:42 | 显示全部楼层

不错,感谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-20 00:27 , Processed in 1.172880 second(s), 37 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表