📄 can.asm
字号:
BCAN_DATA_WRITE:
MOV DPTR, #REG_STATUS ;读取状态寄存器
MOVX A, @DPTR ;判断上次发送是否完成
SETB F0
JNB ACC.3, BCAN_DW_QUIT ;正在发送退出
CLR F0
MOVX A, @DPTR ;判断发送缓冲区是否锁定,
SETB F0
JNB ACC.2, BCAN_DW_QUIT ;锁定则跳出
CLR F0
CLR P1.7
INC R0 ;
MOV A, @R0 ;ID号的低3位 \RTR位 \数据长度DLC
DEC R0 ;恢复指针指向发送数据的首地址
MOV DPTR, #REG_TxBuffer1;发送缓冲区首地址
JB ACC.4, BCAN_WYB ;远程帧
;数据帧
ANL A, #0FH ;计算发送数据的长度
ADD A, #02H
MOV R7, A
AJMP BCAN_WRTXBUF ;
BCAN_WYB:
MOV R7, #02 ;写入发送缓冲区数据长度为2
BCAN_WRTXBUF:
MOV A, @R0 ;开始写入
MOVX @DPTR, A
SETB F0
MOVX A, @DPTR ;校验写入的是否正确
XRL A, @R0
JNZ BCAN_DW_QUIT ;写入错误退出
CLR F0 ;正确写入继续
INC R0
INC DPTR
DJNZ R7, BCAN_WRTXBUF ;没有写完继续
BCAN_DW_QUIT:
clr P1.6
setb P1.7
RET
BCAN_DATA_RECEIVE:
MOV DPTR, #REG_STATUS
MOVX A, @DPTR
SETB F0
JNB ACC.0, BCAN_DR_QUIT ;判断报文是否有效
CLR F0
MOV DPTR, #REG_RxBuffer2 ;接收报文的ID号的低3位 \RTR位 \数据长度DLC
MOVX A, @DPTR
MOV DPTR, #REG_RxBuffer1 ;接收缓冲区的首地址
JB ACC.4, BCAN_RCVYB ;接收到的是远程帧
;数据帧
ANL A, #0FH ;计算接收到的数据长度
ADD A, #02H ;计算报文的长度
MOV R6, A
AJMP BCAN_RCVDATA
BCAN_RCVYB:
MOV R6, #02 ;远程帧
BCAN_RCVDATA: ;开始读取数据
MOVX A, @DPTR
MOV @R0, A
INC DPTR
INC R0
DJNZ R6, BCAN_RCVDATA
BCAN_DR_QUIT:
RET
BCAN_SET_BANDRATE:
MOV A, R7 ;判断波特率的值是否存在
CLR CY
SUBB A, #13 ;
SETB F0
JNC BCAN_SETBR_QUIT ;输入的值大于12则不正确
CLR F0
MOV A, R7
RL A
MOV DPTR, #BCAN_SETBR ;查表找出相应的预设第一个值
MOVC A, @A+DPTR
MOV R5, A ;将数据保存
MOV A, R7 ;找出第二个值
RL A
INC A
MOVC A, @A+DPTR
MOV R6, A ;保存值
MOV DPTR, #REG_BTR0 ;装入波特率预设值,同步跳转宽度
;位宽度
MOV A, R5
MOVX @DPTR, A
SETB F0
MOVX A, @DPTR
XRL A, R5 ;判断写入是否正确
JNZ BCAN_SETBR_QUIT ;不正确
CLR F0
INC DPTR
MOV A, R6
MOVX @DPTR, A
SETB F0
MOVX A, @DPTR
XRL A, R6 ;判断写入是否正确
JNZ BCAN_SETBR_QUIT
CLR F0
BCAN_SETBR_QUIT:
RET
BCAN_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的预设值
BCAN_SET_OBJECT:
MOV DPTR, #REG_ACR ;写ACR寄存器
MOV A, R7
MOVX @DPTR, A
MOVX A, @DPTR
SETB F0
XRL A, R7 ;检验写入是否正确
JNZ BCAN_SETO_QUIT
CLR F0
INC DPTR ;写AMR寄存器
MOV A, R6
MOVX @DPTR, A
MOVX A, @DPTR
SETB F0
XRL A, R6 ;检验写入是否正确
JNZ BCAN_SETO_QUIT
CLR F0
BCAN_SETO_QUIT:
RET
BCAN_SET_OUTCLK:
MOV DPTR, #REG_OCR ;写OCR寄存器
MOV A, R7
MOVX @DPTR, A
MOVX A, @DPTR
SETB F0
XRL A,R7
JNZ BCAN_OCR_QUIT ;检验写入是否正确
CLR F0
MOV DPTR, #REG_CDR ;写CDR寄存器
MOV A, R6
MOVX @DPTR, A
MOVX A, @DPTR
SETB F0
XRL A,R6
JNZ BCAN_OCR_QUIT ;检验写入是否正确
CLR F0
BCAN_OCR_QUIT:
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BCAN_CMD_PRG:
MOV A, R7
CJNE A, #01, BCAN_CMD1
;发送请求命令
MOV DPTR, #REG_COMMAND; 地址指向命令寄存器
MOVX @DPTR, A ;写入命令字
CLR F0
RET
BCAN_CMD1:
CJNE A, #02, BCAN_CMD2
;;//夭折发送命令
MOV DPTR, #REG_STATUS ;地址指向状态寄存器
MOVX A, @DPTR ;判断是否有正在发送的状态
SETB F0
JB ACC.5, BCAN_CMD_QUIT
CLR F0
BCAN_CMD_QUIT:
RET
BCAN_CMD2:
CJNE A, #04, BCAN_CMD3
;释放接收缓冲区
MOV DPTR, #REG_COMMAND; 地址指向命令寄存器
MOVX @DPTR, A ;写入命令字
NOP
NOP
MOV DPTR, #REG_STATUS ;判断是否释放成功
MOVX A, @DPTR
SETB F0
JB ACC.0, BCAN_DB_QUIT ;不成功跳转
CLR F0
BCAN_DB_QUIT:
RET
BCAN_CMD3:
CJNE A, #08, BCAN_CMD4
;清除超载状态
MOV DPTR, #REG_COMMAND; 地址指向命令寄存器
MOVX @DPTR, A ;写入命令字
NOP
NOP
MOV DPTR, #REG_STATUS ;判断清除超载是否成功
MOVX A, @DPTR
SETB F0
JB ACC.1, BCAN_DOVER_QUIT ;不成功跳转
CLR F0
BCAN_DOVER_QUIT:
RET
BCAN_CMD4:
CJNE A, #10H, BCAN_CMD5
;进入睡眠状态命令
MOV DPTR, #REG_COMMAND; 地址指向命令寄存器
MOVX @DPTR, A ;写入命令字
CLR F0
BCAN_CMD5:
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -