打印
[CAN-bus/DeviceNet]

在BASIC模式下,只有一个can节点,我该怎么调试?

[复制链接]
3277|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
8yuuu|  楼主 | 2007-9-12 14:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
8yuuu|  楼主 | 2007-9-12 16:17 | 只看该作者

还有,我已经置Transmit Interrupt Enable为1了,为什么我发送一数据包后,SJA1000不产生中断?会有什么原因呢?

我发送的字节是这样的:0x00 0x01 0x22
0x00的意思是ID3--ID10的位总裁都为0.
0x01的意思是ID0--ID2的位总裁都为0,RTR为0,意思这是数据包,DLC0--                       DLC3为1 表示1个数据

数据为0x22

使用特权

评论回复
板凳
桂电飞天鼠| | 2007-9-12 21:21 | 只看该作者

rt

1,Basic一个节点没法做实验,可用Peli模式,其有自测试模式,其程序跟Basic差不了多少的;
2,由于Basic不能通信,所以也没中断可言.

使用特权

评论回复
地板
8yuuu|  楼主 | 2007-9-13 08:17 | 只看该作者

仍然有疑

对于桂电飞天鼠的解答,我仍然有疑问:
1 Basic和Peli模式下的程序差不多?我看datasheet上两种模式的寄存器都不一样,程序会差不多?
2 Basic不能通信?  那不就象是Basic模式名寸实亡

使用特权

评论回复
5
wxj1952| | 2007-9-13 08:23 | 只看该作者

Basic模式可以自测试。

但是需要一些另类方法。好像以前贴过。

使用特权

评论回复
6
桂电飞天鼠| | 2007-9-13 14:08 | 只看该作者

呵呵

1,我说的一样,指的是结构一样,不就是寄存器多一些?
2,另类的测试方法没试过,你试过了希望能够分享一下~~~

使用特权

评论回复
7
wxj1952| | 2007-9-14 09:47 | 只看该作者

其实算不上另类

BASIC模式自测试程序

看起来,SJA1000的BASIC模式没有自测试方式,也就是独立节点的BASIC模式由于没有STM位的设置而不能产生发送中断。这样,一旦节点启动发送,就将不停地重发,使TXERR超过127而产生EI中断,进入迟缓状态,仍然重发不停。

AT命令可以终止节点的重发状态,清除TR,使TBS发送缓冲器状态SR.2由锁定变为释放,这正是一个发送中断触发条件!

因此,下面这段程序,利用AT(CMR=02)命令产生发送中断,并且在中断程序中进行接收。由于CAN控制器的特殊结构,发送的帧信息必然进入接收缓存,所以调试时,观察SJA1000地址20的内容,一定与10内容一样。否则就是软件/硬件(很少故障)设置有问题,主要查OCR寄存器设置内容,......

程序与PELI自测试功能比较,缺陷为不能测试ACR/AMR的作用/设置正确与否。



#pragma SMALL
#include<reg51.h>
#include<sjaregb.h>

#define uchar unsigned char

uchar xdata *SJA_Adr=0x7f00;
#define can_read(RegAdr)  SJA_Adr[RegAdr]
#define can_write(RegAdr,Val) SJA_Adr[RegAdr]=Val


uchar Tbuffer[10]={0x55,0x08,0x41,0x42,0x43,0x44,0x45,0x48,0x49},Rbuffer[10];

bdata uchar TK;
bdata uchar RK;
bdata uchar MK;
sbit ANold=TK^0;

sbit RBF=MK^1;

sbit ANnew=RK^0;

sbit AN=P1^3;
sbit LED0=P1^0;
sbit LED1=P1^1;
sbit LED2=P1^2;

void initial()  
{
   uchar c;
  can_write(CR,0x41);          //复位模式

can_write(CDR,0x4f);
can_write(OC,0x1a); 
can_write(BTR0,0x05);
can_write(BTR1,0xff);
can_write(ACR,0x55);
can_write(AMR,0x00);

can_write(CR,0x04);        //操作模式,发送中断允许,关闭EI中断。
  

void send()          //发送函数
{ uchar j,TBS;
TBS=10;
for (j=0;j<10;j++)
{
can_write(TBS++,TXdata[j]);
}
can_write(CMR,0x01);
}


void receive()         //接收函数
{  
uchar j,RBS;
RBS=20;
for (j=0;j<10;j++)
{
RXdata[j]=can_read(RBS++);
}
can_write(CMR,4);
RBF=0;
}


void delay(uchar abc)

while(--abc);
}


void main(void)
{
uchar c;
LED0=0;
RBF=0;
ANold=AN;
initial();
TCON=0x05;
IE=0x81;

while(1)
{
while(AN==ANold);    //按键变化一次,发送一次
delay(20);    //消抖动
ANold=AN;
Tbuffer[4]=TK;

send();        //发送
delay(10);
can_write(CMR,0x02);    // AT命令产生发送中断
}
}

void int0(void) interrupt 0 using 0
{
  uchar c;
LED1=!LED1;
c=can_read(IR);        // 清除中断
RBF=1;
receive();    接收
RK=Rbuffer[4];
LED2=ANnew;
}
 

使用特权

评论回复
8
8yuuu|  楼主 | 2007-9-14 16:08 | 只看该作者

我还是写了在pelican模式下工作

可是我发现,仍然进不了中断,我中断使能也使能了啊?不知道为什么?
我把初始化过程贴出来,忘指点下缺少了什么步骤吧?
uchar  Config(void)
{
    if(BCAN_CREATE_COMMUNATION())   //检测硬件接触正确性
    return 1;
    if(BCAN_ENTER_RETMODEL())       //进入复位状态
    return 2;
    WriteSJAReg(REG_CDR,0xc8);        //选择PeliCAN模式,禁止分频输出
    WriteSJAReg(REG_MODE,0x05);        //选择双滤波  自收自发模式

    WriteSJAReg(REG_BTR0,0x00);    
    WriteSJAReg(REG_BTR1,0x14);        //波特率
    
    WriteSJAReg(REG_OCR,0x1a);        //设置推挽输出

    WriteSJAReg(REG_ENINTERRUPT,0x03);//设置中断使能

    if(BCAN_QUIT_RETMODEL())        //退出复位状态
    return 3;

    return 0;
}

使用特权

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

本版积分规则

24

主题

68

帖子

0

粉丝