[CAN-bus/DeviceNet] 求一个C51+SJA1000(PELI模式)完成的C语言CAN通讯程序。

[复制链接]
7307|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 | 显示全部楼层
标记下
dzxc 发表于 2011-5-13 20:18 | 显示全部楼层
扩展桢啊,有必要吗?11位的ID还不够用?
6091820503 发表于 2011-5-20 22:53 | 显示全部楼层
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模式下的初始化程序,程序已经过实验,可以工作
hanbinghe 发表于 2011-6-16 16:26 | 显示全部楼层
正在研究这个,看周立功的一个应用说明,,“P89C52单片机的P1.6口作为SJA1000的硬件复位IO口,SJA1000的片选地址为P2.7口,由于SJA1000与微处理器的接口是以外部存储器的方式,所以以下的基址定义为0X7F00,用户应根据自己的实际电路来进行调整”---这里的7F00地址会影响到那些设置?
我要用的是PELI模式。
柠檬恋上雨 发表于 2011-8-2 14:27 | 显示全部楼层
片选CS和SJA1000的内部寄存器地址
yulri 发表于 2012-2-13 14:53 | 显示全部楼层
zhou320801 发表于 2012-6-30 13:25 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

8

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部