博主:lg05128018
+加为好友
+发送站内短信
+我的博客精华
闻道有先后,术业有专攻。愿结交更多的电子爱好者。
如果您对我的资料有什么意见或问题可以和我联系。
谢谢指教和建议。您的一言一行是对我的鼓励和支持.
邮箱: lg05128018#163.com
(#------>@)
课程学习 (3)
单片机&嵌入式 (20)
模拟电子 (5)
感悟 (7)
PCB技术 (1)
电子DIY (4)
数字电路 (2)
编程 (10)
2008年份 (26)
2007年份 (33)
· 16*64点阵板装好了
· 我做CAN总线控制板
· MP3解码芯片转接版
· 仪表放大器应用工程师指南
· 单电源运放的偏置和去耦电路设计
更多>>
· 兄弟也给我发一份,我看看,我也跟楼上的一样调不出…
· 博主,能不能给我发一份啊!我调了半天都没有调出…
· 你好!请问可以共享一下你的DAC7611和ADS7818的…
· 哈哈,不错!
·wang1jin
·yueli2032
·电子技术实验室
·唐工
·天天乐(顾工)
·619yhx
日志总数:59 篇
评论数量:154
访问次数:33474
标签: CAN总线自收发 SJA1000
淘的芯片SJA1000到了后赶快焊了个板子,烧上自收发的程序,一切正常。高兴!接下来是完善程序,多弄几个节点。不说了,上图。
系统分类: 单片机 | 用户分类: 单片机&嵌入式 | 来源: 整理 | 【推荐给朋友】
投一票您将和博主都有获奖机会!
欢迎参加STM32系列活动,申请折扣价STM32学习套件,分享22,500元现金大奖
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