打印
[CAN-bus/DeviceNet]

关于CAN总线节点数据发送请教斑竹及各位热心人

[复制链接]
3010|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xwciomp|  楼主 | 2007-3-7 11:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在一个电路板上用3套89C51+SJA1000+PCA82C250构成具有3个节点的通信实验板,现在仅用一个节点进行数据发送实验(还未考虑到数据接收和其它节点,仅是利用一个独立的节点),但是不成功,代码及具体现象如下,请大家帮忙分析,谢谢.
代码如下:
CR      EQU     0000H   ;控制寄存器(BasicCAN)或模式寄存器(PeliCAN)
CMR     EQU     0001H   ;命令寄存器
SR      EQU     0002H   ;状态寄存器
IR      EQU     0003H   ;中断寄存器
ACR     EQU     0004H   ;验收代码寄存器
AMR     EQU     0005H   ;验收屏蔽寄存器
BTR0    EQU     0006H   ;总线时序寄存器0
BTR1    EQU     0007H   ;总线时序寄存器1
OCR     EQU     0008H   ;输出控制寄存器
CDR     EQU     001FH   ;时钟分频寄存器
CANTXB  EQU     000AH   ;发送缓冲区首地址
CANRXB  EQU     0014H   ;接收缓冲区首地址

           ORG    0000H
           SJMP   CANINIT
           ORG    0040H

;***************************CAN初始化******************************
CANINIT:   SETB  P1.1

           MOV    DPTR,#CR   ;开放接收、出错、溢出中断并进入复位模式
           MOV    A,#1BH     ;进入复位模式,对SJA1000开始初始化
           MOVX   @DPTR,A

           MOVX   A,@DPTR    ;判复位请求有效
           JNB    ACC.0,CANINIT
                           
           MOV    DPTR,#ACR  ;接收代码寄存器为03H
           MOV    A,#03H
           MOVX   @DPTR,A

           MOV    DPTR,#AMR  ;接收屏蔽寄存器为0FCH
           MOV    A,#0FCH
           MOVX   @DPTR,A    

           MOV    DPTR,#BTR0
           MOV    A,#00H
           MOVX   @DPTR,A

           MOV    DPTR,#BTR1  ;500Kbps
           MOV    A,#1CH
           MOVX   @DPTR,A

           MOV    DPTR,#OCR   ;正常输出模式
           MOV    A,#0AAH
           MOVX   @DPTR,A

           MOV    DPTR,#CR    ;初始化结束,SJA1000进入工作模式
           MOV    A,#1AH
           MOVX   @DPTR,A
;**************************发送数据***************************
CANSEND:   MOV    DPTR,#SR      ;状态寄存器
           MOVX   A,@DPTR       ;从SJA1000读入状态寄存器值
           JB     ACC.4,CANSEND ;判断是否正在接收,正在接收则等待
           
TS0:       MOVX   A,@DPTR
           JNB    ACC.3,TS0     ;判断上次发送是否完成      

TS1:       MOVX   A,@DPTR
           JNB    ACC.2,TS1     ;判断发送缓冲区是否锁定,锁定则等待
           CPL    P1.0
TS2:       MOV    DPTR,#CANTXB  ;SJA1000发送缓存区首地址
           MOV    A,#03H        ;发送标识符为03的帧数据
           MOVX   @DPTR,A
           INC    DPTR
           MOV    A,#01H        ;发送1个数
           MOVX   @DPTR,A
MTBF:      MOV    A,#0AAH       ;发送数据AA
           INC    DPTR
           MOVX   @DPTR,A
           MOV    DPTR,#CMR
           MOV    A,#01H        ;启动发送
           MOVX   @DPTR,A
           
           LJMP   CANSEND
现象如下:
程序在运行到TS0处就不断循环,跳不出来,此时SR的植是04H,也就是说上次发送总是未完成,不知这是什么原因?请大家帮忙解答.谢谢
还有2个问题:
1:是否单个节点无法调试,也就是说一个节点不能只发送数据,而没有另外一个节点接收么?我感觉不应该是这样.
2:82C250的RS引脚的电阻值应该如何选择,我是用的电位计,怎么判断哪一个阻值使用效果最好呢?
问题就这些,再次感谢大家,恳请大家不吝赐教.

相关帖子

沙发
xwciomp|  楼主 | 2007-3-7 11:54 | 只看该作者

补充说明

补充一下,在SJA1000的TX引脚上始终看不到波形

使用特权

评论回复
板凳
xwciomp|  楼主 | 2007-3-7 13:25 | 只看该作者

补充

翻看以前别人的帖子,用C写的程序,也是死在判断发送完成状态,不知道是否解决了.

使用特权

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

本版积分规则

2

主题

5

帖子

0

粉丝