📄 can模块程序清单.asm
字号:
;********************************************************************
;子程序: DATARECEIVE
;应用资源: DPTR,ACC,R0,R7 ,F0
;参数说明: R0,存放微处理器保存数据缓冲区的首地址
;返回值: F0=0;接收成功
; F0=1;接收失败
;说明:CAN控制器接收数据,仅限于接收数据
;********************************************************************
DATARECEIVE:
MOV A, CANSTA
SETB F0
JNB ACC.0, DRQUIT ;判断报文是否有效
CLR F0
MOV CANADR, #RxBuffer2 ;接收报文的ID号的低3位 \RTR位 \数据长度DLC
MOV A, CANDAT
MOV R1, #RxBuffer1 ;接收缓冲区的首地址
JB ACC.4, RCVYB ;接收到的是远程帧
;数据帧
ANL A, #0FH ;计算接收到的数据长度
ADD A, #02H ;计算报文的长度
MOV R7, A
AJMP RCVDATA
RCVYB:
MOV R7, #02 ;远程帧
RCVDATA: ;开始读取数据
MOV CANADR, R1
MOV A, CANDAT
MOV @R0, A
INC R0
INC R1
DJNZ R7, RCVDATA
DRQUIT:
RET
;********************************************************************
;子程序: SETBANDRATE
;应用资源: DPTR,ACC,R5,R6,R7,F0
;参数说明: 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 ;波特率设置成功
; 1 ;波特率设置失败
;说明: 设置CAN控制器通讯波特率.晶振为必须为16MHZ,其它晶体的频率的值的波特率,需自己计算 。该子程序只能用于复位模式
;********************************************************************
SETBANDRATE:
MOV A, R7 ;判断波特率的值是否存在
CLR CY
SUBB A, #13 ;
SETB F0
JNC SETBRQUIT ;输入的值大于12则不正确
CLR F0
MOV A, R7
RL A
MOV DPTR, #SETBR ;查表找出相应的预设第一个值
MOVC A, @A+DPTR
MOV R5, A ;将数据保存
MOV A, R7 ;找出第二个值
RL A
INC A
MOVC A, @A+DPTR
MOV R6, A ;保存值
MOV CANADR, #BTR0 ;装入波特率预设值,同步跳转宽度
;位宽度
MOV A, R5
MOV CANDAT, A
SETB F0
MOV A, CANDAT
XRL A, R5 ;判断写入是否正确
JNZ SETBRQUIT ;不正确
CLR F0
MOV CANADR, #BTR1
MOV A, R6
MOV CANDAT, A
SETB F0
MOV A, CANDAT
XRL A, R6 ;判断写入是否正确
JNZ SETBRQUIT
CLR F0
SETBRQUIT:
RET
SETBR:
DB 053H, 02FH ;20KBPS的预设值
DB 087H, 0FFH ;40KBPS的预设值
DB 047H, 02FH ;50KBPS的预设值
DB 083H, 0FFH ;80KBPS的预设值
DB 043H, 02fH ;100KBPS的预设值
DB 03H, 01cH ;125KBPS的预设值
DB 081H, 0faH ;200KBPS的预设值
DB 01H, 01cH ;250KBPS的预设值
DB 080H, 0faH ;400KBPS的预设值
DB 00H, 01cH ;500KBPS的预设值
DB 080H, 0b6H ;666KBPS的预设值
DB 00H, 016H ;800KBPS的预设值
DB 00H, 014H ;1000KBPS的预设值
;********************************************************************
;子程序: SETOBJECT
;应用资源: DPTR,ACC,R6,R7,F0
; R7:存放验收代码寄存器(ACR)的参数设置
; R6:存放接收屏蔽寄存器(AMR)的参数设置
;返回值: F0,存放返回值
; 0 ;通信对象设置成功
; 1 ;通信对象设置失败
;说明: 设置CAN节点的通讯对象,允许接收的报文ID号的高8位(D10--D3)。
; 允许接收的报文,是由AMR和ACR共同决定的.
;********************************************************************
SETOBJECT:
MOV CANADR, #ACR ;写ACR寄存器
MOV A, R7
MOV CANDAT, A
MOV A, CANDAT
SETB F0
XRL A, R7 ;检验写入是否正确
JNZ SETOQUIT
CLR F0
MOV CANADR, #AMR
MOV A, R6
MOV CANDAT, A
MOV A, CANDAT
SETB F0
XRL A, R6
JNZ SETOQUIT
CLR F0
SETOQUIT: RET
;********************************************************************
;子程序: SETOUTCLK
;应用资源: DPTR,ACC,R6,R7,F0,B
; R7:存放输出寄存器(OCR)的参数设置
;返回值: F0,存放返回值
; 0 ;设置成功
; 1 ;设置失败
;说明: 设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式
;********************************************************************
SETOUTCLK:
MOV CANADR, #OCR ;写OCR寄存器
MOV A, R7
MOV CANDAT, A
MOV A, CANDAT
SETB F0
XRL A, R7
JNZ SETOCQUIT
CLR F0
SETOCQUIT :
RET
;********************************************************************
;子程序: CMDPRG
;应用资源: DPTR,ACC,R7,F0
;参数说明: R7,存放命令字
; 0x01 ;//发送请求命令
; 0x02 ;//夭折发送命令
; 0x04 ;//释放接收缓冲区
; 0x08 ;//清除超载状态
; 0x10 ;//进入睡眠状态命令
;返回值: F0,存放返回值
; 0 ; 执行命令成功
; 1 ; 执行命令失败
;说明: 本子程序为命令执行程序
;********************************************************************
CMDPRG:
MOV A, R7
CJNE A, #01, CMD1
;发送请求命令
MOV CANADR, #COMMAND; 地址指向命令寄存器
MOV CANDAT, A ;写入命令字
CLR F0
RET
CMD1:
CJNE A, #02, CMD2
;;//夭折发送命令
MOV A, CANSTA ;判断是否有正在发送的状态
SETB F0
JNB ACC.5, CMDQUIT
CLR F0
CMDQUIT:
RET
CMD2:
CJNE A, #04, CMD3
;释放接收缓冲区
MOV CANADR, #COMMAND; 地址指向命令寄存器
MOV CANDAT, A ;写入命令字
NOP
NOP
MOV A, CANSTA
SETB F0
JB ACC.0, DBQUIT ;不成功跳转
CLR F0
DBQUIT:
RET
CMD3:
CJNE A, #08, CMD4
;清除超载状态
MOV CANADR, #COMMAND; 地址指向命令寄存器
MOV CANDAT, A ;写入命令字
NOP
NOP
MOV A, CANSTA
SETB F0
JB ACC.1, DOVERQUIT ;不成功跳转
CLR F0
DOVERQUIT:
RET
CMD4:
CJNE A, #10H, CMD5
;进入睡眠状态命令
MOV CANADR, #COMMAND; 地址指向命令寄存器
MOV CANDAT, A ;写入命令字
CLR F0
CMD5:
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -