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