系統(tǒng)can地址為550,用于can系統(tǒng)測試,應(yīng)用T0定時器每隔1s向can總線發(fā)送一組數(shù)據(jù):數(shù)據(jù)長度為8個字節(jié),
首字節(jié)為05H,第二個字節(jié)為累加變量,每秒鐘數(shù)值增加1,
本文引用地址:http://m.butianyuan.cn/article/201612/330387.htmCONTROLLER_BASEEQU7E00H;SJA1000的片選地址
RCV_GOODBIT0FH;成功的接收一幀標志
SEC_FLAGBIT010H;一秒到標志
ERR_FLAGBIT011H;監(jiān)測到錯誤標志
SAVE_INT_INFODATA032H;保存SJA1000中斷寄存器的內(nèi)容
SEND_DATA_BUF1DATA040H;發(fā)送緩沖區(qū)
SEND_DATA_BUF2DATA041H
SEND_DATA_BUF3DATA042H
SEND_DATA_BUF4DATA043H
SEND_DATA_BUF5DATA044H
SEND_DATA_BUF6DATA045H
SEND_DATA_BUF7DATA046H
SEND_DATA_BUF8DATA047H
SEND_DATA_BUF9DATA048H
SEND_DATA_BUF10DATA049H
RCV_DATA_BUF1DATA050H;接收緩沖區(qū)
RCV_DATA_BUF2DATA051H
RCV_DATA_BUF3DATA052H
RCV_DATA_BUF4DATA053H
RCV_DATA_BUF5DATA054H
RCV_DATA_BUF6DATA055H
RCV_DATA_BUF7DATA056H
RCV_DATA_BUF8DATA057H
RCV_DATA_BUF9DATA058H
RCV_DATA_BUF10DATA059H
ERROR_STATUSDATA07CH;錯誤狀態(tài)表示
TEST_DATADATA07FH;測試發(fā)送數(shù)據(jù)
;程序開始
ORG0000H
LJMPMAIN;運行主程序
ORG0003H
LJMPBCAN_INT0;中斷方式訪問SJA1000程序
ORG000BH
LJMPT0_INTERRUPT;定時器0中斷
ORG0100H;程序開始
MAIN:
MOVR0,#07fH
CLRA
MOV@R0,A
DJNZR0,$-1
MOV@R0,A
MOVSP,#60H;設(shè)置SP
CLRP2.0;SJA1000退出硬件復(fù)位模式
LCALLSJA1000_INT0;初始化SJA1000
LCALLT0_INIT
CLRP3.4;點亮指示燈
SETBPX0
SETBIT0
SETBEX0
SETBET0
SETBTR0
SETBEA
LOOPER:
JNBRCV_GOOD,LOOPER2;sja1000成功接收一幀,通知CPU處理
CLRRCV_GOOD
LCALLRCVDATA_PRG
LOOPER2:
JNBSEC_FLAG,LOOPER3;一秒時間到,每秒發(fā)送一次
CLRSEC_FLAG
CLRP3.5;點亮指示燈
LCALLSENDDATA_PRG
LOOPER3:
JNBERR_FLAG,LOOPER4;錯誤標志,錯誤處理
CLRERR_FLAG
LCALLERR_PRG
LOOPER4:
AJMPLOOPER
;;;;;;;;;初始化SJA1000;;
SJA1000_INT0:
LCALLBCAN_CREATE_COMMUNATION ;調(diào)用SJA1000接口測試函數(shù)
MOVR7,#04
LCALLBCAN_SET_BANDRATE;設(shè)置波特率為100k
MOVR7,#0A8H;設(shè)置接收報文ID
MOVR6,#0FFH
LCALLBCAN_SET_OBJECT
MOVR7,#0AAH;設(shè)置輸出控制、時鐘分頻;正常輸出模式
MOVR6,#048H;使能內(nèi)部比較器、禁止CLKOUT
LCALLBCAN_SET_OUTCLK;
LCALLBCAN_QUIT_RETMODEL;退出復(fù)位狀態(tài)
MOVDPTR,#REG_CONTROL;開放SJA1000內(nèi)部功能中斷
MOVA,#01EH;中斷開放
MOVX@DPTR,A
CLRF0
RET
;;;;;錯誤信息處理;;;;;;;;;;;;
ERR_PRG:
LCALLBCAN_ENTER_RETMODEL;進入復(fù)位模式
LCALLSJA1000_INT0 ;
MOVERROR_STATUS,#0FCH
RET
;;;;;;;;;接收數(shù)據(jù)處理部分;;;;;
RCVDATA_PRG:
MOVR0,# RCV_DATA_BUF1;微處理器接收首地址
LCALLBCAN_DATA_RECEIVE;調(diào)用接收數(shù)據(jù)子程序
MOVR7,#04H;釋放接收緩沖區(qū)
LCALLBCAN_CMD_PRG;
RET
;;;;;;;;;;;;;;;;;;控制SJA1000向CAN總線發(fā)送數(shù)據(jù)處理部分;;;;;;;;;;;;;;;
SENDDATA_PRG:
MOVR0,#SEND_DATA_BUF1
MOV@R0,#02H
INCR0
MOV@R0,#08H
INCR0
MOV@R0,#05H
MOVA,TEST_DATA
INCR0
MOV@R0,A
MOVR0,#SEND_DATA_BUF1
LCALLBCAN_DATA_WRITE;將要發(fā)送的數(shù)據(jù)送入發(fā)送緩沖區(qū)
MOVR7,#01
LCALLBCAN_CMD_PRG
RET
;;;;;;;;;;定時器0初始化;;;;;;;;;;
T0_INIT:
MOVA,TMOD
ANLA,#0F0H
ORLA,#01H
MOVTMOD,A;T0工作在方式1
MOVTH0,#0FCH;定時周期1MS
MOVTL0,#066H
MOV3AH,#00H
RET
;;;;;;;;;外部中斷0;;;;;;;;;;;
BCAN_INT0:
pushDPH
PUSHDPL
PUSHPSW;PSW,ACC入棧
PUSHACC
USING3;應(yīng)用寄存器第3組
MOVDPTR,#REG_INTERRUPT;讀中斷寄存器
MOVXA,@DPTR;
MOVSAVE_INT_INFO,A;保存中斷寄存器的內(nèi)容
JNBACC.0,BCAN_INT1;接收中斷
SETBRCV_GOOD;置位接收標志
BCAN_INT1:
MOVA,SAVE_INT_INFO
JNBACC.2,BCAN_INT2;錯誤中斷
SETBERR_FLAG;置位錯誤標志
BCAN_INT2:
POPACC
POPPSW
POPDPL
POPDPH
RETI
;;;;;;;;定時器0中斷;;;;
T0_INTERRUPT:
pushDPH
PUSHDPL
PUSHPSW;PSW、ACC入棧
PUSHACC
USING2
MOVTH0,#80H;設(shè)置定時周期0.3S
MOVTL0,#26H
INC3AH
MOVA,3AH
CJNEA,#23H,T0_QUIT;判斷1秒時間是否到
MOV3AH,#00H
INCTEST_DATA;測試發(fā)送的數(shù)據(jù),每1秒加1
SETBSEC_FLAG;置位1秒到標志
T0_QUIT:
POPACC
POPPSW
POPDPL
POPDPH
RETI
BCAN_ENTER_RETMODEL:
MOVDPTR,#REG_CONTROL;控制寄存器訪問
MOVXA,@DPTR;
ORLA,#01H;置位復(fù)位請求
MOVX@DPTR,A;
CLRF0
MOVXA,@DPTR;驗證復(fù)位是否寫入
JBACC.0,BCAN_ER_QUIT
SETBF0;復(fù)位不成功
BCAN_ER_QUIT:
RET
評論