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

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

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


发现一个刚开源的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 网络管理协议
收藏 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
移植部份该么做呢?
ldh1sky 回答时间:2018-7-3 16:46:27
你好!看了下作者提供的移植说明,还是有部分不太清除,能否指导下!
mmuuss586 回答时间:2018-12-5 15:26:42

不错,感谢分享

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版