;************************************************************************
;*函数: 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 R1, #REG_STATUS
MOVX A, @R1
SETB F0
JNB ACC.0, BCAN_DR_QUIT ;判断报文是否有效
CLR F0
MOV R1, #REG_RxBuffer2 ;接收报文的ID号的低3位 \RTR位 \数据长度DLC
MOVX A, @R1
MOV R1, #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, @R1
MOV @R0, 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: *
;* ----- ----- ;;用户代码 *
;************************************************************************
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 R0,#REG_BTR0 ;装入波特率预设值,同步跳转宽度
;位宽度
MOV A,R5
MOVX @R0,A
SETB F0
NOP
MOVX A,@R0
XRL A,R5 ;判断写入是否正确
JNZ BCAN_SETBR_QUIT ;不正确
CLR F0
INC R0
MOV A,R6
MOVX @R0,A
SETB F0
NOP
MOVX A,@R0
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 042H, 02FH ;100KBPS的预设值 12MHZ晶振
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 *
;*应用资源: R0,ACC,R6,R7,F0 *
;* R7:存放验收代码寄存器(ACR)的参数设置 *
;* R6:存放接收屏蔽寄存器(AMR)的参数设置 *
;*返回值: F0,存放返回值 *
;* 0 ;通信对象设置成功 *
;* 1 ;通信对象设置失败 *
;* *
;*说明:设置CAN节点的通讯对象,允许接收的报文ID号的高8位(D10--D3) 。 *
;* 允许接收的报文,是由AMR和ACR共同决定的. *
;* 满足以下条件的ID号的报文才可以被接收 *
;*[(ID.10-ID.3)≡(AC.7-AC.0)]||(AM.7-AM.0)≡11111111 *
;* 该子程序只能用于复位模式 * *
;************************************************************************
;*子程序调用示例: *
;* USER_CODE: ;;用户代码 *
;* ----- ----- *
;* MOV R7, #0AAH ;;只允许接收ID号高8位为'10101010'*
;* MOV R6, #00H ;; *
;* LCALL BCAN_SET_OBJECT ;;调用子程序 *
;* JNB F0, USER_CODE1 ;;成功,继续用户代码 *
;* LJMP ERROR_PRG ;;失败,跳到错误处理 *
;* *
;* USER_CODE1: *
;* ----- ----- ;;用户代码 *
;************************************************************************
BCAN_SET_OBJECT:
MOV R0,#REG_ACR ;写ACR寄存器
MOV A,R7
MOVX @R0,A
NOP
NOP
MOVX A,@R0
SETB F0
XRL A,R7 ;检验写入是否正确
JNZ BCAN_SETO_QUIT
CLR F0
INC R0 ;写AMR寄存器
MOV A,R6
MOVX @R0,A
NOP
NOP
MOVX A,@R0
SETB F0
XRL A,R6 ;检验写入是否正确
JNZ BCAN_SETO_QUIT
CLR F0
BCAN_SETO_QUIT:
RET
;************************************************************************
;*子程序: BCAN_SET_OUTCLK *
;*应用资源: R0,ACC,R6,R7,F0,B *
;* R7:存放输出寄存器(OCR)的参数设置 *
;* R6:存放时钟分品寄存器(REG_CDR)的参数设置 *
;*返回值: F0,存放返回值 *
;* 0 ;设置成功 *
;* 1 ;设置失败 *
;* *
;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式 * *
;************************************************************************
;*子程序调用示例: *
;* USER_CODE: ;;用户代码 *
;* ----- ----- *
;* MOV R7, #0AAH ;;输出为正常模式 *
;* MOV R6, #048H ;;禁止CLKOUT,BasicCAN模式 *
;* LCALL BCAN_SET_OUTCLK ;;调用子程序 *
;* JNB F0, USER_CODE1 ;;成功,继续用户代码 *
;* LJMP ERROR_PRG ;;失败,跳到错误处理 *
;* *
;* USER_CODE1: *
;* ----- ----- ;;用户代码 *
;************************************************************************
BCAN_SET_OUTCLK:
MOV R0,#REG_OCR ;写OCR寄存器
MOV A,R7
MOVX @R0,A
MOV B,A
NOP
NOP
MOVX A,@R0
SETB F0
CJNE A,B,BCAN_SETOC_QUIT ;检验写入是否正确
CLR F0
MOV R0,#REG_CDR ;写CDR寄存器
MOV A,R6
MOVX @R0,A
MOV B,A
MOVX A,@R0
SETB F0
CJNE A,B,BCAN_SETOC_QUIT ;检验写入是否正确
CLR F0
BCAN_SETOC_QUIT:
RET