📄 sja_pelifunc.asm
字号:
MOV R7,#4
MOV REG_CANADR,@R0 ;指针指向模式寄存器
INC R0
SJASETAMR3:
MOV A,@R0
MOV REG_CANDAT,A
DEC REG_CANADR
MOV A,REG_CANDAT
XRL A,@R0
JZ SJASETAMR4
DJNZ R6,SJASETAMR3
AJMP SJASETAMR5
SJASETAMR4:
INC DPTR
INC R0
DJNZ R7,SJASETAMR3
CLR F0
SJASETAMR5:
JB F0,SJASETAMR6
MOV R7,#SJA_OK
RET
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 模式 定义结束
;;*******************************************************************************************************************
;;*/
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -