?? can591_pelifunc.asm
字號:
SJASETAMR6:
MOV R7,#SJA_SETAMR_ERR
RET
;/*
;***********************************************************************************************************************
;*子程序: SJASetBandRateStandard
;;*應用資源: R7,R6,R5,ACC,F0,DPTR,CY
;*參數說明: R7 標準常用波特率(Kbps)
;* 0 20
;* 1 40
;* 2 50
;* 3 80
;* 4 100
;* 5 125
;* 6 200
;* 7 250
;* 8 400
;* 9 500
;* 10 666
;* 11 800
;* 12 1000
;*返回值: R7
;* SJA_OK ; 設置總線定時器成功
;* SJA_SETBTR_ERR ; 設置總線定時器錯
;* SJA_NOBTRSIZE ;波特率不能設為此值
;;* SJA_NOTRSTMODE ; CAN591不在復位模式
;*說明: 該子程序用于設定在系統晶體為12MHZ時,常用的標準波特率的值。
;* 參數BandRateSize只能為0~12,其它的值會返回SJA_NOBTRSIZE錯誤
;* 本子程序只能用于復位模式
;***********************************************************************************************************************
;*/
SJASetBandRateStandard:
LCALL SJATestRstMode
JNB F0,SJASETBTR1
MOV R7,#SJA_NOTRSTMODE
RET
SJASETBTR1:
MOV A,R7 ;判斷波特率的值是否存在
CLR CY
SUBB A,#13 ;
JC SJASETBTR2 ;輸入的值大于12則不正確
MOV R7,#SJA_NOBTRSIZE
RET
SJASETBTR2:
MOV A,R7
RL A
MOV DPTR,#BANDRATE_TAB ;查表找出相應的預設第一個值
MOVC A,@A+DPTR
MOV R5,A ;將數據保存
MOV A,R7 ;找出第二個值
RL A
INC A
MOVC A,@A+DPTR
MOV R6,A ;保存值
MOV REG_CANADR,#REG_CAN_BTR0
MOV REG_CANDAT,R5 ;裝入波特率預設值,同步跳轉寬度、位寬度
MOV A,REG_CANDAT
XRL A,R5 ;判斷寫入是否正確
JNZ SJASETBTR3 ;不正確
MOV REG_CANADR,#REG_CAN_BTR1
MOV REG_CANDAT,R6
MOV A,REG_CANDAT
XRL A,R6 ;判斷寫入是否正確
JNZ SJASETBTR3
MOV R7,#SJA_OK
RET
SJASETBTR3:
MOV R7,#SJA_SETBTR_ERR
RET
BANDRATE_TAB:
DB 0D7H, 0FFH ;20KBPS的預設值1
DB 0CBH, 0FFH ;40KBPS的預設值1
DB 047H, 02FH ;50KBPS的預設值
DB 0C5H, 0FFH ;80KBPS的預設值1
DB 0C9H, 0A7H ;100KBPS的預設值1
DB 045H, 2BH ;125KBPS的預設值1
DB 04H, 0A7H ;200KBPS的預設值1
DB 01H, 01CH ;250KBPS的預設值
DB 02H, 025H ;400KBPS的預設值1
DB 01H, 045H ;500KBPS的預設值1
DB 080H, 0b6H ;666KBPS的預設值
DB 00H, 016H ;800KBPS的預設值
DB 01H, 012H ;1000KBPS的預設值1
;/*
;***********************************************************************************************************************
;*子程序: SJAWriteDataToTxBuf
;;*應用資源: R7,R6,,R1,R0,ACC,F0
;;*參數說明: R0 ;存放要發送的數據緩沖區的首址
;;* R1 ;信息的報文描述符結構的的首地址
;;*返回值: R7 ;
;* 0 ; 表示將數據成功的寫到到CAN591的發送緩沖區
;* SJA_TXBUFLOCK ; CAN591發送緩沖區鎖定
;* SJA_WTXBUF_ERR ; 表示寫數據失敗
;*
;*說明: 該子程序用于將要發送到總線的特定幀格式的數據寫入CAN591的發送緩沖區
;***********************************************************************************************************************
;*/
SJAWriteDataToTxBuf:
MOV A,REG_CANSTA
JB ACC.2,SJAWriteDATA
MOV R7,#SJA_TXBUFLOCK
RET
SJAWriteDATA:
MOV A,@R1
JB ACC.6,SJAWriteDTB0 ;遠程幀
JB ACC.7,SJAWriteDTB1 ;擴展幀
;;;以下是標準幀、數據幀
MOV REG_CANADR,#REG_CAN_TXFMINFO
MOV R7,#03
MOV A,@R1
ANL A,#0FH
MOV R6,A
SJAWrite0:
MOV A,@R1
MOV REG_CANDAT,A
INC R1
DJNZ R7,SJAWrite0
SJAWrite1:
MOV A,R6
JZ SJAWriteQuit
SJAWrite2:
MOV A,@R0
MOV REG_CANDAT,A
INC R0
DJNZ R6,SJAWrite2
SJAWriteQuit:
RET
SJAWriteDTB0:
AJMP SJAWriteDTB3
;;以下是擴展幀、數據幀
SJAWriteDTB1:
MOV REG_CANADR,#REG_CAN_TXFMINFO
MOV R7,#05
MOV A,@R1
ANL A,#0FH
MOV R6,A
SJAWrite3:
MOV A,@R1
MOV REG_CANDAT,A
INC R1
DJNZ R7,SJAWrite3
SJAWrite4:
MOV A,R6
JZ SJAWriteQuit
SJAWrite5:
MOV A,@R0
MOV REG_CANDAT,A
INC R0
DJNZ R6,SJAWrite5
RET
;;遠程幀
SJAWriteDTB3:
JB ACC.7,SJAWriteDTB4 ;擴展幀
;;以下是遠程幀、標準幀
MOV REG_CANADR,#REG_CAN_TXFMINFO
MOV R7,#03
SJAWrite6:
MOV REG_CANDAT,@R1
INC R1
DJNZ R7,SJAWrite6
RET
;;以下是遠程幀、擴展幀
SJAWriteDTB4:
MOV REG_CANADR,#REG_CAN_TXFMINFO
MOV R7,#05
SJAWrite7:
MOV A,@R1
MOV REG_CANDAT,A
INC R1
DJNZ R7,SJAWrite7
RET
;/*
;***********************************************************************************************************************
;*子程序: SJAReadDataFromRxBuf
;;*應用資源: R7,R6,,R1,R0,AC
;;*參數說明: R0 ;存放要發送的數據緩沖區的首址
;;* R1 ;信息的報文描述符結構的的首地址
;;*返回值: R7 ;
;* 0 ; 表示將讀取數據成功
;* SJA_RXBUFEMPTY ; CAN591接收緩沖區為空
;* SJA_RRXVUF_ERR ; CAN591接收數據錯
;*
;*說明: 該子程序用于從CAN591讀取數據
;***********************************************************************************************************************
;*/
SJAReadDataFromRxBuf:
MOV A,REG_CANSTA
JB ACC.0,SJAReadData
MOV R7,#SJA_RXBUFEMPTY
RET
SJAReadData:
MOV REG_CANADR,#REG_CAN_RXFMINFO
MOV A,REG_CANDAT
JB ACC.7,SJAReadDataFRB0 ;是否為擴展幀
JB ACC.6,SJAReadDataFRB1 ;是否為遠程幀
;以下是接收數據幀、標準幀
MOV R7,#03
ANL A,#0FH
MOV R6,A
MOV REG_CANADR,#REG_CAN_RXFMINFO
SJAReadData0:
MOV A,REG_CANDAT
MOV @R1,A
INC R1
DJNZ R7,SJAReadData0
SJAReadData1:
MOV A,R6
JZ SJAReadDataQuit
SJAReadData2:
MOV A,REG_CANDAT
MOV @R0,A
INC R0
DJNZ R6,SJAReadData2
SJAReadDataQuit:
RET
SJAReadDataFRB0:
AJMP SJAReadDataFRB2
;;以下為標準幀遠程幀
SJAReadDataFRB1:
MOV R7,#03
MOV REG_CANADR,#REG_CAN_RXFMINFO
SJAReadData3:
MOV A,REG_CANDAT
MOV @R1,A
INC R1
DJNZ R7,SJAReadData3
RET
;;以下為擴展幀
SJAReadDataFRB2:
JB ACC.6,SJAReadDataFRB3 ;是否為遠程幀
;;;以下為擴展幀、數據幀
MOV R7,#05
ANL A,#0FH
MOV R6,A
MOV REG_CANADR,#REG_CAN_RXFMINFO
SJAReadData4:
MOV A,REG_CANDAT
MOV @R1,A
INC R1
DJNZ R7,SJAReadData4
SJAReadData5:
MOV A,R6
JZ SJAReadDataQuit1
SJAReadData6:
MOV A,REG_CANDAT
MOV @R0,A
INC R0
DJNZ R6,SJAReadData6
SJAReadDataQuit1:
RET
;;;以下為擴展幀\遠程幀
SJAReadDataFRB3:
MOV R7,#05
MOV REG_CANADR,#REG_CAN_RXFMINFO
SJAReadData7:
MOV A,REG_CANDAT
MOV @R1,A
INC R1
DJNZ R7,SJAReadData7
RET
;/*
;***********************************************************************************************************************
;*子程序: SJASystemPrgCMD(unsigned char cmd)
;;*應用資源: R7,R6,,R1,R0,ACC,CY,DPTR
;;*參數說明: R7 ;命令字
;;*返回值: R7 ;
;* 0 ; 表示命令執行成功
;* SJA_IMPCMD_ERR ; 表示命令執行出錯
;* SJA_NOTHISCMD ; 沒有此命令
;*
;*說明: 該子程序用于執行CAN591的命令
;***********************************************************************************************************************
;*/
SJASystemPrgCMD:
MOV REG_CANADR,#REG_CAN_CMR
MOV A,R7
CLR CY
CJNE A,#12H,SJASystemPrgCMD0
MOV REG_CANDAT,A
CLR A
MOV R7,A
RET
SJASystemPrgCMD0:
JC SJASystemPrgCMD1
MOV R7,#SJA_NOTHISCMD
RET
SJASystemPrgCMD1:
MOV DPTR,#SJACMD_TAB
MOVC A,@A+DPTR
CJNE A,#0FFH,SJASystemPrgCMD2
MOV R7,#SJA_NOTHISCMD
RET
SJASystemPrgCMD2:
MOV REG_CANADR,#REG_CAN_CMR
MOV REG_CANDAT,A
MOV R7,#00
RET
SJACMD_TAB:
DB 0FFH ;無此命令字
DB 01H ;正常發送
DB 02H ;中止發送
DB 03H ;單次正常發送
DB 04H ;釋放接受緩沖區
DB 0FFH ;
DB 0FFH ;
DB 0FFH ;
DB 08H ;清除數據溢出
DB 0FFH ;
DB 0FFH ;
DB 0FFH ;
DB 0FFH ;
DB 0FFH ;
DB 0FFH ;
DB 0FFH ;
DB 010H ;自我發送請求
DB 0FFH ;
DB 012H ;單次自我發送請求
;/*
;;*******************************************************************************************************************
;* PeliCAN 模式 定義結束
;;*******************************************************************************************************************
;;*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -