📄 basicmainl.asm
字号:
NOP
MOVX A,@R0 ;读出值
CJNE A,#0AAH,BCAN_CM_QUIT ;测试写入读出是否正确
MOV A,#055H ;再次测试
MOVX @R0,A ;写入055H
NOP
NOP
MOVX A,@R0
CJNE A,#055H,BCAN_CM_QUIT ;测试写入读出是否正确
CLR A ;清零测试寄存器
MOVX @R0,A
CLR F0 ;接口正确
BCAN_CM_QUIT:
RET
;************************************************************************
;*函数: BCAN_ENTER_RETMODEL *
;*应用资源: DPTR,ACC,F0 *
;*参数说明: 无 *
;*返回值: F0,存放返回值 *
;* 0 ; 表示成功进入复位工作模式 *
;* 1 ; 表示不能进入复位工作模式 *
;* *
;*说明:CAN控制器进入复位工作模式 *
;************************************************************************
;*子程序调用示例: *
;* USER_CODE: ;;用户代码 *
;* ----- ----- *
;* LCALL BCAN_ENTER_RETMODEL ;;调用子程序 *
;* JNB F0, USER_CODE1 ;;继续用户代码 *
;* LJMP ERROR_PRG ;;复位请求不成功跳到错误处理 *
;* *
;* USER_CODE1: *
;* ----- ----- ;;用户代码 *
;************************************************************************
BCAN_ENTER_RETMODEL:
MOV R0, #REG_CONTROL ;控制寄存器访问
MOVX A, @R0 ;
ORL A, #01H ;置位复位请求
MOVX @R0, A ;
CLR F0
MOVX A, @R0 ;验证复位是否写入
JB ACC.0, BCAN_ER_QUIT
SETB F0 ;复位不成功
BCAN_ER_QUIT:
RET
;************************************************************************
;*函数: BCAN_QUIT_RETMODEL *
;*应用资源: R0,ACC,F0 *
;*参数说明: 无 *
;*返回值: F0,存放返回值 *
;* 0 ; 表示成功退出复位工作模式 *
;* 1 ; 表示不能退出复位工作模式 *
;* *
;*说明:CAN控制器退出复位工作模式,进入工作模式 *
;************************************************************************
;*子程序调用示例: *
;* USER_CODE: ;;用户代码 *
;* ----- ----- *
;* LCALL BCAN_QUIT_RETMODEL ;;调用子程序 *
;* JNB F0, USER_CODE1 ;;继续用户代码 *
;* LJMP ERROR_PRG ;;不能退出复位模式跳到错误处理 *
;* *
;* USER_CODE1: *
;* ----- ----- ;;用户代码 *
;************************************************************************
BCAN_QUIT_RETMODEL:
MOV R0,#REG_CONTROL ; 控制寄存器访问
MOVX A,@R0 ;
ANL A,#0FEH ;清零复位请求,进入工作状态
NOP
MOVX @R0, A
CLR F0
MOVX A,@R0
JNB ACC.0, BCAN_QR_QUIT ;验证是否退出复位状态
SETB F0
BCAN_QR_QUIT:
RET
;************************************************************************
;*函数: BCAN_DATA_WRITE *
;*应用资源: DPTR,ACC,R0,R7 *
;*参数说明: *
;* R0:存放待发送特定帧各式的数据的首地址 *
;* *
;*返回值: F0,存放返回值 *
;* 0 ; 表示将数据成功的送至发送缓冲区 *
;* 1 ; 表示上一次的数据正在发送, *
;* ; 表示发送缓冲区被锁定,不能写入数据 *
;* ; 表示写入数据错误 *
;* *
;*说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动 *
;* SJA1000发送。 *
;* 特定帧格式为:开始的两个字节存放 '描述符' ,以后的为数据 *
;* 描述符包括11位长的ID(标志符)\1位RTR\4位描述数据长度的DLC共16位 *
;* *
;*注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。 *
;* 不指示SJA1000将该数据正确发送到CAN总线上完毕与否,要向总线发送请在*
;* 本子程序后调用发送命令 *
;************************************************************************
;*子程序调用示例: *
;* USER_CODE: ;;用户代码 *
;* ----- ----- *
;* MOV R0, #DATA_BUF0 ;;装入微处理器要发送数据的首地址 *
;* LCALL BCAN_DATA_WRITE ;;调用子程序 *
;* JNB F0, USER_CODE1 ;;继续用户代码 *
;* LJMP ERROR_PRG ;;写入发送缓冲区错跳到错误处理 *
;* *
;* USER_CODE1: *
;* ----- ----- ;;用户代码 *
;************************************************************************
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
INC R0 ;
MOV A, @R0 ;ID号的低3位 \RTR位 \数据长度DLC
DEC R0 ;恢复指针指向发送数据的首地址
MOV R1, #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 @R1, A
SETB F0
MOVX A, @R1 ;校验写入的是否正确
XRL A, @R0
JNZ BCAN_DW_QUIT ;写入错误退出
CLR F0 ;正确写入继续
INC R0
INC R1
DJNZ R7, BCAN_WRTXBUF ;没有写完继续
BCAN_DW_QUIT:
RET
;************************************************************************
;*函数: BCAN_DATA_RECEIVE *
;*应用资源: R0,ACC,R1,R7,F0 *
;*参数说明: R0,存放微处理器保存数据缓冲区的首地址 *
;*返回值: F0=0;接收成功 *
;* F0=1;接收失败 *
;*说明:CAN控制器接收数据,仅限于接收数据 *
;************************************************************************
;*子程序调用示例: *
;* USER_CODE: ;;用户代码 *
;* ----- ----- *
;* MOV R1, #DATA_BUF0 ;;装入微处理器要发送数据的首地址 *
;* LCALL BCAN_DATA_RECEIVE ;;调用子程序 *
;* JNB F0, USER_CODE1 ;;成功,继续用户代码 *
;* LJMP ERROR_PRG ;;失败,跳到错误处理 *
;* *
;* USER_CODE1: *
;* ----- ----- ;;用户代码 *
;************************************************************************
BCAN_DATA_RECEIVE:
MOV R0, #REG_STATUS
MOVX A, @R0
SETB F0
JNB ACC.0, BCAN_DR_QUIT ;判断报文是否有效
CLR F0
MOV R0, #REG_RxBuffer2 ;接收报文的ID号的低3位 \RTR位 \数据长度DLC
MOVX A, @R0
MOV R0, #REG_RxBuffer1 ;接收缓冲区的首地址
JB ACC.4, BCAN_RCVYB ;接收到的是远程帧
;//数据帧
ANL A, #0FH ;计算接收到的数据长度
ADD A, #02H ;计算报文的长度
MOV R7, A
AJMP BCAN_RCVDATA
BCAN_RCVYB:
MOV R7, #02 ;远程帧
BCAN_RCVDATA: ;开始读取数据
MOVX A, @R0
MOV @R1, A
INC R0
INC R1
DJNZ R7, BCAN_RCVDATA
BCAN_DR_QUIT:
RET
;************************************************************************
;*子程序: BCAN_SET_BANDRATE *
;*应用资源: 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控制器SJA1000通讯波特率.SJA1000的晶振为必须为16MHZ, *
;* 其它晶体的频率的值的波特率,需自己计算 。该子程序只能用于 *
;* 复位模式 *
;************************************************************************
;*子程序调用示例: *
;* USER_CODE: ;;用户代码 *
;* ----- ----- *
;* MOV R7, #06 ;;设置波特率100KBPS *
;* LCALL BCAN_SET_BANDRATE ;;调用子程序 *
;* JNB F0, USER_CODE1 ;;成功,继续用户代码 *
;* LJMP ERROR_PRG ;;失败,跳到错误处理 *
;* *
;* USER_CODE1: *
;* ----- ----- ;;用户代码 *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -