日志档案

发表于 2008-3-21 15:13:37

1

标签: CAN总线自收发  SJA1000  

CAN总线实验成功(附图)

淘的芯片SJA1000到了后赶快焊了个板子,烧上自收发的程序,一切正常。高兴!接下来是完善程序,多弄几个节点。不说了,上图。

系统分类: 单片机   |   用户分类: 单片机&嵌入式   |   来源: 整理   |   【推荐给朋友】

    阅读(508)    回复(3)  

投一票您将和博主都有获奖机会!

  • ruilog821

    2008-3-21 18:26:40

    顶,能否把设计的原理图几程序发上来,学习一下.

  • q251163748

    2008-3-26 11:10:10

    你发送器用的是不是82C250啊,自收发电路怎么搭建啊 能不能上个原理图啊 谢谢

  • EDN_bear

    2008-3-28 8:38:59

    请楼主有时间给我看看我的程序有什么问题哈 我做了个CAN总线智能节点,但是就是发送不了数据,请教高手看看我的程序有何问题,谢谢哈! 程序部分仅仅是用来发送的,单片机用的STC89C52RC, 但是KEIL中呢,没有该款单片机的型号的,所以我选的AT89C51,不知道这样是不是合适的, SJA1000的复位端/RST与P2.3连,/CS与P2.0相连,下面是程序 #include #define MODE 0xFE00; // SJA1000方式寄存器 #define CMR 0xFE01; // SJA1000命令寄存器 #define SR 0xFE02; // SJA1000状态寄存器 #define IR 0xFE03; // SJA1000中断寄存器 #define IER 0xFE04; // SJA1000验收代码寄存器 ;中断使能寄存器 #define ACR 0xFE10; // SJA1000验收代码寄存器 #define AMR 0xFE14 ; // SJA1000验收屏蔽寄存器 #define BTR0 0xFE06 ; // SJA1000总线定时寄存器0 #define BTR1 0xFE07; // SJA1000总线定时寄存器1 #define OCR 0xFE08 ; // SJA1000输出控制寄存器 #define RBSA 0xFE1E ; // SJA1000接收缓存器起始地址寄存器 #define CDR 0xFE1F; // SJA1000时钟分频寄存器 #define ALC 0xFE0B; // SJA1000丢失仲裁捕获寄存器 #define ECC 0xFE0C; // SJA1000错误代码捕获寄存器 #define CANTXB 0xFE10; // SJA1000发送缓冲区首址 #define CANRXB 0xFE10 ; // SJA1000接收缓冲区首址 #define RXERR 0xFE0E; // SJA1000接收错误寄存器 #define TXERR 0xFE0F ; // SJA1000发送错误寄存器 sbit ACC0 = ACC^0; sbit ACC1 = ACC^1; sbit ACC2 = ACC^2; sbit ACC3 = ACC^3; sbit ACC4 = ACC^4; sbit ACC5 = ACC^5; sbit ACC6 = ACC^6; sbit P23 = P2^3; // SJA1000复位端 unsigned char xdata *Psja1000; // 子函数定义 void INIsja1000(void); // sja1000初始化子程序 void Tdata(void); // 发送数据子程序 main(void) { unsigned long wait; P23=0; // SJA1000复位引脚拉低,进入复位状态 for(wait=0;wait<40000;wait++)//低电平延迟,以便复位 ; P23=1; // SJA1000复位引脚拉高 INIsja1000(); while(1) { Tdata(); for(wait=0;wait<30000;wait++) ; } } //main void INIsja1000(void) { do { Psja1000 = MODE; *Psja1000 = 0x09; } while(ACC0 == 0); // 进入复位模式,对SJA1000进行初始化 Psja1000 = CDR; *Psja1000 = 0x88; // 选择PeliCAN模式,关闭时钟输出(CLKOUT) Psja1000 = IER; *Psja1000 = 0x01; // 中断允许寄存器开放发送中断、溢出中断和错误警告中断 Psja1000 = AMR; // 接收屏蔽寄存器 *Psja1000 = 0xff; Psja1000++; *Psja1000 = 0xff; Psja1000++; *Psja1000 = 0xff; Psja1000++; *Psja1000 = 0xff; Psja1000 = ACR; // 接收代码寄存器 *Psja1000 = 0xff; Psja1000++; *Psja1000 = 0xff; Psja1000++; *Psja1000 = 0xff; Psja1000++; *Psja1000 = 0xff; Psja1000 = BTR0; // 总线定时寄存器 *Psja1000 = 0x31; Psja1000 = BTR1; *Psja1000 = 0x1c; Psja1000 = OCR; // 输出控制寄存器 *Psja1000 = 0xaa; Psja1000 = RBSA; // 接收缓存器起始地址寄存器 *Psja1000 = 0x00; Psja1000 = TXERR; // 发送错误计数寄存器 *Psja1000 = 0x00; Psja1000 = ECC; // 错误代码捕捉寄存器,清除错误代码捕捉寄存器 ACC = *Psja1000; Psja1000 = MODE; // 设置双滤波接收方式,并返回工作状态 *Psja1000 = 0x08; } // INIsja1000 void Tdata(void) { do { Psja1000 = SR; ACC = *Psja1000; } while(ACC4 ==1); // 判断是否正在接收正在接收则等待 do { Psja1000 = SR; ACC = *Psja1000; } while(ACC3 ==0); // 判断上次发送是否完成未完成则等待发送完成 do { Psja1000 = SR; ACC = *Psja1000; } while(ACC2 ==0); // 判断发送缓冲区是否锁定锁定则等待 Psja1000 = CANTXB; // SJA1000 发送缓存区首址 *Psja1000 =0x84; Psja1000++; *Psja1000 =0xf3; Psja1000++; *Psja1000 =0xff; Psja1000++; // 29 ID *Psja1000 =0xff; Psja1000++; *Psja1000 =0xf0; Psja1000++; *Psja1000 =0x12; Psja1000++; *Psja1000 =0x34; Psja1000++; // 数据 *Psja1000 =0x56; Psja1000++; *Psja1000 =0x78; Psja1000 = CMR; *Psja1000 =0x01; // 发送数据 } // tdata