打印
[CAN-bus/DeviceNet]

请哪位大虾般我改下这程序

[复制链接]
2137|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hxiaon|  楼主 | 2007-2-2 15:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define  _INTRPSW 0X25
#define  _CAN1_ADDR 0X4700
#define  uchar unsigned char
#define  uint unsigned int
uchar xdata *canport;
/*CAN控制器的初始化*/
Init_CAN()
{
    uchar i;
    //P1=0xff;
         canport=_CAN1_ADDR;
    *canport=0x09;
    *(canport+31)=0x80;
    for(i=0;i<8;i++)
        *(canport+16+i)=0xff;
    i=Can_SD;                //将源地址放好
    *(canport+18)=i;           //其他相关设置见资料
    *(canport+22)=0;
    *(canport+6)=0x71;
    *(canport+7)=0xb4;
    *(canport+8)=0x1a;
    *(canport+4)=_INTRPSW;
    *canport=0x08;
}

请问改下哪 ,能让芯片的CLKOUT脚输出与晶振频率一样的输出以驱动另一芯片,我在网上查了好久都没查到.(我的电路图是将P2.7接在片选,我使用的是PeliCAN模式)

相关帖子

沙发
wxj1952| | 2007-2-3 09:08 | 只看该作者

第一个SJA比第二个工作频率高一倍!

当然是改   *(canport+6)=0x71;

把第一个SJA的通信速率降低一半,(或者改第二个SJA的BTR,把第二个SJA通信速率提高一倍)。因为你设置的是SJA2外部频率是SJA1的一半。
  CD.2-CD.0=000 -----输出频率=fosc/2.

使用特权

评论回复
板凳
hxiaon|  楼主 | 2007-2-3 10:07 | 只看该作者

:re

也就是说可以有两种改法:可以改时钟分频器eg:*(canport+31)=0x07;将CLKOUT输出频率改成f=fosc;
也可以改总线时序也就是上楼说的?

使用特权

评论回复
地板
wxj1952| | 2007-2-3 17:55 | 只看该作者

你说的方法简单

是,还是改CDR容易。

使用特权

评论回复
5
hxiaon|  楼主 | 2007-2-4 10:53 | 只看该作者

我不知道时钟输出脚是开路还是接地

我的用外部振荡源的那个不能工作好象,我用另一个给其发送数据后,它不能产生中断,请老师指点,两个片子的初始化都是上面的程序(当然源地址那不同)

使用特权

评论回复
6
wxj1952| | 2007-2-4 12:19 | 只看该作者

很简单

1、看看它的时钟输出端有没有输出。也就是证实一下外部时钟已经输入。
2、单独进行自测试。看能不能发送/接收中断。
3、用SJA2向SJA1发送,看自己有没有发送中断。然后是对方有没有接收中断。

一切正向不行,先反向试试。

使用特权

评论回复
7
hxiaon21| | 2007-2-4 22:46 | 只看该作者

请问

   在自测试时,当给出自发自收的命令后,正常情况下它是先产生发送中断后产生接受中断?会不会造成混淆。是不是只要读中断寄存器就能区分出来。
   根据我的初始化程序,我只使能了3个中断(发送、还有2个错误中断),但是检测到中断脚SJA1的低点平时,我读中断寄存器后发现不是我设置中断使能中的一种。
   所以我考虑先用自测模式,但书上介绍得不详细,自测的流程是怎么样,发送的数据还是放在发送缓冲区,接受的数据还是在那读?

使用特权

评论回复
8
hxiaon|  楼主 | 2007-2-5 11:01 | 只看该作者

WEN

今天我用自测模式时,在初始化中改动*canport=0x0d;以及最后的*canport=0x0c;用的下面的程序
        Can_Send(buf);  //其中的发送命令是 *(canport+1)=0x10;用0x12也试过
        while(INTX1!=0);//查询方式SJA1的中断
        sta1=*(canport+3);//获取IR
        temp=sta1&0x20;   //判断EPI
        if(temp==0x20)
           H_temp=0;       //使一个红色的发光二极管亮
        temp=sta1&0x04;  //判断EI
        if(temp==0x04)
           L_temp=0;       //使一个绿色的发光二极管亮
        temp=sta1&0x01;    //判断RI
        if(temp==0x01)
          {               //接受处理(这里省略)
           }
        while(1);
结果是:红、绿灯都亮, 而接受处理部分没执行,后来我检查了发送中断位发现此中断位置位了;是不是能说明SJA在接收的时候出现了EI和PEI提示错误?

使用特权

评论回复
9
wxj1952| | 2007-2-8 19:17 | 只看该作者

这里到底设置了什么?

 for(i=0;i<8;i++)
        *(canport+16+i)=0xff;

这里到底设置了什么?

Data/ID/ACR/AMR?

使用特权

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

本版积分规则

18

主题

36

帖子

0

粉丝