📄 sja100_can_rx.asm
字号:
MOVLW 0EH
MOVWF PORTD
CALL WRREG
MOVLW 22H
MOVWF PORTD
CALL WRREG1
;*************************第四个数据,33H**********************************
MOVLW 0FH
MOVWF PORTD
CALL WRREG
MOVLW 33H
MOVWF PORTD
CALL WRREG1
;**************************第五个数据,44H*********************************
MOVLW 010H
MOVWF PORTD
CALL WRREG
MOVLW 44H
MOVWF PORTD
CALL WRREG1
;**************************第六个数据,55H*********************************
MOVLW 011H
MOVWF PORTD
CALL WRREG
MOVLW 55H
MOVWF PORTD
CALL WRREG1
;***************************第七个数据,66H*******************************
MOVLW 012H
MOVWF PORTD
CALL WRREG
MOVLW 66H
MOVWF PORTD
CALL WRREG1
;***************************第八个数据,77H********************************
MOVLW 013H
MOVWF PORTD
CALL WRREG
MOVLW 77H
MOVWF PORTD
CALL WRREG1
;****************************启动发送位发送数据***************************
MOVLW 01H
MOVWF PORTD
CALL WRREG
MOVLW 01H
MOVWF PORTD
CALL WRREG1
BSF SJALE
RETURN
;***************************发送子程序结束********************************
;***************************发送子程序结束********************************
;***************************发送子程序结束********************************
;***************************发送子程序结束********************************
;***********读状态寄存器的值********************
RDSR
MOVLW 00H
MOVWF TRISD
MOVLW 02H
MOVWF PORTD
BSF SJCS
BSF SJALE
BSF SJRD
BSF SJWR
NOP
BCF SJALE
BCF SJCS
BCF SJRD
NOP
MOVLW 0FFH
MOVWF TRISD
NOP
MOVFF PORTD,BPORTD
RETURN
;******************读中断寄存器的值*********************************
RDIR
MOVLW 00H
MOVWF TRISD
MOVLW 03H
MOVWF PORTD
BSF SJCS
BSF SJALE
BSF SJRD
BSF SJWR
NOP
BCF SJALE
BCF SJCS
BCF SJRD
NOP
MOVLW 0FFH
MOVWF TRISD
NOP
MOVFF PORTD,BPORTD
RETURN
;******************读仲裁丢失寄存器的值*********************************
RDALC
MOVLW 00H
MOVWF TRISD
MOVLW 0BH
MOVWF PORTD
BSF SJCS
BSF SJALE
BSF SJRD
BSF SJWR
NOP
BCF SJALE
BCF SJCS
BCF SJRD
NOP
MOVLW 0FFH
MOVWF TRISD
RETURN
;******************读错误代码捕捉寄存器的值*********************************
RDECC
MOVLW 00H
MOVWF TRISD
MOVLW 0CH
MOVWF PORTD
BSF SJCS
BSF SJALE
BSF SJRD
BSF SJWR
NOP
BCF SJALE
BCF SJCS
BCF SJRD
NOP
MOVLW 0FFH
MOVWF TRISD
RETURN
;******************************************************
RECDATA
CALL RDSR
MOVLW 3CH
CPFSEQ BPORTD
GOTO PROC
RETURN
PROC
BTFSC BPORTD,7 ;状态寄存器第七位为1,总线关闭
GOTO BUSEER ;总线关闭,调用总线错误处理程序
GOTO PROC1 ;总线开启,继续处理
PROC1
CALL RDIR ;读中断寄存器
BTFSC BPORTD,3 ;IR.3为1,数据溢出中断
GOTO OVER ;IR.3为1,调用数据溢出处理程序
GOTO OTHER ;IR.3为0,数据没有溢出,继续处理
OTHER
BTFSS BPORTD,0 ;IR.0为1,接收FIFO满或者接收中断使能
GOTO RECOUT ;IR.0为0,接收FIFO无数据,退出接收
GOTO RECE
RECE
CALL TDATA1
MOVLW 00H
MOVWF TRISD
MOVLW 15H
MOVWF PORTD
BSF SJCS
BSF SJALE
BSF SJRD
BSF SJWR
NOP
BCF SJALE
BCF SJCS
BCF SJRD
NOP
MOVLW 0FFH
MOVWF TRISD
MOVFF PORTD,BPORTD
BTFSC BPORTD,4
GOTO TS ;如果为远程帧,则发送对方请求的数据
CALL RDATA
;******************判断收到的数据,用状态灯显示
MOVLW 00H
MOVWF TRISD
BTFSS REBUFF8,0
CALL LED0
BTFSS REBUFF8,1
CALL LED1
BTFSS REBUFF8,2
CALL LED2
BTFSS REBUFF8,3
CALL LED3
BTFSS REBUFF8,4
CALL LED4
BTFSS REBUFF8,5
CALL LED5
BTFSS REBUFF8,6
CALL LED6
BTFSS REBUFF8,7
CALL LED7
RETURN
RDATA
MOVLW 00H ;接收八个数据字节,送入自己定义的寄存器中
MOVWF TRISD
MOVLW 16H
MOVWF PORTD
CALL RDATA1
MOVFF PORTD,REBUFF1
MOVLW 00H
MOVWF TRISD
MOVLW 17H
MOVWF PORTD
CALL RDATA1
MOVFF PORTD,REBUFF2
MOVLW 00H
MOVWF TRISD
MOVLW 18H
MOVWF PORTD
CALL RDATA1
MOVFF PORTD,REBUFF3
MOVLW 00H
MOVWF TRISD
MOVLW 19H
MOVWF PORTD
CALL RDATA1
MOVFF PORTD,REBUFF4
MOVLW 00H
MOVWF TRISD
MOVLW 1AH
MOVWF PORTD
CALL RDATA1
MOVFF PORTD,REBUFF5
MOVLW 00H
MOVWF TRISD
MOVLW 1BH
MOVWF PORTD
CALL RDATA1
MOVFF PORTD,REBUFF6
MOVLW 00H
MOVWF TRISD
MOVLW 1CH
MOVWF PORTD
CALL RDATA1
MOVFF PORTD,REBUFF7
MOVLW 00H
MOVWF TRISD
MOVLW 1DH
MOVWF PORTD
CALL RDATA1
MOVFF PORTD,REBUFF8
MOVLW 00H ;数据接收结束,释放接收缓冲区
MOVWF TRISD
MOVLW 01H
MOVWF PORTD
CALL WRREG
MOVLW 04H
MOVWF PORTD
CALL WRREG1
RETURN
RDATA1
BSF SJCS
BSF SJALE
BSF SJRD
BSF SJWR
NOP
BCF SJALE
BCF SJCS
BCF SJRD
NOP
MOVLW 0FFH
MOVWF TRISD
RETURN
;*******************发送远程帧请求的数据**************************
TS
MOVLW 00H
MOVWF TRISD
MOVLW 01H
MOVWF PORTD
CALL WRREG
MOVLW 04H
MOVWF PORTD
CALL WRREG1
NOP
CALL TDATA1
CALL RECOUT
RETURN
RECOUT ;退出接收
CALL RDALC
CALL RDECC
RETURN
OVER ;数据溢出处理程序
MOVLW 00H
MOVWF TRISD
MOVLW 01H
MOVWF PORTD
CALL WRREG
MOVLW 0CH
MOVWF PORTD
CALL WRREG1
RETURN
;**********************总线错误处理程序**********************************
BUSEER
CALL RDIR ;******读中断寄存器使之复位
;***********************将方式寄存器复位**************************************
MOVLW 00H
MOVWF TRISD
MOVLW 00H
MOVWF PORTD
CALL WRREG
MOVLW 0FEH
MOVWF PORTD
CALL WRREG1
RETURN
;***********************总线错误处理程序结束**********************************
;****************************主程序开始******************************************************
main_p code 0x0700
INIT NOP
CLRF INTCON
CLRF INTCON2
CLRF INTCON3 ;清除中断寄存器
CALL PORT_Init
CALL SJA1000_INT0
NOP
NOP
BCF COMM_LED
CALL DELY
BSF COMM_LED
;*****************接收数据程序************************************************************
REPET
CALL RECDATA
NOP
NOP
GOTO REPET
GOTO INIT
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -