发表于:2003-08-15 13:27:00
楼主
小弟最近用netbox与can总线协议芯片sja1000相连实现can总线控制,那了一个别人做好的节点(at89c52+sja1000+pca82c250)来做实验。此节点不断发数据,我做的节点接收数据后产生中断,并显示接受到的数据,然后将接受到的数据原样发出去。由于sja是地址和数据线复用,所以我译码产生两个端口,一个端口用来写入地址(此时ALE高),另一个端口读写数据。实验时发现,数据接受发送很正常(有指示灯指示),但显示不对,后来发现用inportb指令读的数都不对,都是什么0x83,0x83....,0x8d..,还是连续的。我想既然接受正常,说明初始化应该没错,因为接受ID是唯一的,但在运行时我读接受ID号却不对,sja1000到底怎么了?
另附上程序:
#include <stdio.h>
#include <dos.h>
#include "netbox.h"
#define AD1 0x300 //ALE有效,允许改地址
#define AD2 0x301 //ALE锁址,可读写SJA100
#define BASE 0x00
#define control BASE+0
#define command BASE+1
#define status BASE+2
#define intp BASE+3
#define accode BASE+4
#define acmask BASE+5
#define bus0 BASE+6
#define bus1 BASE+7
#define outctl BASE+8
#define sendid1 BASE+10
#define sendid2 BASE+11
#define sdata1 BASE+12
#define sdata2 BASE+13
#define sdata3 BASE+14
#define sdata4 BASE+15
#define sdata5 BASE+16
#define sdata6 BASE+17
#define sdata7 BASE+18
#define sdata8 BASE+19
#define revid1 BASE+20
#define revid2 BASE+21
#define rdata1 BASE+22
#define rdata2 BASE+23
#define rdata3 BASE+24
#define rdata4 BASE+25
#define rdata5 BASE+26
#define rdata6 BASE+27
#define rdata7 BASE+28
#define rdata8 BASE+29
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
void can_init();
void InstallRcv();
void interrupt (*Oldhandler)(__CPPARGS);
void interrupt CANRcv(__CPPARGS);
unsigned int Rcvbuf[8];
unsigned int Sendbuf[8];
unsigned int length,j,id,interr;
unsigned int flag;
unsigned char UnMask=0xbf;
unsigned char ISR7=0x40;
int main()
{
unsigned int i;
SetCSAsIO(1,0x300,2,0);
can_init();
InstallRcv();
flag=0;
for(;;)
{
if(flag==0) continue;
outportb(0x21,inportb(0x21)|ISR7);
printf("i am in\n");
flag=0;
for(i=0;i<length;i++)
{
Sendbuf[i]=Rcvbuf[i];
outportb(AD1,BASE+12+i);
outportb(AD2,Sendbuf[i]);
}
outportb(AD1,sendid1);
outportb(AD2,0x01);
outportb(AD1,sendid2);
outportb(AD2,length);
outportb(AD1,command);
outportb(AD2,5);
outportb(0x21,inportb(0x21)&UnMask);
}
return 1;
}
void can_init()
{
outportb(AD1,control);
outportb(AD2,0x01);
outportb(AD1,accode);
outportb(AD2,0x53);
outportb(AD1,acmask);
outportb(AD2,0x00);
outportb(AD1,bus0);
outportb(AD2,0x83);
outportb(AD1,bus1);
outportb(AD2,0x25);
outportb(AD1,outctl);
outportb(AD2,0x3a);
outportb(AD1,control);
outportb(AD2,0x02);
}
void InstallRcv()
{
disable();
Oldhandler=getvect(0x0e);
setvect(0x0e,CANRcv);
enable();
outportb(0x21,inportb(0x21)&UnMask);
}
void interrupt CANRcv(__CPPARGS)
{
unsigned int i,l;
length=0;
outportb(AD1,intp);
interr=inportb(AD2);
outportb(AD1,0x14);
id=inportb(AD2);
outportb(AD1,0x15);
j=inportb(AD2);
l=1;
for(i=0;i<4;i++)
{
if((j&l)==1)
length=length+l;
l*=2;
}
printf("Rcv %d data\n",length);
for(i=0;i<length;i++)
{
outportb(AD1,BASE+22+i);
Rcvbuf[i]=inportb(AD2);
// printf("%d\n ",Rcvbuf[i]);
}
flag=1;
outportb(0x20,0x20);
}
还望高手指教!!!