我的程序如下:<br />CR EQU 7F00H; CAN0控制寄存器<br />CMR EQU 7F01H; CAN1命令寄存器地址<br />SR EQU 7F02H; CAN2状态寄存器<br />IR EQU 7F03H; CAN3中断寄存器器<br />ACR EQU 7F04H; CAN4验收代码寄存器<br />AMR EQU 7F05H; CAN5验收屏蔽寄存器<br />BTR0 EQU 7F06H; CAN6总线定时寄存器0<br />BTR1 EQU 7F07H; CAN7总线定时寄存器1<br />OCR EQU 7F08H; CAN8输出控制寄存器<br />TEST EQU 7F09H; CAN9测试寄存器<br />TBSA EQU 7F0AH; CAN10发送缓存器起始地址寄存<br />RBSA EQU 7F14H; CAN20接收缓存器起始地址寄存<br />CDR EQU 7F1FH; CAN31时钟分频器<br />TRDATA EQU 77H; CPU 发送数据区首址数据内容由用户定义<br />SJARst EQU P2.6;<br />LED0 EQU P1.0;<br />LED1 EQU P1.1;<br /> org 0000h<br /> ajmp start<br />start: lcall Rst;<br /> lcall COMMUNATION;<br /> lcall CANINI;<br /> lcall delay;<br /> lcall CAN;<br /> lcall delay;<br /> mov TRDATA,0FDH;<br />loop: lcall TDATA;<br /> sjmp loop;<br />CANINI:MOV DPTR,#CR;控制寄存器<br /> MOV A,#21H;<br /> MOVX @DPTR,A;进入复位模式对SJA1000进行初始化<br /> CLR LED0;<br /> MOVX A,@DPTR;<br /> JB ACC.0,CANINI_OUT;<br /> LCALL CANINI;<br />CANINI_OUT: SETB LED0;<br /> RET;<br />CAN: MOV DPTR,#CDR ;时钟分频寄存器<br /> MOV A,#08H ;选择BasicCAN 模式关闭时钟输出CLKOUT<br /> MOVX @DPTR,A;<br /> MOV DPTR,#ACR;验收代码寄存器<br /> MOV A,#0FFH;<br /> MOVX @DPTR,A;<br /> MOV DPTR,#AMR;验收屏蔽寄存器<br /> MOV A,#0FFH;<br /> MOVX @DPTR,A;<br /> MOV DPTR,#BTR0; 总线定时寄存器0<br /> MOV A,#0C9H;<br /> MOVX @DPTR,A;<br /> MOV DPTR,#BTR1; 总线定时寄存器1<br /> MOV A,#0A3H ;<br /> MOVX @DPTR,A;<br /> MOV DPTR,#OCR;输出控制寄存器<br /> MOV A,#0AAH; 正常输出模式<br /> MOVX @DPTR,A;<br /> MOV DPTR,#RBSA; 接收缓存器起始地址寄存器<br /> MOV A,#0H; 设置接收缓存器FIFO 起始地址为0<br /> MOVX @DPTR,A;<br /> MOV DPTR,#CR; 控制寄存器<br />CAN1: MOV A,#20H; 返回工作状态,开发送中断<br /> MOVX @DPTR,A;<br /> CLR LED0;<br /> MOVX A,@DPTR;<br /> JNB ACC.0,CAN1_OUT<br /> LCALL CAN1;<br />CAN1_OUT:SETB LED0;<br /> RET;<br />TDATA: MOV DPTR,#SR; 状态寄存器<br /> MOVX A,@DPTR; 从SJA1000 读入状态寄存器值<br /> JB ACC.4,TDATA; 判断是否正在接收正在接收则等待<br />TS0: MOVX A,@DPTR;<br /> JNB ACC.3,TS0; 判断上次发送是否完成未完成则等待发送完成<br />TS1: MOVX A,@DPTR;<br /> JNB ACC.2,TS1; 判断发送缓冲区是否锁定锁定则等待<br />TS2: MOV DPTR,#TBSA; SJA1000 发送缓存区首址<br /> MOV A,#82H; ID.10-ID.3信息功能码10,节点号000010<br /> MOVX @DPTR,A;<br /> INC DPTR;<br /> MOV A,#01H; 设置数据帧并且为1个字节<br /> MOV R0,#TRDATA; CPU 发送数据区首址数据内容由用户定义<br />MTBF: MOV A,@R0;<br /> INC DPTR;<br /> MOVX @DPTR,A;<br /> CLR LED1;<br /> MOV DPTR,#CMR ;命令寄存器地址<br /> MOV A,#01H<br /> MOVX @DPTR,A ;启动SJA1000 发送<br /> LCALL delay;<br /> SETB LED1;<br /> RET;<br /><br />delay: mov r1,#50;<br />del0: mov r2,#100;<br />del1: mov r3,#100;<br /> djnz r3,$;<br /> djnz r2,del1;<br /> djnz r1,del0;<br /> ret;<br />Rst:CLR SJARst;<br /> LCALL delay;<br /> SETB SJARst;<br /> LCALL delay;<br /> RET;<br />COMMUNATION: <br /> MOV DPTR, #TEST ;对测试寄存器进行读写测试 <br /> MOV A, #0AAH ;写入值0AAH <br /> MOVX @DPTR, A <br /> CLR LED0 <br /> MOVX A, @DPTR ;读出值<br /> CJNE A, #0AAH,COMMUNATION <br />QUIT: SETB LED0;<br /> RET <br />end<br />请问大家有什么地方不对吗?用P2.7片选,P2.6复位 |
|