📄 can模块程序清单.asm
字号:
;程序清单:
CANADR EQU 00H
CONTROL EQU 00H ;内部控制寄存器地址
COMMAND EQU 01H ;内部命令寄存器地址;只可进行写,读出值为0XFF
STATUS EQU 02H ;内部状态寄存器地址;可进行读,写操作无效
INTERRUPT EQU 03H ;内部中断寄存器地址; 只读
ACR EQU 04H ;内部验收代码寄存器地址;可读写
AMR EQU 05H ;内部验收屏蔽寄存器地址;可读写
BTR0 EQU 06H ;总线定时寄存器0;可读写
BTR1 EQU 07H ;总线定时寄存器1; 可读写
OCR EQU 08H ;输出控制寄存器; 可读写
;********************************************************************
;发送缓冲区(内部地址0AH--13H)
;********************************************************************
TxBuffer1 EQU 0AH ;发送缓冲区1
TxBuffer2 EQU 0BH ;发送缓冲区2
TxBuffer3 EQU 0CH ;发送缓冲区3
TxBuffer4 EQU 0DH ;发送缓冲区4
TxBuffer5 EQU 0EH ;发送缓冲区5
TxBuffer6 EQU 0FH ;发送缓冲区6
TxBuffer7 EQU 10H ;发送缓冲区7
TxBuffer8 EQU 11H ;发送缓冲区8
TxBuffer9 EQU 12H ;发送缓冲区9
TxBuffer10 EQU 13H ;发送缓冲区10
;********************************************************************
;接收缓冲区(内部地址014H--01DH)
;********************************************************************
RxBuffer1 EQU 14H ;接收缓冲区1
RxBuffer2 EQU 15H ;接收缓冲区2
RxBuffer3 EQU 16H ;接收缓冲区3
RxBuffer4 EQU 17H ;接收缓冲区4
RxBuffer5 EQU 18H ;接收缓冲区5
RxBuffer6 EQU 19H ;接收缓冲区6
RxBuffer7 EQU 1AH ;接收缓冲区7
RxBuffer8 EQU 1BH ;接收缓冲区8
RxBuffer9 EQU 1CH ;接收缓冲区9
RxBuffer10 EQU 1DH ;接收缓冲区10
;********************************************************************;CAN的命令字
;********************************************************************
TRCMD EQU 01h ;发送请求命令
ATCMD EQU 02h ;夭折发送命令
RRBCMD EQU 04h ;释放接收缓冲区
COSCMD EQU 08h ;清除超载状态
GTSCMD EQU 10h ;进入睡眠状态命令
;********************************************************************
;数据存贮区
;********************************************************************
SDATABUFO EQU 70H
RDATABUFO EQU 0A0H
;********************************************************************
;主程序
;********************************************************************
ORG 0000H
LJMP START
ORG 002BH
LJMP CANINT
ORG 0100H
START:
MOV P4, #00H
LCALL INIT ;初始化
LCALL SENDCODE ;发送数据
WAITRINT: ;等待接收中断
AJMP WAITRINT
ERRORPRG: ;若错误,程序重新运行
LJMP START
RET
;********************************************************************
;接收中断子程序
;********************************************************************
CANINT:
MOV CANADR, #INTERRUPT ;读中断寄存器
MOV A, CANDAT
MOV IEN0, #00H ;关闭中断
MOV R0, #SDATABUFO ;装入微处理器要接收数据的首地址
LCALL DATARECEIVE ;调用子程序
JNB F0, USER_CODE1 ;成功,继续用户代码
LJMP ERRORPRG ;失败,跳到错误处理
USER_CODE1:
MOV R7, #RRBCMD ;释放接收缓冲区
LCALL CMDPRG
JB F0, USER_CODE1
QUITINT:
LCALL SENDCODE ;发送子程序
MOV IEN0, #0A0H ;开放中断
RETI
;********************************************************************
;发送子程序
;********************************************************************
SENDCODE:
SEND:
MOV R0, #SDATABUFO
LCALL DATAWRITE
JNB F0, CMDPRGCODE
LJMP ERRORPRG
CMDPRGCODE:
MOV R7, #TRCMD
LCALL CMDPRG
JNB F0, LOOPSD
LJMP ERRORPRG
LOOPSD:
RET
;********************************************************************
;初始化子程序
;********************************************************************
INIT:
MOV IP0, #20H ;中断优先级
MOV IEN0, #0A0H ;开放中断
LCALL RETMODEL ;进入复位模式
JNB F0, SETOUTCLKCODE
LJMP ERRORPRG
SETOUTCLKCODE:
MOV R7, #0AAH ;设置输出控制寄存器
LCALL SETOUTCLK
JNB F0, SETBANDRATECODE
LJMP ERRORPRG
SETBANDRATECODE:
MOV R7, #0CH
LCALL SETBANDRATE ;设置通信波特率
JNB F0, SETOBJECTCODE
LJMP ERRORPRG
SETOBJECTCODE:
MOV R7, #55H ;设置通信接点对象
MOV R6, #00H
LCALL SETOBJECT
JNB F0,QUITRETMODELCODE
LJMP ERRORPRG
QUITRETMODELCODE:
LCALL QUITRETMODEL ;退出复位模式
JNB F0, OTHERS
LJMP ERRORPRG
OTHERS:
RET
;********************************************************************
;子程序: RETMODEL
;应用资源: DPTR,ACC,F0
;参数说明: 无
;返回值: F0,存放返回值
; 0 表示成功进入复位工作模式
; 1 表示不能进入复位工作模式
;说明:CAN控制器进入复位工作模式
;********************************************************************
RETMODEL:
MOV CANADR, #CONTROL ;控制寄存器访问
MOV A, CANDAT
ORL A, #01H ;置位复位请求
MOV CANDAT, A
CLR F0
MOV A, CANDAT ;验证复位是否写入
JB acc.0,ERQUIT
SETB F0 ;复位不成功
ERQUIT:
RET
;********************************************************************
;子程序: QUITRETMODEL
;应用资源: DPTR,ACC,F0
;参数说明: 无
;返回值: F0,存放返回值
; 0 ; 表示成功退出复位工作模式
; 1 ; 表示不能退出复位工作模式
;说明:CAN控制器退出复位工作模式,进入工作模式
;********************************************************************
QUITRETMODEL:
MOV CANADR, #CONTROL ; 控制寄存器访问
MOV A, #62H ;清零复位请求,开接受中断
MOV CANDAT, A
CLR F0
MOV A, CANDAT
JNB acc.0, QRQUIT ;验证是否退出复位状态
SETB F0
QRQUIT:
RET
;********************************************************************
;子程序: DATAWRITE
;应用资源: DPTR,ACC,R0,R7
;参数说明: R0:存放待发送特定帧各式的数据的首地址
;返回值: F0,存放返回值
; 0 ; 表示将数据成功的送至发送缓冲区
; 1 ; 表示上一次的数据正在发送
; ; 表示发送缓冲区被锁定,不能写入数据
; ; 表示写入数据错误
;说明: 将待发送特定帧各式的数据,送入CAN控制器的发送缓存区中,然后启动发送。
;注: 本函数的返回值仅指示,将数据正确写入发送缓存区中与否, 不指示将该
; 数据正确发送到CAN总线上完毕与否,要向总线发送请在本子程序后调用发送命令
;********************************************************************
DATAWRITE:
MOV A, CANSTA ;判断上次发送是否完成
SETB F0
JNB ACC.3, DWQUIT ;正在发送退出
CLR F0
MOV A, CANSTA ;判断发送缓冲区是否锁定,
SETB F0
JNB ACC.2, DWQUIT ;锁定则跳出
CLR F0
INC R0 ;
MOV A, @R0 ;ID号的低3位 \RTR位 \数据长度DLC
DEC R0 ;恢复指针指向发送数据的首地址
MOV R1, #TxBuffer1;发送缓冲区首地址
JB ACC.4, WYB ;远程帧
;数据帧
ANL A, #0FH ;计算发送数据的长度
ADD A, #02H
MOV R7, A
AJMP WRTXBUF ;
WYB:
MOV R7, #02 ;写入发送缓冲区数据长度为2
WRTXBUF:
MOV CANADR, R1
MOV A, @R0 ;开始写入
MOV CANDAT, A
SETB F0
MOV A, CANDAT ;校验写入的是否正确
XRL A, @R0
JNZ DWQUIT ;写入错误退出
CLR F0 ;正确写入继续
INC R0
INC R1
DJNZ R7, WRTXBUF ;没有写完继续
DWQUIT:
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -