BTRC EQU 30H SAVE_INT_INFO DATA 32H AMRBF EQU 32H ACRBF EQU 36H ERRCT EQU 3BH TXBF EQU 40H RXBF EQU 50H RCV_GOOD BIT 0FH ;成功的接收一帧标志 ERR_FLAG BIT 11H ;监测到错误标志 OVER_FLAG BIT 12H ;超载标志 DS_END_FLAG BIT 13H ;SJA1000发送完成标志 WUI_FLAG BIT 14H ;唤醒SJA1000标志 MODELCT BIT 15H ;工作模式选择标志 STRET BIT 16H ;自检结果标志 CAMOD EQU 4000H CMR EQU 4001H SR EQU 4002H IR EQU 4003H IER EQU 4004H BTR0 EQU 4006H BTR1 EQU 4007H OCR EQU 4008H REGTEST EQU 4009H ALC EQU 400BH ECC EQU 400CH EWLR EQU 400DH RXERR EQU 400EH TXERR EQU 400FH TXB EQU 4010H RXB EQU 4010H ACR EQU 4010H AMR EQU 4014H RMC EQU 401DH RBSA EQU 401EH CDR EQU 401FH
ORG 0000H LJMP MAIN ORG 0013H LJMP PCAN_INT0 ;中断方式访问SJA1000程序
ORG 0100H MAIN: MOV R0,#07fH CLR A MOV @R0,A DJNZ R0,$-1 MOV @R0,A MOV SP,#60H SETB PX1 SETB EX1 SETB EA LCALL DELAY LCALL DELAY
SJA1000_INIT0: MOV ERRCT,#020H LCALL PCAN_TEST JNB F0,OK DJNZ ERRCT,SJA1000_INIT0 WRONG: SJMP $ OK: MOV AMRBF,#0FFH MOV AMRBF+1,#0FFH MOV AMRBF+2,#0FFH MOV AMRBF+3,#0FFH MOV ACRBF,#00H MOV ACRBF+1,#00H MOV ACRBF+2,#00H MOV ACRBF+3,#00H MOV BTRC,#03H SETB BTRC ;选择测试模式 LCALL SJA1000_INIT1 JNB F0,RT_TESTDATA RT_TESTDATA: MOV TXBF,#88H MOV TXBF+1,#0AAH MOV TXBF+2,#55H MOV TXBF+3,#0AAH MOV TXBF+4,#55H MOV TXBF+5,#0AAH MOV TXBF+6,#55H MOV TXBF+7,#0AAH MOV TXBF+8,#55H MOV TXBF+9,#0AAH MOV TXBF+10,#55H MOV TXBF+11,#0AAH MOV TXBF+12,#55H LCALL PCAN_DATA_WRITE NOP NOP LCALL PCAN_DATA_RECEIVE
MOV DPTR,#SR MOVX A,@DPTR JNB DS_END_FLAG,WRONG JNB RCV_GOOD,WRONG SETB STRET ;自收发测试通过 CLR BTRC ;选择正常模式 SJMP $ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;程序功能:测试SJA1000接口是否正常 ;入口条件:无 ;出口 :测试结果F0
PCAN_TEST: MOV DPTR, #REGTEST SETB F0 MOVX A, @DPTR MOV A, #0AAH MOVX @DPTR, A CLR A MOVX A, @DPTR CJNE A, #0AAH,PCAN_CM_QUIT MOV A, #055H MOVX @DPTR, A CLR A MOVX A, @DPTR CJNE A, #055H,PCAN_CM_QUIT CLR A MOVX @DPTR, A CLR F0 PCAN_CM_QUIT: RET
;程序功能:进入复位模式 PCAN_ENTER_RETMODEL: MOV DPTR, #CAMOD MOVX A, @DPTR ORL A, #01H MOVX @DPTR, A CLR F0 MOVX A, @DPTR JB ACC.0, PCAN_ER_QUIT SETB F0 PCAN_ER_QUIT: RET
;程序功能:进入自检模式 PCAN_ENTER_STMODEL: MOV DPTR, #CAMOD MOVX A, @DPTR ORL A, #04H MOVX @DPTR, A CLR F0 MOVX A, @DPTR JB ACC.0, PCAN_ES_QUIT SETB F0 PCAN_ES_QUIT: RET
;程序功能:退出自检模式 PCAN_QUIT_STMODEL: MOV DPTR, #CAMOD MOVX A, @DPTR ANL A, #0F6H MOVX @DPTR, A CLR F0 MOVX A, @DPTR JB ACC.0, PCAN_QS_QUIT SETB F0 PCAN_QS_QUIT: RET
;程序功能:进入工作模式 PCAN_QUIT_RETMODEL: MOV DPTR, #CAMOD MOVX A, @DPTR ANL A, #0FEH MOVX @DPTR, A CLR F0 MOVX A, @DPTR JNB ACC.0, PCAN_QR_QUIT SETB F0 PCAN_QR_QUIT: RET
;程序功能:数据发送 PCAN_DATA_WRITE: TXSB: MOV DPTR,#SR MOVX A,@DPTR JB ACC.4,TXSB TXSB0: MOVX A,@DPTR JNB ACC.3,TXSB0 TXSB1: MOVX A,@DPTR JNB ACC.2,TXSB0 TXSB2: MOV R0,#TXBF MOV DPTR,#TXB MOV A,@R0 JB ACC.6,PCAN_WYB
ANL A,#0FH ADD A,#05H MOV R7,A AJMP PCAN_WRTXBUF
PCAN_WYB: MOV R7,#05H
PCAN_WRTXBUF:
MOV A,@R0 MOVX @DPTR,A INC R0 INC DPTR DJNZ R7,PCAN_WRTXBUF MOV R7,#10H LCALL PCAN_CMD_PRG
PCAN_DW_QUIT: RET
;程序功能:接收数据于内部接收数据缓冲区 PCAN_DATA_RECEIVE: MOV DPTR, #SR MOVX A, @DPTR SETB F0 JNB ACC.0, PCAN_DR_QUIT CLR F0 MOV R0,#RXBF
MOV DPTR, #RXB MOVX A, @DPTR
; JB ACC.6, PCAN_RCVYB
ANL A, #0FH ADD A, #05H MOV R7, A AJMP PCAN_RCVDATA
PCAN_RCVYB: MOV R7, #02
PCAN_RCVDATA: MOVX A, @DPTR MOV @R0, A INC DPTR INC R0 DJNZ R7, PCAN_RCVDATA MOV R7,#04H ;释放接收缓冲区 LCALL PCAN_CMD_PRG MOV DPTR,#ALC MOVX A,@DPTR MOV DPTR,#ECC MOVX A,@DPTR
PCAN_DR_QUIT:
RET
;程序功能:设置SJA1000波特率 晶振12MHZ PCAN_SET_BANDRATE: MOV A, R7 CLR CY SUBB A, #9 SETB F0 JNC PCAN_SETBR_QUIT CLR F0 MOV A, R7 RL A MOV DPTR, #PCAN_SETBR MOVC A, @A+DPTR MOV R5, A MOV A, R7 RL A INC A MOVC A, @A+DPTR MOV R6, A
MOV DPTR, #BTR0
MOV A, R5 MOVX @DPTR, A SETB F0 MOVX A, @DPTR XRL A, R5 JNZ PCAN_SETBR_QUIT CLR F0 INC DPTR MOV A, R6 MOVX @DPTR, A SETB F0 MOVX A, @DPTR XRL A, R6 JNZ PCAN_SETBR_QUIT CLR F0 PCAN_SETBR_QUIT: RET
PCAN_SETBR: DB 65H, 1CH ;10KBPS DB 52H, 1CH ;20KBPS DB 47H, 1CH ;50KBPS DB 43H, 1CH ;100KBPS DB 42H, 1CH ;125KBPS DB 41H, 1CH ;250KBPS DB 40H, 1CH ;500KBPS DB 40H, 16H ;800KBPS DB 40H, 14H ;1000KBPS
;程序功能:写接收码与接收屏蔽码 PCAN_SET_OBJECT: MOV DPTR,#AMR MOV R6,#04H MOV R0,#AMRBF CANI1: MOV A,@R0 MOVX @DPTR,A MOVX A,@DPTR MOV B,A MOV A,@R0 SETB F0 XRL A,B JNZ PCAN_SETO_QUIT INC R0 INC DPTR DJNZ R6,CANI1
MOV DPTR,#ACR MOV R6,#04H MOV R0,#ACRBF CANI2: MOV A,@R0 MOVX @DPTR,A MOVX A,@DPTR MOV B,A MOV A,@R0 SETB F0 XRL A,B JNZ PCAN_SETO_QUIT INC R0 INC DPTR DJNZ R6,CANI2 CLR F0 PCAN_SETO_QUIT: RET
;程序功能:输出模式时钟分频及中断使能设置 PCAN_SET_OUTCLK: MOV DPTR, #OCR MOV A, R7 MOVX @DPTR, A MOV B, A MOVX A, @DPTR SETB F0 CJNE A, B, PCAN_SETOC_QUIT CLR F0 MOV DPTR, #CDR MOV A, R6 MOVX @DPTR, A MOV B, A MOVX A, @DPTR SETB F0 CJNE A, B, PCAN_SETOC_QUIT CLR F0 MOV DPTR, #IER MOV A, R5 MOVX @DPTR, A MOV B, A MOVX A, @DPTR SETB F0 CJNE A, B, PCAN_SETOC_QUIT CLR F0
PCAN_SETOC_QUIT : RET
;程序功能:FIFO起始地址、发送错误计数器、错误代码捕捉器清0
PCAN_CLR_RTRC: MOV DPTR,#RBSA MOV A,#00H MOVX @DPTR,A MOV DPTR,#TXERR MOV A,#00H MOVX @DPTR,A MOV DPTR,#ECC MOVX A,@DPTR RET
;程序功能;命令执行程序
PCAN_CMD_PRG: MOV A, R7 CJNE A, #01, PCAN_CMD1
MOV DPTR, #CMR MOVX @DPTR, A CLR F0 RET
PCAN_CMD1: CJNE A, #02, PCAN_CMD2
MOV DPTR, #SR MOVX A, @DPTR SETB F0 JB ACC.5, PCAN_CMD_QUIT CLR F0 PCAN_CMD_QUIT: RET
PCAN_CMD2: CJNE A, #04, PCAN_CMD3
MOV DPTR, #CMR MOVX @DPTR, A
MOV DPTR, #SR MOVX A, @DPTR SETB F0 JB ACC.0, PCAN_DB_QUIT CLR F0 PCAN_DB_QUIT: RET
PCAN_CMD3: CJNE A, #08, PCAN_CMD4
MOV DPTR, #CMR MOVX @DPTR, A NOP NOP MOV DPTR, #SR MOVX A, @DPTR SETB F0 JB ACC.1, PCAN_DOVER_QUIT CLR F0 PCAN_DOVER_QUIT: RET
PCAN_CMD4: CJNE A, #10H, PCAN_CMD5
MOV DPTR, #CMR MOVX @DPTR, A CLR F0 PCAN_CMD5: RET
;外部中断0 PCAN_INT0: push DPH PUSH DPL PUSH PSW ;PSW,ACC入栈 PUSH ACC MOV DPTR,#IR ;读中断寄存器 MOVX A,@DPTR ; MOV SAVE_INT_INFO,A ;保存中断寄存器的内容 JNB ACC.0,BCAN_INT1 ;接收中断 SETB RCV_GOOD ;置位接收标志 ; LCALL PCAN_DATA_RECEIVE BCAN_INT1: MOV A,SAVE_INT_INFO JNB ACC.1,BCAN_INT2 ;发送中断 SETB DS_END_FLAG ;置位发送标志 BCAN_INT2: MOV A,SAVE_INT_INFO JNB ACC.2,BCAN_INT3 ;错误中断 SETB ERR_FLAG ;置位错误标志 BCAN_INT3: MOV A,SAVE_INT_INFO JNB ACC.3 ,BCAN_INT4 SETB OVER_FLAG ;数据溢出中断 BCAN_INT4: MOV A,SAVE_INT_INFO JNB ACC.4,BCAN_INT5 ;唤醒中断 SETB WUI_FLAG ;唤醒中断处理标志 BCAN_INT5: POP ACC POP PSW POP DPL POP DPH RET
DELAY: MOV R7,#0FFH D1: MOV R6,#0FFH DJNZ R6,$ DJNZ R7,D1 RET
END 这是原程序 还在调试阶段 子程序已经写完 请指教 |