打印
[CAN-bus/DeviceNet]

求一个C51+SJA1000(PELI模式)完成的C语言CAN通讯程序。

[复制链接]
6684|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大家好方法|  楼主 | 2010-8-8 17:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟想用89S52+SJA1000完成2各节点通讯功能,已经写出Basic模式的C程序,并成功完成通讯功能,但是项目有要求用PELI模式,我在BASic模式上对寄存器等进行了修改,但是没有成功。 想借大家的程序进行参考。 如果大家谁有更改模式的经验,请给小弟提供一些意见。 除了对寄存器的值和地址进行修改,还有什么需要注意的吗?

相关帖子

沙发
sjzzlxy| | 2011-3-16 16:11 | 只看该作者
void Init()
{


        EA=0;
        P2=0xC0;        //读拨码ID
        ucID=P0;        //读P0口ID保存在ucID里
        P2=0X80;
        IER=0X00;        //关闭CAN中断使能
        do
        {
                MODE=0x09;        //设置模式寄存器,进入复位模式
        }
        while(!(MODE&0X01));
        CDR=0Xc0;    //设置时钟分频寄存器  PeliCAN模式,Intel模式,2分频,CLOCKOUT输出有效,旁路输入比较器

        ACR0=ucID;        //设置验收代码寄存器
        ACR2=0;
        ACR1=0;
        ACR3=0;
        AMR0=0X00;        //设置验收屏蔽寄存器
        AMR1=0Xff;
        AMR2=0X00;
        AMR3=0XfF;
        BTR0=0X36;        //设置总线时序寄存器0        10kbps
        BTR1=0X2f;      //设置总线时序寄存器1        位置85%
        OCR=0X1A;       //设置输出控制寄存器  正常输出模式 TX0推挽  TX1悬空
        RBSA=0;                //设置接受缓存起始地址寄存器
        TXERR=0;        //清零发送错误计数寄存器
        RXERR=0;        //清零接收错误计数寄存器
        CMR=0X0e;        //清除数据溢出状态位、释放接收缓冲器、取消等待中的发送请求

        do
        {
                MODE=0X00;        /*返回工作模式
                                  MODE.3=0:双滤波;MODE.3=1:单滤波*/
        }
        while(MODE&0X08);
        IER=0X0D;        //设置中断使能寄存器(数据溢出中断使能、出错报警中断使能、结束中断使能)
}

使用特权

评论回复
板凳
sjzzlxy| | 2011-3-16 16:12 | 只看该作者
2# sjzzlxy
我的PELI模式的初始化用的就是SJA1000

使用特权

评论回复
地板
yulri| | 2011-5-12 22:27 | 只看该作者
标记下

使用特权

评论回复
5
dzxc| | 2011-5-13 20:18 | 只看该作者
扩展桢啊,有必要吗?11位的ID还不够用?

使用特权

评论回复
6
6091820503| | 2011-5-20 22:53 | 只看该作者
厉害

使用特权

评论回复
7
aywyk| | 2011-5-21 16:32 | 只看该作者
void Basic_caninit(void)
{
        unchar bdata state;
        do{
                SJA_CR = RM_BIT;        //将模式寄存器的复位
                state = SJA_CR;
        }                
        while( !(state & RM_BIT) ); //确保模式寄存器为复位状态
   
        SJA_CDR  = CLKOff_BIT;// CDR.3=1--时钟关闭, .7=0---basic CAN, .7=1---Peli CAN
    SJA_BTR0 = 0x03;
    SJA_BTR1 = 0xb2;//16M晶振,波特率125Kbps
    SJA_CR  |= RIE_BIT;// .0=1--接收中断使能;  .1=0--关闭发送中断使能
    SJA_OCR  = NormalMode|Tx0PullDn|OCPOL1_BIT|Tx1PullUp;// 配置输出控制寄存器
    SJA_CMR  = RRB_BIT;//释放接收缓冲器

    SJA_ACR  = 0xff;
        SJA_AMR  = 0x00;

        do{
                SJA_CR = RIE_BIT;
                state = SJA_CR;
        }
        while( (state & RM_BIT) ); //
}

这是前些天自己修改的SJA1000tBASIC CAN模式下的初始化程序,程序已经过实验,可以工作

使用特权

评论回复
8
hanbinghe| | 2011-6-16 16:26 | 只看该作者
正在研究这个,看周立功的一个应用说明,,“P89C52单片机的P1.6口作为SJA1000的硬件复位IO口,SJA1000的片选地址为P2.7口,由于SJA1000与微处理器的接口是以外部存储器的方式,所以以下的基址定义为0X7F00,用户应根据自己的实际电路来进行调整”---这里的7F00地址会影响到那些设置?
我要用的是PELI模式。

使用特权

评论回复
9
柠檬恋上雨| | 2011-8-2 14:27 | 只看该作者
片选CS和SJA1000的内部寄存器地址

使用特权

评论回复
10
yulri| | 2012-2-13 14:53 | 只看该作者
mark!!

使用特权

评论回复
11
zhou320801| | 2012-6-30 13:25 | 只看该作者
mark

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

8

帖子

1

粉丝