📄 sja_pelifunc.asm
字号:
;;;//*
;********************************************************************************************************************
;*描述: 带CAN 控制器的单片机P8XC951基本硬件头文件定义 CAN 工作方式)
;*文件名: CAN591_PELIFunc.ASM
;*应用语言: KEIL A51/L51 or Intel A51/L51
;*版本 : V1.0
;*广州周立功单片机发展有限公司 保留所有的版权
;;*******************************************************************************************************************
;;*/
;/*$page;*/
;/*
;;***********************************************************************************************************************
;;* 导入头文件
;;***********************************************************************************************************************
;;*/
$INCLUDE(CAN591_PELICONF.ASM)
;/*
;;***********************************************************************************************************************
;;* 子程序说明
;;***********************************************************************************************************************
;;*/
;/*
;;***********************************************************************************************************************
;;*子程序: SJATestInterface
;;*应用资源: R7,R6,ACC,DPTR,F0
;;*参数说明: R7 ;存放测试值
;;*返回值: R7 ;
;;* SJA_OK ; 表示CAN591接口正常
;;* SJA_INTERFACE_ERR ; 表示CAN591与处理器接口出错
;;*
;;*说明: 该子程序用于检测CAN控制器的接口是否正常
;;***********************************************************************************************************************
;;*/
;/*
;;***********************************************************************************************************************
;;*子程序: SJAEntryResetMode
;;*应用资源: R7,R6,ACR,F0
;;*参数说明: 无
;;*返回值: R7
;;* SJA_OK ; 表示CAN591进入复位模式成功
;;* SJA_ENTRYRESET_ERR ; 表示CAN591进入复位模式失败
;;*
;;*说明: 该子程序用于使CAN591进入复位模式
;;***********************************************************************************************************************
;;*/
SJAEntryResetMode:
MOV R6,#0FFH ;存放重复次数
SETB F0
SJAENTRSTMD0:
MOV A,REG_CANMOD;
SETB ACC.0
MOV REG_CANMOD,A
MOV A,REG_CANMOD
JB ACC.0,SJAENTRSTMD1
DJNZ R6,SJAENTRSTMD0
AJMP SJAENTRSTMD2
SJAENTRSTMD1:
CLR F0
SJAENTRSTMD2:
JB F0,SJAENTRSTMD3
MOV R7,#SJA_OK
RET
SJAENTRSTMD3:
MOV R7,#SJA_ENTRYRESET_ERR
RET
;/*
;;***********************************************************************************************************************
;;*子程序: SJAQuitResetMode
;;*应用资源: R7,R6,ACC,F0
;;*参数说明: 无
;;*返回值: R7
;;* SJA_OK ; 表示CAN591退出复位模式成功
;;* SJA_QUITRESET_ERR ; 表示CAN591退出复位模式失败
;;*
;;*说明: 该子程序用于使CAN591退出复位模式,进入工作模式
;;***********************************************************************************************************************
;;*/
SJAQuitResetMode:
MOV R6,#0FFH ;存放重复次数
SETB F0
SJAQUTRSTMD0:
MOV A,REG_CANMOD
CLR ACC.0 ;请复位请求位
MOV REG_CANMOD,A
MOV A,REG_CANMOD
JNB ACC.0,SJAENTRSTMD1
DJNZ R6,SJAENTRSTMD0
AJMP SJAQUTRSTMD2
SJAQUTRSTMD1:
CLR F0
SJAQUTRSTMD2:
JB F0,SJAQUTRSTMD3
MOV R7,#SJA_OK
RET
SJAQUTRSTMD3:
MOV R7,#SJA_QUITRESET_ERR
RET
;/*
;;***********************************************************************************************************************
;;*子程序: SJATestRstMode
;;*应用资源: ACC,F0
;;*参数说明: 无
;;*返回值: F0
;;* 0 ; 表示CAN591处于复位模式
;;* 1 ; 表示CAN591处于工作模式
;;*
;;*说明: 该子程序用于测试CAN591 处于复位模式还是工作模式
;;***********************************************************************************************************************
;;*/
SJATestRstMode:
SETB F0
MOV A,REG_CANMOD
JNB ACC.0,SJATestRM0
CLR F0
SJATestRM0:
RET
;/*
;;***********************************************************************************************************************
;;*子程序: SJSetCanIER
;;*应用资源: ACC,F0,R7,R6
;;*参数说明: R7 ;存放设定值
;;*返回值: R7
;;** SJA_OK ; 设置中断使能寄存器成功
;;** SJA_SETIER_ERR ; 设置中断使能寄存器失败
;;*
;;*说明: 该函数用于591的CAN中断使能设置
;;***********************************************************************************************************************
;;*/
SJASetCanIER:
MOV R6,#0FFH ;存放重复次数
SETB F0
MOV REG_CANADR,#REG_CAN_IER
SJASETCIRMD0:
MOV REG_CANSTA,R7
MOV A,REG_CANDAT
XRL A,R7
JZ SJASETCIRMD1
DJNZ R6,SJASETCIRMD0
AJMP SJASETCIRMD2
SJASETCIRMD1:
CLR F0
SJASETCIRMD2:
JB F0,SJASETCIRMD3
MOV R7,#SJA_OK
RET
SJASETCIRMD3:
MOV R7,#SJA_SETIER_ERR
RET
;/*
;;***********************************************************************************************************************
;;*子程序: SJASetAccMode
;;*应用资源: ACC,F0,R7,R6
;;*参数说明: R7 ;存放设定值
;;*返回值: R7
;;** SJA_OK ; 设置代码验收滤波器工作模式寄存器成功
;;** SJA_SETACFMODE_ERR ; 设置代码验收滤波器工作模式寄存器错误
;;*
;;*说明: 该函数用于设置591代码验收滤波器工作模式
;;***********************************************************************************************************************
;;*/
SJASetAccMode:
MOV R6,#0FFH ;存放重复次数
SETB F0
MOV REG_CANADR,#REG_CAN_ACFMOD
SJASETAMDMD0:
MOV REG_CANDAT,R7
MOV A,REG_CANDAT
XRL A,R7
JZ SJASETAMDMD1
DJNZ R6,SJASETAMDMD0
AJMP SJASETAMDMD2
SJASETAMDMD1:
CLR F0
SJASETAMDMD2:
JB F0,SJASETAMDMD3
MOV R7,#SJA_OK
RET
SJASETAMDMD3:
MOV R7,#SJA_SETACFMODE_ERR
RET
;/*
;;***********************************************************************************************************************
;;*子程序: SJASetAccPrio
;;*应用资源: ACC,F0,R7,R6
;;*参数说明: R7 ;存放设定值
;;*返回值: R7
;;** SJA_OK ; 设置代码验收滤波器优先级寄存器成功
;;** SJA_SETACFPRIO_ERR ; 设置代码验收滤波器优先级寄存器错
;;*
;;*说明: 该函数用于设置591代码验收滤波器优先级
;;***********************************************************************************************************************
;;*/
SJASetAccPrio:
MOV R6,#0FFH ;存放重复次数
SETB F0
MOV REG_CANADR,#REG_CAN_ACFPRIO
SJASETAPOMD0:
MOV REG_CANDAT,R7
MOV A,REG_CANDAT
XRL A,R7
JZ SJASETAPOMD1
DJNZ R6,SJASETAPOMD0
AJMP SJASETAPOMD2
SJASETAPOMD1:
CLR F0
SJASETAPOMD2:
JB F0,SJASETAPOMD3
MOV R7,#SJA_OK
RET
SJASETAPOMD3:
MOV R7,#SJA_SETACFPRIO_ERR
RET
;/*
;;***********************************************************************************************************************
;;*子程序: SJASetAccEN
;;*应用资源: ACC,F0,R7,R6
;;*参数说明: R7 ;存放设定值
;;*返回值: R7
;;** SJA_OK ; 设置代码验收滤波器使能寄存器成功
;;** SJA_SETACFEN_ERR ; 设置代码验收滤波器使能寄存器错
;;*
;;*说明: 该函数用于设置591代码验收滤波器使能
;;***********************************************************************************************************************
;;*/
SJASetAccEN:
MOV R6,#0FFH ;存放重复次数
SETB F0
MOV REG_CANADR,#REG_CAN_ACFEN
SJASETAENMD0:
MOV REG_CANDAT,R7
MOV A,REG_CANDAT
XRL A,R7
JZ SJASETAENMD1
DJNZ R6,SJASETAENMD0
AJMP SJASETAENMD2
SJASETAENMD1:
CLR F0
SJASETAENMD2:
JB F0,SJASETAENMD3
MOV R7,#SJA_OK
RET
SJASETAENMD3:
MOV R7,#SJA_SETACFEN_ERR
RET
;/*
;;***********************************************************************************************************************
;;*子程序: SJASetOutControl
;;*应用资源: R7,R6,ACC,DPTR,F0
;;*参数说明: R7 ;存放设定值
;;*返回值: R7 ;
;;* SJA_OK ; 设置输出控制寄存器成功
;;* SJA_SETOCR_ERR ; 设置输出控制寄存器错
;;* SJA_NOTRSTMODE ; CAN591不在复位模式
;;*
;;*说明: 该子程序用于设定CAN591的输出控制
;;***********************************************************************************************************************
;;*/
;/*
;;***********************************************************************************************************************
;;*子程序: SJASetClockDivision
;;*应用资源: R7,R6,ACC,DPTR,F0
;;*参数说明: R7 ;存放设定值
;;*返回值: R7 ;
;;* SJA_OK ; 设置时钟分频寄存器成功
;;* SJA_SETCDR_ERR ; 设置时钟分频寄存器错
;;* SJA_NOTRSTMODE ; CAN591不在复位模式
;;*
;;*说明: 该子程序用于设定CAN591的时钟分频寄存器
;;***********************************************************************************************************************
;;*/
;/*
;;***********************************************************************************************************************
;;*子程序: SJASetAccCode
;;*应用资源: R7,R6,R0,ACC,F0
;;*参数说明: R0 ;存放设置代码验收寄存器数组的首地址,首地址为滤波器组号
;;*
;;*返回值: R7 ;
;;* SJA_OK ; 设置代码验收寄存器成功
;;* SJA_SETACR_ERR ; 设置代码验收寄存器错
;;* SJA_NOTRSTMODE ; CAN591不在复位模式
;;*
;;*说明: 该子程序用于设定报文滤波的代码验收滤波器
;;*
;;***********************************************************************************************************************
;;*/
SJASetAccCode:
LCALL SJATestRstMode
JNB F0,SJASETACR1
MOV R7,#SJA_NOTRSTMODE
RET
SJASETACR1:
MOV R6,#0FFH ;存放重复次数
SETB F0
SJASETACR2:
MOV R7,#4
MOV REG_CANADR,@R0 ;指针指向模式寄存器
INC R0
SJASETACR3:
MOV A,@R0
MOV REG_CANDAT,A
DEC REG_CANADR
MOV A,REG_CANDAT
XRL A,@R0
JZ SJASETACR4
DJNZ R6,SJASETACR3
AJMP SJASETACR5
SJASETACR4:
INC DPTR
INC R0
DJNZ R7,SJASETACR3
CLR F0
SJASETACR5:
JB F0,SJASETACR6
MOV R7,#SJA_OK
RET
SJASETACR6:
MOV R7,#SJA_SETACR_ERR
RET
;/*
;;***********************************************************************************************************************
;;*子程序: SJASetAccMask
;;*应用资源: R7,R6,R0,ACC,F0
;;*参数说明: R0 ;存放设置代码验收寄存器数组的首地址
;;*返回值: R7 ;
;;* SJA_OK ; 设置验收屏蔽寄存器成功
;;* SJA_SETAMR_ERR ; 设置验收屏蔽寄存器错
;;* SJA_NOTRSTMODE ; CAN591不在复位模式
;;*
;;*说明: 该子程序用于设定报文滤波的验收屏蔽寄存器
;;***********************************************************************************************************************
;*/
SJASetAccMask:
LCALL SJATestRstMode
JNB F0,SJASETAMR1
MOV R7,#SJA_NOTRSTMODE
RET
SJASETAMR1:
MOV R6,#0FFH ;存放重复次数
SETB F0
SJASETAMR2:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -