sja1000到底怎么了? 点击:716 | 回复:2



gongkongedit

    
  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于: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); } 还望高手指教!!!



gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2003-08-11 21:41:00
1楼
我也感兴趣

xlj

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 4回
  • 年度积分:0
  • 历史总积分:54
  • 注册:2003年8月15日
发表于:2003-08-15 13:27:00
2楼
我也感兴趣

热门招聘
相关主题

官方公众号

智造工程师