5038|7

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

SAEJ1939与SJA1000 [复制链接]

第一次开发CAN总线,由于任务急就用周立功老师开发的“sja1000_Peli”,



请问这个库能用SAEJ1939协议吗?



其中已知PGN=0xFD08,SA=0X3F,



那么“WriteSJARegBlock(16,Recevive_CAN_Filter,8);   //配置验收代码/屏蔽寄存器”时



Recevive_CAN_Filter[8]={0x00,0xfd,0x08,0x3f,0xff,0xff,0xff,0xff};


还是{0x07,0xE8,0x41,0xF8,0xFF,0xFF,0xFF,0xFF};



还是{0x3f,0x08,0xfd,0x00,0xFF,0xFF,0xFF,0xFF}; ?



还是别的?



请帮帮小女子吧!谢谢了先!

最新回复

CANL=750mv ,CANH=2.5v,一般 然后SJA1000的AD0~AD7都有脉冲 为什么就是没有接受中断产生,我用的是AT89C52+SJA1000,16M晶振,独立晶振,SJA1000的clkout=off.  详情 回复 发表于 2010-4-28 17:56
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
CAN是底层的
1939是上层的协议
只要底层支持CAN2.0B就可以了

任务在急也要搞懂一些基本的东西,不然做出来的东西心里也没底
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
呵呵,明白,谢谢提醒。
那写sja1000寄存器时,
J1939中的29位标识符怎么对应“验收代码”的ID.0~ID.28呢?

             P    R  DP   PF     PS   SA
ID帧位置  28~26  25 24  23~16  15~8  7~0

上面是正确的吗?

我用上述的对应关系写寄存器(使用周立功老师开发的“sja1000_Peli”),可是怎么也没有接受中断产生,但是SJA1000的AD0--AD7在不写程序时明显有数据的,所以估计还是程序不对。

各位高手有时间能帮忙指点下吧。还是谢谢先。   
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(中级)

4
 
按照J1939协议跟CAN2.0B规范应该是{0x07,0xE8,0x41,0xF8};

传感器厂家没提供P R DP的值,默认P=110,R=0,DP=0
这样的话就是是{0xC7,0xE8,0x41,0xF8};

这样对吗?真诚的请教看帖的各位兄弟姐妹!!  
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

5
 
建议你先看懂sja1000,在看ZLG的代码
你应该是对sja1000的使用上出了问题

现在集成CAN的单片机很多,为什么要用sja1000
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 
看了SJA1000的使用手册,看了zlg的代码,觉得没什么问题了。

eagle109:可能是我中断处理有问题吧
我先改改试试再说。
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

7
 
亲爱的们,偶觉得偶的程序没得啥问题了,基本上都‘借用’ZLG老师的。
很简单就can-rs485,can就接受然后送485.

#include
#include
#include
#include                                                                                                         //函数库,提供_cror_()右移函数
#include "sja1000_Peli.h"

unsigned char  Recevive_CAN_Filter[8]={0x18,0xfd,0x08,0x3f,0x00,0x00,0x00,0x00}; //PGN=0XFD08  SA=0X3F          
unsigned char  BTR0,BTR1;
unsigned char  isk;
sbit p34 = P3^4;
sbit p35 = P3^5;
sbit p32 = P3^2;
sfr         CKCON=0x8f;                                                                                                //定义时钟控制寄存器
sfr         IPH=0xb7;
unsigned char  Rev_Buffer[13];                                                                                                //存放接收到的数据
unsigned char CAN_ByteRate = 2;
                                       
/*--------------------------------------------------------------------------------------------------------
** 函数原型:        void         SJA1000_Config_Normal(void)                                                
** 功能描述:        对SJA1000的正常模式的初始化配置,进入单元,确定基址:0X7F00H                                               
** 参数说明:        无                                                                              
** 返回值:            无                                                                                 
/*------------------------------------------------------------------------------------------------------*/
SJA1000_Config_Normal()                                                                                                        //正常模式的初始化
{   
        BTR0=0x18;
        BTR1=0x1c;                                                                              //设置为20K波特率通信
        do
        {                                                
                SJAEntryResetMode();                                                                                //进入复位模式
        }
        while(!SJAEntryResetMode());                                       
        WriteSJAReg(REG_CAN_CDR,0xc8);                                                                                //配置时钟分频寄存器,选择PeliCAN模式
        WriteSJAReg(REG_CAN_MOD,0x01);                                                                        //配置模式寄存器,选择双滤波、正常模式
        WriteSJARegBlock(16,Recevive_CAN_Filter,8);                         //配置验收代码/屏蔽寄存器   
        WriteSJAReg(REG_CAN_BTR0,BTR0);                                     //配置总线定时器0                           
        WriteSJAReg(REG_CAN_BTR1,BTR1);                                     //配置总线定时器1
    SJASetBaudrateStandard(CAN_ByteRate);   
        WriteSJAReg(REG_CAN_OCR,0x1a);                                                                            //配置输出管脚                             
        do
        {
            SJAQuitResetMode();                                                 //退出复位模式,进入工作模式
        }
        while(!SJAQuitResetMode());   
}

/*--------------------------------------------------------------------------------------------------------
** 函数原型:        void        Delay_ms(uchar j)
** 功能描述:        该函数用于不精确的延时。在12M,6CLK下,大约延时j*1ms  
** 参数说明:        0-255                                                      
** 返回值:            无
/*------------------------------------------------------------------------------------------------------*/
void        Delay_ms(unsigned char j)
{
          unsigned char        k,l;
          for(l=0;l<=j;l++)
        {
                for(k=0;k<=250;k++)
                 {
                           ;
                 }
        }
}



/*--------------------------------------------------------------------------------------------------------
** 函数原型:        main()
** 功能描述:        主函数,用于初始化MCU相关资源,并显示接收到的数据帧数
** 参数说明:        无                                                      
** 返回值:            无
/*------------------------------------------------------------------------------------------------------*/
main()
{
        CKCON=1;                                                                                                                        //选择6CLK
        TCON=TCON|0x04;                                                                                                                //MCU的INT1下降沿触发,INT0电平触发      
        EA=1;                                                                                                                                //使能MCU总中断       
        IP=1;
        IPH=1;
        TMOD=0x00;
        TH0=0x00;
        TL0=0x00;
        TR0=1;
        ET0=1;   
        Delay_ms(250);                                                                                                                //延时大约1秒
        Delay_ms(250);
        Delay_ms(250);
        Delay_ms(250);                                                                                                                       
    SJA_CS_Point = &CAN_SJA_BaseAdr;                                                                        //确定基址指针的值
        SJA1000_Config_Normal();                                                                                        //调用SJA1000初始化配置函数
        WriteSJAReg(REG_CAN_CMR,4);                                                                //释放SJA1000接收缓冲区
        WriteSJAReg(REG_CAN_IER,0x01);                                                           //使能SJA1000接收中断
        EX0 = 1;                                                                                                                        //打开INT0中断                                  
        while(1)
        {
                if(ReadSJAReg(REG_CAN_RXERR) > 0)
                {
                        p34 = !p34;
                        SJA1000_Config_Normal();
                        WriteSJAReg(REG_CAN_IER,RIE_BIT);                                       //使能SJA1000接收中断
                        EX0 = 1;                                                                                                        //打开INT0中断                                  
                }
        }
}   
                        
/*--------------------------------------------------------------------------------------------------------
** 函数原型:        void        Receive_INTData_Form_CAN (void)        interrupt 0          
** 功能描述:        利用中断方式,接收SJA1000接收缓冲区的数据  
** 参数说明:        无                                                         
** 返回值:            无
/*------------------------------------------------------------------------------------------------------*/
void        SJA1000_INT0(void)        interrupt        0       
{
    EA=0;

    EX0=0;
    p32 = 0;

        if(ReadSJAReg(REG_CAN_IR)&0x01)                                         //产生了接收中断
        {
/*接收数据*/
        REVSJADATA(Rev_Buffer,13);                   // OXC7/0XC8存密度双字节      
                WriteSJAReg(REG_CAN_CMR,4);                                        //释放SJA1000接收缓冲区
        WriteSJAReg(REG_CAN_IER,RIE_BIT);

                P1 &= Rev_Buffer[7];                        //把0xc7单元的数据放P1口
                p34 = 0;                                    //置80C2051的INT0中断标志
            Delay_ms(2);                                // 延迟1ms
                p34 = 1;                                    //关中断
            P1 &= Rev_Buffer[8];                        //把0xc8单元的数据放P1口
                p35 = 0;                                    //置80C2051的INT1中断标志
                Delay_ms(2);                                // 延迟1ms
                p35 = 1;                                    //关中断
        
        }

    ReadSJAReg(REG_CAN_ALC);
    ReadSJAReg(REG_CAN_ECC);
    p32 = 1;
    EX0=1;

    EA=1;
}

以上是其中CAN接受程序。请亲爱的们帮忙看下有啥问题,谢谢。
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

8
 
CANL=750mv ,CANH=2.5v,一般

然后SJA1000的AD0~AD7都有脉冲

为什么就是没有接受中断产生,我用的是AT89C52+SJA1000,16M晶振,独立晶振,SJA1000的clkout=off.
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表