我在一个电路板上用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引脚的电阻值应该如何选择,我是用的电位计,怎么判断哪一个阻值使用效果最好呢? 问题就这些,再次感谢大家,恳请大家不吝赐教. |