控制工程师论坛

现场总线

关于can的一些经验总结 2

xilinxue
xilinxue

2008-11-25

问:SJA1000的双相输出方式具体该如何应用,如果不接PCA250,怎么接到总线上?
答: 还是要接PCA82C250芯片。

问:关于CAN总线供电的请教: 如果用电源耦合能否实现CAN的总线供电?
答:建议用标准双绞线方式;走的人多了,不需要自己研究。

问:光靠标准双绞线怎么能实现总线供电呢?
答:总线供电另外采用独立的电缆,如 DeviceNet 规范;这是国际推荐的标准方式。

问:请问CAN总线两节点间要通信的话,他们的波特率是不是要完全一致?
答:节点有重同步的功能,允许偏差在一定范围内,比如晶振偏差,见SJA1000的位定时文档。

问:请问验收滤波器可不可以屏蔽某些位,就是说不管某些位是什么,只关心其中几位。
答:当然可以啊。


问:我现在调试通过CAN通讯的数据采集板,上位机买的是的PCI_CAN9810卡,用CANalyst分析仪调试自己开发的CAN采集板,我现在调试CAN,还没有调试通,CAN的CS接CPU(P89V51RD)的P2.7(28脚),CAN地址是7fff,应该没错吗?程序如下(用伟福仿真器仿真):
# include<AT89X51.H>
# include<SJA_BCANCONF.H>
# include<SJA_BCANFUNC.C>

# define    uchar    unsigned char

void    InitCpu(void);
void    InitT0(void);
void    Sja1000Init(void);

bit    SecFlag;
//uchar    data    a[5];
uchar    data    SendData[10],RcvData[10];
uchar    DataBuf,SecData,Second;
uchar    data    TmodData;
uchar    bdata    FlagInit;
sbit    RcvFlag=FlagInit^0;
sbit    ErrFlag=FlagInit^2;

void    main(void)
{
    //int    i;
    //for(i=0;i<100;i++)
    //P1_4=1;
    Sja1000Init();
    InitT0();
    InitCpu();
//    flaginit();
    while(1)
    {
        if(RcvFlag)
        {
            RcvFlag=0;
            BCAN_DATA_RECEIVE(RcvData);
            BCAN_CMD_PRG(0x04);    //release buffer
        }
        if(SecFlag)
        {
            SecFlag=0;
            SendData[0]=0xaa;   //send canid
            SendData[1]=0x08;   //send longth
            SendData[2]=Second;  //send data
            BCAN_DATA_WRITE(SendData);
            BCAN_CMD_PRG(0x01);
        }
        if(ErrFlag)
        {
            ErrFlag=0;
            Sja1000Init();
        }
    }
}

void    Ex0Int(void) interrupt 0 using 1
{
    SJA_BCANAdr=REG_INTERRUPT;
    FlagInit=*SJA_BCANAdr;
}

void    T0Init(void)    interrupt 1 using 2
{
    TR0=0;
    SecData--;
    if(SecData==0)
    {
        SecData=0x10;
        TH0=0x80;
        TL0=0x60;
        SecFlag=1;
        Second++;
    }
    TR0=1;
}

void    InitCpu(void)
{
    PX0=1;
    IT0=1;
    EX0=1;
    ET0=1;
    EA=1;
    SecData=0x10;
}

void    InitT0(void)
{
    TmodData =TMOD;
    TmodData &=0xf0;
    TmodData │=0x01;
    TMOD =TmodData;
    TH0 =0x80;
    TL0 =0x60;
    TR0 =1;
    SecData=0x20;
    Second=0x00;
}

void    Sja1000Init(void)
{
    BCAN_ENTER_RETMODEL();
    BCAN_SET_BANDRATE(0x04); //100k
    BCAN_SET_OBJECT(0xaa,0xff);
    BCAN_SET_OUTCLK(0xaa,0x48);
    BCAN_QUIT_RETMODEL();
    SJA_BCANAdr =REG_CONTROL;
    *SJA_BCANAdr │= 0x0a;    //
}
现在用示波器测CAN_H和CAN_L,没有信号,请问是什么问题?

注:这个参考一下吧,呵呵


问: 请教各位大虾:有没有CAN局部测试程或意见?急需!!谢谢!!!
有没有人能给他的自测程序给我看看?帮帮我呀!
答:网上有basicCAN例程,CANstarter-I 工具中有PeliCAN例程。

回帖

评论5

总共 , 当前 /
首页 | 登录 | 注册 | 返回顶部↑
手机版 | 电脑版
版权所有 Copyright(C) 2016 CE China