?? bcan1.asm
字號:
;間隔定時發送數據,連續中斷接收報文,成功,01.28 14:51
;中斷連續接收報文通過,01.28 10:41
;有效性通過
;修改波特率設置后通過。01.27 22:26,現可以和PC機通信,要進一步驗證接收數據的有效性。
;;;;*************查詢方式接收*********************成功了15:17
REG_CONTROL EQU 00H ;內部控制寄存器地址;其內容可改變 *
REG_COMMAND EQU 01H ;內部命令寄存器地址; *
REG_STATUS EQU 02H ;內部狀態寄存器地址; *
REG_INTERRUPT EQU 03H ;內部中斷寄存器地址; *
REG_ACR EQU 04H ;內部驗收代碼寄存器地址; *
REG_AMR EQU 05H ;內部驗收屏蔽寄存器地址; *
REG_BTR0 EQU 06H ;總線定時寄存器0 ; *
REG_BTR1 EQU 07H ;總線定時寄存器1 ; *
BIT_SAM EQU 80H ;采樣模式位
REG_OCR EQU 08H ;輸出控制寄存器 *
REG_TEST EQU 09H
;************************************************************************
;*發送緩沖區(內部地址0AH--13H) *
;************************************************************************
REG_TxBuffer1 EQU 0AH ;發送緩沖區1
REG_TxBuffer2 EQU 0BH ;發送緩沖區2
REG_TxBuffer3 EQU 0CH ;發送緩沖區3
REG_TxBuffer4 EQU 0DH ;發送緩沖區4
REG_TxBuffer5 EQU 0EH ;發送緩沖區5
REG_TxBuffer6 EQU 0FH ;發送緩沖區6
REG_TxBuffer7 EQU 010H ;發送緩沖區7
REG_TxBuffer8 EQU 011H ;發送緩沖區8
REG_TxBuffer9 EQU 012H ;發送緩沖區9
REG_TxBuffer10 EQU 013H ;發送緩沖區10
;************************************************************************
;*接收緩沖區(內部地址014H--01DH) *
;************************************************************************
REG_RxBuffer1 EQU 014H ;接收緩沖區1
REG_RxBuffer2 EQU 015H ;接收緩沖區2
REG_RxBuffer3 EQU 016H ;接收緩沖區3
REG_RxBuffer4 EQU 017H ;接收緩沖區4
REG_RxBuffer5 EQU 018H ;接收緩沖區5
REG_RxBuffer6 EQU 019H ;接收緩沖區6
REG_RxBuffer7 EQU 01AH ;接收緩沖區7
REG_RxBuffer8 EQU 01BH ;接收緩沖區8
REG_RxBuffer9 EQU 01CH ;接收緩沖區9
REG_RxBuffer10 EQU 01DH ;接收緩沖區10
REG_CDR EQU 01FH ;時鐘分頻寄存器
;***************************************************************************
;***************************自己加的************
;*******************************************
DATA_BUF0 EQU 030H ;發送數據CPU內部RAM首地址
;*********************************************
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0_INTERRUPT;T0入口地址
ORG 0003H
LJMP CPU_INTERRUPT0;中斷1入口地址
ORG 0050H
MAIN:
;內部RAM 清零
MOV R0,#20H
CLEAR_RAM:
CLR A
MOV @R0,A
INC R0
CJNE R0,#0FFH,CLEAR_RAM
MOV SP,#60H ;設置SP
SJA1000_INIT0:
;MOV ErrorCount,#020H ;32次,報錯
LCALL BCAN_CREATE_COMMUNATION ;調用SJA1000接口測試函數
JB F0,SJA1000_INIT0 ;接口正常,初始化SJA1000
;DJNZ ErrorCount,SJA1000_INIT0;接口不正常,再檢測
;MOV ERROR_STATUS,#SJA_INTFACE_ERR
;LJMP ERROR_HANDLE ;錯誤處理
BCAN_RET: ;進入復位模式
LCALL BCAN_ENTER_RETMODEL
JB F0,BCAN_RET
SJA1000_INIT1:
;設置接收任何類型的標志符,波特率1000Kbps(16MHZ的晶體),關閉CLKOUT則,
;ACR=任何值,AMR=0FFH,BTR0=084H,BTR1=0A7H,OC==0aaH,CDR=048H
;首先設置參數
MOV R7,#05H
;MOV ErrorCount,#020H ;32次,報錯
LCALL BCAN_SET_BANDRATE ;設置波特率為250k
JB F0,SJA1000_INIT1 ;判斷設置是否成功
;DJNZ ErrorCount,SJA1000_INIT1 ;接口不正常,再檢測
;MOV ERROR_STATUS,#SJA_INITBTR_ERR
;LJMP ERROR_HANDLE
SJA1000_INIT2:
;設置輸出控制、時鐘分頻
; MOV ErrorCount,#020H ;32次,報錯
MOV R7,#0AAH ;正常輸出模式
MOV R6,#048H ;使能內部比較器、禁止CLKOUT
LCALL BCAN_SET_OUTCLK ;
JB F0,SJA1000_INIT2 ;判斷設置是否成功
;DJNZ ErrorCount,SJA1000_INIT2
;MOV ERROR_STATUS,#SJA_INITOCLK_ERR
;LJMP ERROR_HANDLE
SJA1000_INIT3:
;設置接收報文ID
;MOV ErrorCount,#020H ;32次,報錯
MOV R7,#00H
MOV R6,#22H
LCALL BCAN_SET_OBJECT
JB F0,SJA1000_INIT3 ;判斷設置是否成功
;DJNZ ErrorCount,SJA1000_INIT2
;MOV ERROR_STATUS,#SJA_INITOBJ_ERR
;LJMP ERROR_HANDLE
SJA1000_INIT4:
;MOV ErrorCount,#020H ;32次,報錯
LCALL BCAN_QUIT_RETMODEL ;退出復位狀態
JB F0,SJA1000_INIT4 ;判斷設置是否成功
;DJNZ ErrorCount,SJA1000_INIT4
;MOV ERROR_STATUS,#0FEH ;#SJA_INIT_ERR
;LJMP ERROR_HANDLE
SJA1000_INIT5:
MOV DPTR,#REG_CONTROL ;開SJA1000內部功能中斷
MOVX A,@DPTR ;接收中斷關閉
ORL A,#02H
MOVX @DPTR,A
NOP
MOVX A,@DPTR
JNB ACC.1,SJA1000_INIT5;ACC.1=1,開通SJA1000接收中斷
;定時500MS發送報文到上位機PC
MOV TMOD,#01H ;選擇T0工作在方式16位 定時器
MOV TH0,#03CH ;500ms定時
MOV TL0,#0AFH
SETB ET0
SETB PX0 ;設置外部中斷0為最高優先級
SETB IT0 ;設置外部中斷位邊緣觸發
SETB EX0 ;開放中斷EXO,總中斷位EA
SETB EA
SETB TR0 ;定時器開始計時
;********************************************************************
;****************接收數據幀******************************************
LOOP:
NOP
AJMP LOOP
T0_INTERRUPT:
CLR EA
CLR TR0
PUSH ACC
PUSH DPL
PUSH DPH
MOV 30H,#66H
MOV 31H,#08H
MOV 32H,#01H
MOV 33H,#02H
MOV 34H,#03H
MOV 35H,#04H
MOV 36H,#05H
MOV 37H,#07H
MOV 38H,#07H
MOV 39H,#08H
BCAN_SENT_DATA:
MOV R0,#DATA_BUF0
LCALL BCAN_DATA_WRITE;向SJA1000寫入數據
JB F0,BCAN_SENT_DATA
BCAN_START_SENT:
LCALL BCAN_CMD_01 ;發送數據
JB F0,BCAN_START_SENT
POP DPH
POP DPL
POP ACC
MOV TH0,#00H ;500ms定時
MOV TL0,#00H
SETB TR0
SETB EA
RETI
CPU_INTERRUPT0:
CLR EA
PUSH ACC
PUSH DPL
PUSH DPH
MOV R0,#40H ;存放接收數據的CPU內部RAM首地址
LCALL BCAN_DATA_RECEIVE
MOV DPTR,#REG_COMMAND;釋放接收緩沖器
ORL A,#04H
MOVX @DPTR,A
POP DPH
POP DPL
POP ACC
SETB EA
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;**********************子程序*******************************************
BCAN_CREATE_COMMUNATION:
MOV DPTR, #REG_TEST ;對測試寄存器進行讀寫測試
MOVX A, @DPTR
MOV A, #0AAH ;寫入值0AAH
MOVX @DPTR, A
SETB F0
MOVX A, @DPTR ;讀出值
CJNE A, #0AAH,BCAN_CM_QUIT ;測試寫入讀出是否正確
MOV A, #055H ;再次測試
MOVX @DPTR, A ;寫入055H
MOVX A, @DPTR
CJNE A, #055H,BCAN_CM_QUIT ;測試寫入讀出是否正確
CLR A ;清零測試寄存器
MOVX @DPTR, A
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -