;***************************************************************************
;接收数据处理部分
RCVDATA_PRG:
MOV R0,# RCV_DATA_BUF1 ;微处理器接收首地址
LCALL BCAN_DATA_RECEIVE ;调用接收数据子程序
MOV R7,#04H ;释放接收缓冲区
LCALL BCAN_CMD_PRG ;
;将接收的数据发送至串口
MOV R0,# RCV_DATA_BUF2 ;计算接收数据长度判断远程帧、数据帧
MOV A,@R0
JB ACC.4,RD_PRG1 ;远程帧
;数据帧
ANL A,#0FH ;计算数据数目
ADD A,#02H ;计算帧的数据长度
MOV R7, A
AJMP RD_UARTSD
RD_PRG1:
MOV R7,#02H
RD_UARTSD:
MOV R0,#RCV_DATA_BUF1 ;微处理器接收首地址
CALL UART_SEND ;调用串口发送程序
;***************************************************************************
JMP $
JMP MAIN_LOOP
;**************************************************************
;*子程序定义 *
;* *
;* *
;* *
;**************************************************************
;$INCLUDE (SJA_BCANCONF.ASM)
;************************************************************************
;************************************************************************
;************************************************************************
;* *
;* CAN 控制器SJA1000基本CAN汇编子程序说明(BasicCAN 工作方式) *
;* *
;************************************************************************
;************************************************************************
;* *
;* 目的: 用户在应用SJA1000组成CAN网络中通过简单的参数设置和调用 *
;* 本文件提供函数便能使自己的CAN系统进行基本的调试和运行 *
;* *
;* 文件名: SJA_BCANFUNC.ASM *
;* *
;* 模块名: -- *
;* *
;* 目标系统: 任何基于任何兼容8051指令的微处理器同SJA1000组成的CAN *
;* 系统 *
;* *
;* 应用语言: Keil ASM-51 or Intel ASM-51 *
;* *
;************************************************************************
;* 版本 :V1.0 *
;* *
;************************************************************************
;//以下为函数定义
;************************************************************************
;*函数: BCAN_CREATE_COMMUNATION *
;*应用资源: R0,ACC,F0 *
;*参数说明: 无 *
;*返回值: F0,存放返回值 *
;* 0 ; 表示SJA1000接口正常 *
;* 1 ; 表示SJA1000与处理器接口不正常 *
;* *
;*说明:该函数用于检测CAN控制器的接口是否正常 *
;************************************************************************
;*子程序调用示例: *
;* USER_CODE: ;;用户代码 *
;* ----- ----- *
;* LCALL BCAN_CREATE_COMMUNATION ;;调用子程序 *
;* JNB F0, USER_CODE1 ;;继续用户代码 *
;* LJMP ERROR_PRG ;;接口不正常跳到错误处理 *
;* *
;* USER_CODE1: *
;* ----- ----- ;;用户代码 *
;************************************************************************
BCAN_CREATE_COMMUNATION:
MOV R0,#REG_TEST ;对测试寄存器进行读写测试
MOVX A,@R0
MOV A,#0AAH ;写入值0AAH
MOVX @R0,A
SETB F0
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 R0, #REG_STATUS ;读取状态寄存器
MOVX A, @R0 ;判断上次发送是否完成
SETB F0
JNB ACC.3, BCAN_DW_QUIT ;正在发送退出
CLR F0
MOVX A, @R0 ;判断发送缓冲区是否锁定,
SETB F0
JNB ACC.2, BCAN_DW_QUIT ;锁定则跳出
CLR F0
INC R1 ;
MOV A, @R1 ;ID号的低3位 \RTR位 \数据长度DLC
DEC R1 ;恢复指针指向发送数据的首地址
MOV R0, #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, @R1 ;开始写入
MOVX @R0, A
SETB F0
MOVX A, @R0 ;校验写入的是否正确
XRL A, @R1
JNZ BCAN_DW_QUIT ;写入错误退出
CLR F0 ;正确写入继续
INC R1
INC R0
DJNZ R7, BCAN_WRTXBUF ;没有写完继续
BCAN_DW_QUIT:
RET