|
最简单的CAN测试程序,一个节点发,一个节点收,已经调试通过。 #i nclude <P18F248.INC> ;发送数据是08H
;*************LOCAL MACROS*************** CONFIGURE_MODE MACRO BSF CANCON,REQOP2 ENDM NORMAL_MODE MACRO BCF CANCON,REQOP2 BCF CANCON,REQOP1 BCF CANCON,REQOP0 BCF CANCON,ABAT ENDM
;******************复位矢量中断向量************* ORG 000h NOP GOTO MAIN
;*****************主程序************************* MAIN CALL CLR_BANK ;CLEAR ALL BANK 0,1,2,15 ;**********开始进入传输初始化的设定*************** SETUP MOVLB 0FH ;BANK 15 MOVLW B'11000000' ;ENABLE ALL MOVWF INTCON ;enable gie MOVLW B'00000000' ; MOVWF PIE3 CALL SET_PORT ;set port CALL TXB0_IDENTIFIER ;TXB0 FILTER CALL RXB0_FILTER0 ;RXB0 FILTER0 CALL BAUD_RATE ;50KB/S NORMAL_MODE ;NORMAL MODE
MOVLW 08h ;发数据,现在是08H MOVWF TXB0D0 BSF TXB0CON,TXREQ BTFSS PIR3,TXB0IF ;判断是否发出去 GOTO $-2 BCF PIR3,TXB0IF
STOP NOP GOTO STOP ;******************RXB0 FILTER0**************** ;RXB0_FILTER0 ; STANDARD FRAME ;PORTA 低五位作为ID的高五位 ;********************************************* RXB0_FILTER0 CONFIGURE_MODE BCF RXB0CON,RXM1 BCF RXB0CON,RXM0 ;0,0 FILTER 有效 ;0,1 ONLY STANDARD FRAME ;1,1 RECEIVE ALL ;1,0 ONLY EXTERN FRAME MOVLW B'10101111' MOVWF RXF0SIDH MOVLW b'11100000' MOVWF RXF0SIDL MOVLW B'11111111' ;识别位XXXXX000111 MOVWF RXM0SIDH MOVLW B'11111111' ;全部起作用 MOVWF RXM0SIDL ;进行屏蔽位设定,全部为11 RETURN
;*********设置TXB0 IDENTIFIER*********************** ;TXB0_IDENTIFIER ;*************************************************** TXB0_IDENTIFIER BCF TXB0CON,TXPRI1 BCF TXB0CON,TXPRI0 ;high interrupt MOVLW B'10101111' MOVWF TXB0SIDH MOVLW B'11100000' ;标志位是XXXXX000111 MOVWF TXB0SIDL MOVLW B'00000001' MOVWF TXB0DLC ;数据帧 6,txrtr是零 RETURN
;***********SET_PORT****************************** SET_PORT ;********PORTB******** ;RB0 OUT ;RB1 OUT ;RB2 OUT TXCAN ;RB3 IN RXCAN ;RB4 IN ;RB5 IN ;RB6 ICD2 ;RB7 ICD2 CLRF LATB MOVLW B'00001000' MOVWF TRISB ;*******PORTC********* ;RC0 OUT RC0-RC7 ALL OUT ;RC1 OUT ;RC7 OUT CLRF LATC MOVLW B'00000000' MOVWF TRISC RETURN
;**************BAUD RATE SET****************** ; FOSC =4MHZ ; NOMINAL BIT TIME = 8 TQ ; TQ=2*(BAUD RATE +1)/FOSC ; SYN =1 TQ,PRO=1TQ,PHE1=3TQ,PHE2=3TQ ; BAUD RATE= 50KB/S ; BAUD RATE PRESCALER=00100 ; fosc =4mhz MAX_baud rate=250kb/s ; If fosc=16Mhz ,the max_band=1Mkb/s ;************************************************ BAUD_RATE ;50KB/S CONFIGURE_MODE MOVLW B'00000100' ;BAUD RATE SET MOVWF BRGCON1 MOVLW B'10010000' MOVWF BRGCON2 MOVLW B'00000010' MOVWF BRGCON3 RETURN
;**********CLEAR BANK************************ CLR_BANK LFSR FSR0,00H ;BANK 0 NEXT CLRF POSTINC0 BTFSS FSR0H,0 GOTO NEXT LFSR FSR0,100H NEXT1 CLRF POSTINC0 ;BANK1 BTFSS FSR0H,1 GOTO NEXT1 LFSR FSR0,200H NEXT2 CLRF POSTINC0 ;BANK 2 BTFSS FSR0H,0 GOTO NEXT2 LFSR FSR0,0F00H NEXT3 CLRF POSTINC0 ;BANK 15 BTFSS FSR0L,7 GOTO NEXT3 RETURN END
#i nclude <P18F248.INC> ; 接收数据 ;*************LOCAL MACROS*************** CONFIGURE_MODE MACRO BSF CANCON,REQOP2 ENDM NORMAL_MODE MACRO BCF CANCON,REQOP2 BCF CANCON,REQOP1 BCF CANCON,REQOP0 BCF CANCON,ABAT ENDM
;******************复位矢量中断向量************* ORG 000h NOP GOTO MAIN ORG 0008h RXB0_INTERRUPT BCF RXB0CON,RXFUL ;必须清零,否则会溢出到RXB1D0 BCF PIR3,RXB0IF MOVFF RXB0D0,PORTC ;接收到放到PORTC显示 RETFIE
;*****************主程序************************* MAIN CALL CLR_BANK ;CLEAR ALL BANK 0,1,2,15 ;**********开始进入传输初始化的设定*************** SETUP MOVLB 0FH ;BANK 15 MOVLW B'11000000' ;ENABLE ALL MOVWF INTCON ;enable gie MOVLW B'00000001' ;ONLY ENABLE RXB0IE MOVWF PIE3 CALL SET_PORT ;set port CALL RXB0_FILTER0 ;RXB0 FILTER0 CALL BAUD_RATE ;250KB/S NORMAL_MODE ;NORMAL MODE STOP NOP GOTO STOP ;******************RXB0 FILTER0**************** ;RXB0_FILTER0 ; STANDARD FRAME ;********************************************* RXB0_FILTER0 CONFIGURE_MODE BCF RXB0CON,RXM1 BCF RXB0CON,RXM0 ;0,0 FILTER 有效 ;0,1 ONLY STANDARD FRAME ;1,1 RECEIVE ALL ;1,0 ONLY EXTERN FRAME MOVLW B'10101111' MOVWF RXF0SIDH; MOVLW b'11100000' MOVWF RXF0SIDL MOVLW B'11111111' ;识别位XXXXX000111 MOVWF RXM0SIDH MOVLW B'11111111' ;全部起作用 MOVWF RXM0SIDL ;进行屏蔽位设定,全部为11 RETURN
;***********SET_PORT****************************** SET_PORT ;********PORTB******** ;RB0 OUT ;RB1 OUT ;RB2 OUT TXCAN ;RB3 IN RXCAN ;RB4 IN ;RB5 IN ;RB6 ICD2 ;RB7 ICD2 CLRF LATB MOVLW B'00001000' MOVWF TRISB ;*******PORTC********* ;RC0 OUT RC0-RC7 ALL OUT ;RC1 OUT ;RC7 OUT CLRF LATC MOVLW B'00000000' MOVWF TRISC RETURN ;**************BAUD RATE SET****************** ; FOSC =4MHZ ; NOMINAL BIT TIME = 8 TQ ; TQ=2*(BAUD RATE +1)/FOSC ; SYN =1 TQ,PRO=1TQ,PHE1=3TQ,PHE2=3TQ ; BAUD RATE= 50KB/S ; BAUD RATE PRESCALER=00100 ; fosc =4mhz MAX_baud rate=250kb/s ; If fosc=16Mhz ,the max_band=1Mkb/s ;************************************************ BAUD_RATE ;50KB/S CONFIGURE_MODE MOVLW B'00000100' ;BAUD RATE SET MOVWF BRGCON1 MOVLW B'10010000' MOVWF BRGCON2 MOVLW B'00000010' MOVWF BRGCON3 RETURN
;**********CLEAR BANK************************ CLR_BANK LFSR FSR0,00H ;BANK 0 NEXT CLRF POSTINC0 BTFSS FSR0H,0 GOTO NEXT LFSR FSR0,100H NEXT1 CLRF POSTINC0 ;BANK1 BTFSS FSR0H,1 GOTO NEXT1 LFSR FSR0,200H NEXT2 CLRF POSTINC0 ;BANK 2 BTFSS FSR0H,0 GOTO NEXT2 LFSR FSR0,0F00H NEXT3 CLRF POSTINC0 ;BANK 15 BTFSS FSR0L,7 GOTO NEXT3 RETURN END
|