📄 bcan1.asm
字号:
CLR F0 ;接口正确
BCAN_CM_QUIT:
RET
BCAN_ENTER_RETMODEL:
MOV DPTR, #REG_CONTROL ;控制寄存器访问
MOVX A, @DPTR ;
ORL A, #01H ;置位复位请求
MOVX @DPTR, A ;
CLR F0
MOVX A, @DPTR ;验证复位是否写入
JB ACC.0, BCAN_ER_QUIT
SETB F0 ;复位不成功
BCAN_ER_QUIT:
RET
BCAN_QUIT_RETMODEL:
MOV DPTR, #REG_CONTROL ; 控制寄存器访问
MOVX A, @DPTR ;
ANL A, #0FEH ;清零复位请求,进入工作状态
MOVX @DPTR, A
CLR F0
MOVX A, @DPTR
JNB ACC.0, BCAN_QR_QUIT ;验证是否退出复位状态
SETB F0
BCAN_QR_QUIT:
RET
BCAN_DATA_WRITE:
MOV DPTR,#REG_STATUS ;读取状态寄存器
MOVX A,@DPTR ;判断上次发送是否完成
JNB ACC.3,BCAN_DW_QUIT ;正在发送退出
MOVX A,@DPTR ;判断发送缓冲区是否锁定,
JNB ACC.2,BCAN_DW_QUIT ;锁定则跳出
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, #02H ;写入发送缓冲区数据长度为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:
RET
BCAN_CMD_01: ;发送报文命令01
MOV A,#01H
MOV DPTR,#REG_COMMAND
MOVX @DPTR,A
;SETB F0
;MOVX A,@DPTR
;JB ACC.0,BCAN_CMD_01
CLR F0
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 R7, A
AJMP BCAN_RCVDATA
BCAN_RCVYB:
MOV R7, #02H ;远程帧
BCAN_RCVDATA: ;开始读取数据
MOVX A, @DPTR
MOV @R0, A
INC DPTR
INC R0
DJNZ R7, BCAN_RCVDATA
BCAN_DR_QUIT:
MOV DPTR,#REG_INTERRUPT
MOVX A,@DPTR
CLR A
RET
BCAN_SET_BANDRATE:
MOV A, R7 ;判断波特率的值是否存在
CLR CY
SUBB A, #13H ;
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 01H, 18H ;40KBPS的预设值
DB 01H, 18H ;50KBPS的预设值
DB 01H, 18H ;80KBPS的预设值
DB 01H, 18H ;100KBPS的预设值
DB 01H, 18H ;125KBPS的预设值
DB 01H, 18H ;200KBPS的预设值
DB 01H, 18H ;250KBPS的预设值
DB 01H, 18H ;400KBPS的预设值
DB 01H, 18H ;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
MOV B, A
MOVX A, @DPTR
SETB F0
CJNE A, B, BCAN_SETOC_QUIT ;检验写入是否正确
CLR F0
MOV DPTR, #REG_CDR ;写CDR寄存器
MOV A, R6
MOVX @DPTR, A
MOV B, A
MOVX A, @DPTR
SETB F0
CJNE A, B, BCAN_SETOC_QUIT ;检验写入是否正确
CLR F0
BCAN_SETOC_QUIT:
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -