?? sja_bcanfunc.asm
字號:
MOV A, @R0 ;ID號的低3位 \RTR位 \數(shù)據(jù)長度DLC
DEC R0 ;恢復(fù)指針指向發(fā)送數(shù)據(jù)的首地址
MOV DPTR, #REG_TxBuffer1;發(fā)送緩沖區(qū)首地址
JB ACC.4, BCAN_WYB ;遠程幀
;數(shù)據(jù)幀
ANL A, #0FH ;計算發(fā)送數(shù)據(jù)的長度
ADD A, #02H
MOV R7, A
AJMP BCAN_WRTXBUF ;
BCAN_WYB:
MOV R7, #02 ;寫入發(fā)送緩沖區(qū)數(shù)據(jù)長度為2
BCAN_WRTXBUF:
MOV A, @R0 ;開始寫入
MOVX @DPTR, A
SETB F0
MOVX A, @DPTR ;校驗寫入的是否正確
XRL A, @R0
JNZ BCAN_DW_QUIT ;寫入錯誤退出
CLR F0 ;正確寫入繼續(xù)
INC R0
INC DPTR
DJNZ R7, BCAN_WRTXBUF ;沒有寫完繼續(xù)
BCAN_DW_QUIT:
RET
;************************************************************************
;*函數(shù): BCAN_DATA_RECEIVE *
;*應(yīng)用資源: DPTR,ACC,R0,R7 ,F0 *
;*參數(shù)說明: R0,存放微處理器保存數(shù)據(jù)緩沖區(qū)的首地址 *
;*返回值: F0=0;接收成功 *
;* F0=1;接收失敗 *
;*說明:CAN控制器接收數(shù)據(jù),僅限于接收數(shù)據(jù) *
;************************************************************************
;*子程序調(diào)用示例: *
;* USER_CODE: ;;用戶代碼 *
;* ----- ----- *
;* MOV R0, #DATA_BUF0 ;;裝入微處理器要發(fā)送數(shù)據(jù)的首地址 *
;* LCALL BCAN_DATA_RECEIVE ;;調(diào)用子程序 *
;* JNB F0, USER_CODE1 ;;成功,繼續(xù)用戶代碼 *
;* LJMP ERROR_PRG ;;失敗,跳到錯誤處理 *
;* *
;* USER_CODE1: *
;* ----- ----- ;;用戶代碼 *
;************************************************************************
BCAN_DATA_RECEIVE:
MOV DPTR, #REG_STATUS
MOVX A, @DPTR
SETB F0
JNB ACC.0, BCAN_DR_QUIT ;判斷報文是否有效
CLR F0
MOV DPTR, #REG_RxBuffer2 ;接收報文的ID號的低3位 \RTR位 \數(shù)據(jù)長度DLC
MOVX A, @DPTR
MOV DPTR, #REG_RxBuffer1 ;接收緩沖區(qū)的首地址
JB ACC.4, BCAN_RCVYB ;接收到的是遠程幀
;數(shù)據(jù)幀
ANL A, #0FH ;計算接收到的數(shù)據(jù)長度
ADD A, #02H ;計算報文的長度
MOV R7, A
AJMP BCAN_RCVDATA
BCAN_RCVYB:
MOV R7, #02 ;遠程幀
BCAN_RCVDATA: ;開始讀取數(shù)據(jù)
MOVX A, @DPTR
MOV @R0, A
INC DPTR
INC R0
DJNZ R7, BCAN_RCVDATA
BCAN_DR_QUIT:
RET
;************************************************************************
;*子程序: BCAN_SET_BANDRATE *
;*應(yīng)用資源: DPTR,ACC,R5,R6,R7,F0 *
;*參數(shù)說明: R7 波特率(Kbit/s) BTR0 BTR1 *
;* 0 20 053H, 02FH *
;* 1 40 087H, 0FFH *
;* 2 50 047H, 02FH *
;* 3 80 083H, 0FFH *
;* 4 100 043H, 02fH *
;* 5 125 03H, 01cH *
;* 6 200 081H, 0faH *
;* 7 250 01H, 01cH *
;* 8 400 080H, 0faH *
;* 9 500 00H, 01cH *
;* 10 666 080H, 0b6H *
;* 11 800 00H, 016H *
;* 12 1000 00H, 014H *
;*返回值: F0,存放返回值 *
;* 0 ;波特率設(shè)置成功 *
;* 1 ;波特率設(shè)置失敗 *
;* *
;*說明:設(shè)置CAN控制器SJA1000通訊波特率.SJA1000的晶振為必須為16MHZ, *
;* 其它晶體的頻率的值的波特率,需自己計算 。該子程序只能用于 *
;* 復(fù)位模式 *
;************************************************************************
;*子程序調(diào)用示例: *
;* USER_CODE: ;;用戶代碼 *
;* ----- ----- *
;* MOV R7, #06 ;;設(shè)置波特率100KBPS *
;* LCALL BCAN_SET_BANDRATE ;;調(diào)用子程序 *
;* JNB F0, USER_CODE1 ;;成功,繼續(xù)用戶代碼 *
;* LJMP ERROR_PRG ;;失敗,跳到錯誤處理 *
;* *
;* USER_CODE1: *
;* ----- ----- ;;用戶代碼 *
;************************************************************************
BCAN_SET_BANDRATE:
MOV A, R7 ;判斷波特率的值是否存在
CLR CY
SUBB A, #13 ;
SETB F0
JNC BCAN_SETBR_QUIT ;輸入的值大于12則不正確
CLR F0
MOV A, R7
RL A
MOV DPTR, #BCAN_SETBR ;查表找出相應(yīng)的預(yù)設(shè)第一個值
MOVC A, @A+DPTR
MOV R5, A ;將數(shù)據(jù)保存
MOV A, R7 ;找出第二個值
RL A
INC A
MOVC A, @A+DPTR
MOV R6, A ;保存值
MOV DPTR, #REG_BTR0 ;裝入波特率預(yù)設(shè)值,同步跳轉(zhuǎn)寬度
;位寬度
MOV A, R5
MOVX @DPTR, A
SETB F0
MOVX A, @DPTR
XRL A, R5 ;判斷寫入是否正確
JNZ BCAN_SETBR_QUIT ;不正確
CLR F0
INC DPTR
MOV A, R6
MOVX @DPTR, A
SETB F0
MOVX A, @DPTR
XRL A, R6 ;判斷寫入是否正確
JNZ BCAN_SETBR_QUIT
CLR F0
BCAN_SETBR_QUIT:
RET
BCAN_SETBR:
DB 053H, 02FH ;20KBPS的預(yù)設(shè)值
DB 087H, 0FFH ;40KBPS的預(yù)設(shè)值
DB 047H, 02FH ;50KBPS的預(yù)設(shè)值
DB 083H, 0FFH ;80KBPS的預(yù)設(shè)值
DB 043H, 02fH ;100KBPS的預(yù)設(shè)值
DB 03H, 01cH ;125KBPS的預(yù)設(shè)值
DB 081H, 0faH ;200KBPS的預(yù)設(shè)值
DB 01H, 01cH ;250KBPS的預(yù)設(shè)值
DB 080H, 0faH ;400KBPS的預(yù)設(shè)值
DB 00H, 01cH ;500KBPS的預(yù)設(shè)值
DB 080H, 0b6H ;666KBPS的預(yù)設(shè)值
DB 00H, 016H ;800KBPS的預(yù)設(shè)值
DB 00H, 014H ;1000KBPS的預(yù)設(shè)值
;************************************************************************
;*子程序: BCAN_SET_OBJECT *
;*應(yīng)用資源: DPTR,ACC,R6,R7,F0 *
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -