⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sja_pelifunc.asm

📁 591单片机CAN模块A51DEMO程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	MOV		R7,#4
	MOV     	REG_CANADR,@R0  ;指针指向模式寄存器
        INC             R0
SJASETAMR3:
	MOV		A,@R0
	MOV		REG_CANDAT,A
	DEC             REG_CANADR
        MOV             A,REG_CANDAT
	XRL		A,@R0
	JZ		SJASETAMR4
	DJNZ		R6,SJASETAMR3
	AJMP		SJASETAMR5
SJASETAMR4:
	INC		DPTR
	INC		R0
	DJNZ		R7,SJASETAMR3
	CLR		F0
SJASETAMR5:
	JB		F0,SJASETAMR6
	MOV		R7,#SJA_OK 
	RET
SJASETAMR6:
    	MOV		R7,#SJA_SETAMR_ERR
	RET

;/*
;***********************************************************************************************************************
;*子程序:  		SJASetBandRateStandard
;;*应用资源:	R7,R6,R5,ACC,F0,DPTR,CY
;*参数说明:  	R7		  标准常用波特率(Kbps)          
;*				0					20
;*				1					40
;*				2					50
;*				3					80
;*				4					100
;*				5					125
;*				6					200
;*				7					250
;*				8					400
;*				9					500
;*				10					666
;*				11					800
;*				12					1000		  
;*返回值:		R7
;*           	SJA_OK				  ; 设置总线定时器成功
;*			 	SJA_SETBTR_ERR		  ; 设置总线定时器错
;*			 	SJA_NOBTRSIZE		  ;波特率不能设为此值
;;*			 	SJA_NOTRSTMODE	  ; CAN591不在复位模式
;*说明:     该子程序用于设定在系统晶体为12MHZ时,常用的标准波特率的值。
;*			参数BandRateSize只能为0~12,其它的值会返回SJA_NOBTRSIZE错误
;*			本子程序只能用于复位模式
;***********************************************************************************************************************
;*/
SJASetBandRateStandard:
	LCALL	 SJATestRstMode
	JNB	 F0,SJASETBTR1
   	MOV	 R7,#SJA_NOTRSTMODE
	RET
SJASETBTR1:
	MOV      A,R7          				;判断波特率的值是否存在
    	CLR      CY
    	SUBB     A,#13        				;
    	JC       SJASETBTR2			        ;输入的值大于12则不正确 
	MOV	 R7,#SJA_NOBTRSIZE	  
    	RET
SJASETBTR2:
    	MOV      A,R7 
    	RL       A
    	MOV      DPTR,#BANDRATE_TAB			;查表找出相应的预设第一个值
    	MOVC     A,@A+DPTR
    	MOV      R5,A           			;将数据保存
    	MOV      A,R7          				;找出第二个值 
    	RL       A
    	INC      A
    	MOVC     A,@A+DPTR
    	MOV      R6,A           			;保存值
    	MOV      REG_CANADR,#REG_CAN_BTR0   
    	MOV      REG_CANDAT,R5                           ;装入波特率预设值,同步跳转宽度、位宽度
    	MOV      A,REG_CANDAT        
    	XRL      A,R5          ;判断写入是否正确
    	JNZ      SJASETBTR3		            ;不正确 
    	MOV      REG_CANADR,#REG_CAN_BTR1
    	MOV      REG_CANDAT,R6
    	MOV      A,REG_CANDAT
    	XRL      A,R6          ;判断写入是否正确
    	JNZ      SJASETBTR3
	MOV	 R7,#SJA_OK
	RET
SJASETBTR3:
	MOV		 R7,#SJA_SETBTR_ERR
    	RET 


BANDRATE_TAB:
    DB 0D7H,     0FFH                     ;20KBPS的预设值1
    DB 0CBH,     0FFH                     ;40KBPS的预设值1
    DB 047H,     02FH                     ;50KBPS的预设值
    DB 0C5H,     0FFH                     ;80KBPS的预设值1
    DB 0C9H,     0A7H                     ;100KBPS的预设值1
    DB 045H,      2BH                     ;125KBPS的预设值1
    DB  04H,     0A7H                     ;200KBPS的预设值1
    DB  01H,     01CH                     ;250KBPS的预设值
    DB  02H,     025H                     ;400KBPS的预设值1
    DB 01H,      045H                     ;500KBPS的预设值1
    DB 080H,     0b6H                     ;666KBPS的预设值
    DB 00H,      016H                     ;800KBPS的预设值
    DB 01H,      012H                     ;1000KBPS的预设值1



;/*
;***********************************************************************************************************************
;*子程序:  		SJAWriteDataToTxBuf
;;*应用资源:     R7,R6,,R1,R0,ACC,F0
;;*参数说明:     R0 ;存放要发送的数据缓冲区的首址
;;*		R1 ;信息的报文描述符结构的的首地址
;;*返回值:		R7 ;
;*           	0		  ; 表示将数据成功的写到到CAN591的发送缓冲区
;*		SJA_TXBUFLOCK	  ; CAN591发送缓冲区锁定
;*           	SJA_WTXBUF_ERR    ; 表示写数据失败
;*
;*说明:     该子程序用于将要发送到总线的特定帧格式的数据写入CAN591的发送缓冲区
;***********************************************************************************************************************
;*/
SJAWriteDataToTxBuf:
	MOV	A,REG_CANSTA
	JB	ACC.2,SJAWriteDATA
	MOV	R7,#SJA_TXBUFLOCK
    	RET
SJAWriteDATA:
	MOV	A,@R1
	JB	ACC.6,SJAWriteDTB0			;远程帧
	JB	ACC.7,SJAWriteDTB1			;扩展帧
	;;;以下是标准帧、数据帧
	MOV	REG_CANADR,#REG_CAN_TXFMINFO
	MOV     R7,#03
	MOV     A,@R1
	ANL     A,#0FH
	MOV     R6,A
SJAWrite0: 
	MOV     A,@R1
	MOV 	REG_CANDAT,A
	INC	R1
        DJNZ	R7,SJAWrite0
SJAWrite1:
    	MOV     A,R6
	JZ	SJAWriteQuit
SJAWrite2:
	MOV     A,@R0
	MOV     REG_CANDAT,A
	INC     R0
	DJNZ    R6,SJAWrite2
SJAWriteQuit:
	RET
SJAWriteDTB0:
	AJMP	SJAWriteDTB3
;;以下是扩展帧、数据帧    
SJAWriteDTB1:
	MOV	REG_CANADR,#REG_CAN_TXFMINFO
	MOV     R7,#05
	MOV     A,@R1
	ANL     A,#0FH
	MOV     R6,A
SJAWrite3: 
	MOV     A,@R1
	MOV	REG_CANDAT,A
	INC	R1
    	DJNZ	R7,SJAWrite3
SJAWrite4:
	MOV     A,R6
	JZ	SJAWriteQuit
SJAWrite5:
	MOV     A,@R0
	MOV     REG_CANDAT,A
	INC     R0
	DJNZ    R6,SJAWrite5	
	RET
;;远程帧
SJAWriteDTB3:	
	JB	ACC.7,SJAWriteDTB4			;扩展帧
	;;以下是远程帧、标准帧
	MOV	REG_CANADR,#REG_CAN_TXFMINFO
	MOV     R7,#03
SJAWrite6: 
	MOV	REG_CANDAT,@R1
	INC	R1
    	DJNZ	R7,SJAWrite6
	RET
	;;以下是远程帧、扩展帧
SJAWriteDTB4:
	MOV	REG_CANADR,#REG_CAN_TXFMINFO
	MOV     R7,#05
SJAWrite7: 
	MOV     A,@R1
	MOV	REG_CANDAT,A
	INC	R1
    	DJNZ	R7,SJAWrite7
	RET	
	
;/*
;***********************************************************************************************************************
;*子程序:    	 SJAReadDataFromRxBuf
;;*应用资源:     R7,R6,,R1,R0,AC
;;*参数说明:     R0 ;存放要发送的数据缓冲区的首址
;;*		R1 ;信息的报文描述符结构的的首地址
;;*返回值:	 R7 ;
;*           	0		  ; 表示将读取数据成功
;*		SJA_RXBUFEMPTY	  ; CAN591接收缓冲区为空
;*           	SJA_RRXVUF_ERR    ; CAN591接收数据错
;*
;*说明:     该子程序用于从CAN591读取数据
;***********************************************************************************************************************
;*/
SJAReadDataFromRxBuf:
	MOV	A,REG_CANSTA	
	JB	ACC.0,SJAReadData
	MOV	R7,#SJA_RXBUFEMPTY
	RET
SJAReadData:
	MOV	REG_CANADR,#REG_CAN_RXFMINFO
	MOV	A,REG_CANDAT
	JB	ACC.7,SJAReadDataFRB0	;是否为扩展帧
	JB	ACC.6,SJAReadDataFRB1	;是否为远程帧
	;以下是接收数据帧、标准帧
	MOV	R7,#03
	ANL	A,#0FH
	MOV     R6,A
        MOV	REG_CANADR,#REG_CAN_RXFMINFO
SJAReadData0:
	MOV     A,REG_CANDAT
    	MOV	@R1,A
	INC	R1
	DJNZ	R7,SJAReadData0
SJAReadData1:
	MOV	A,R6
	JZ	SJAReadDataQuit
SJAReadData2:
	MOV     A,REG_CANDAT
    	MOV	@R0,A
	INC	R0
	DJNZ	R6,SJAReadData2
SJAReadDataQuit:
	RET
SJAReadDataFRB0:
	AJMP	SJAReadDataFRB2
;;以下为标准帧远程帧
SJAReadDataFRB1:
	MOV	R7,#03
        MOV	REG_CANADR,#REG_CAN_RXFMINFO
SJAReadData3:
	MOV     A,REG_CANDAT
	MOV	@R1,A
	INC	R1
	DJNZ	R7,SJAReadData3
	RET
;;以下为扩展帧
SJAReadDataFRB2:
	JB	ACC.6,SJAReadDataFRB3	;是否为远程帧
;;;以下为扩展帧、数据帧
	MOV	R7,#05
	ANL	A,#0FH
	MOV     R6,A
        MOV	REG_CANADR,#REG_CAN_RXFMINFO
SJAReadData4:
	MOV     A,REG_CANDAT
    	MOV	@R1,A
	INC	R1
	DJNZ	R7,SJAReadData4
SJAReadData5:
	MOV	A,R6
	JZ	SJAReadDataQuit1
SJAReadData6:
	MOV     A,REG_CANDAT
    	MOV	@R0,A
	INC	R0
	DJNZ	R6,SJAReadData6
SJAReadDataQuit1:
	RET
;;;以下为扩展帧\远程帧
SJAReadDataFRB3:
	MOV	R7,#05
        MOV	REG_CANADR,#REG_CAN_RXFMINFO
SJAReadData7:
	MOV    A,REG_CANDAT
	MOV	@R1,A
	INC	R1
	DJNZ	R7,SJAReadData7
	RET

;/*
;***********************************************************************************************************************
;*子程序:   	SJASystemPrgCMD(unsigned char cmd)
;;*应用资源:	R7,R6,,R1,R0,ACC,CY,DPTR
;;*参数说明:    R7 ;命令字
;;*返回值:	R7 ;	
;*           	0		  ; 表示命令执行成功
;*		SJA_IMPCMD_ERR	  ; 表示命令执行出错
;*		SJA_NOTHISCMD     ; 没有此命令
;*
;*说明:     该子程序用于执行CAN591的命令
;***********************************************************************************************************************
;*/
SJASystemPrgCMD:
	MOV	REG_CANADR,#REG_CAN_CMR
	MOV	A,R7
	CLR	CY
	CJNE	A,#12H,SJASystemPrgCMD0
	MOV	REG_CANDAT,A
	CLR     A
	MOV	R7,A
	RET
SJASystemPrgCMD0:
	JC	SJASystemPrgCMD1
    	MOV	R7,#SJA_NOTHISCMD
	RET
SJASystemPrgCMD1:
	MOV	DPTR,#SJACMD_TAB
	MOVC    A,@A+DPTR
	CJNE	A,#0FFH,SJASystemPrgCMD2
	MOV	R7,#SJA_NOTHISCMD
	RET
SJASystemPrgCMD2:
	MOV	REG_CANADR,#REG_CAN_CMR
	MOV	REG_CANDAT,A
	MOV	R7,#00
	RET
SJACMD_TAB:
	DB	0FFH		;无此命令字
	DB	01H		;正常发送
	DB  	02H		;中止发送
	DB	03H		;单次正常发送	
	DB	04H		;释放接受缓冲区
	DB  	0FFH		;
	DB	0FFH		;
	DB	0FFH		;
	DB  	08H		;清除数据溢出
	DB	0FFH		;
	DB	0FFH		;
	DB  	0FFH		;
	DB	0FFH		;
	DB	0FFH		;
	DB  	0FFH		;
	DB	0FFH		;
	DB	010H		;自我发送请求
	DB	0FFH		;
	DB  	012H		;单次自我发送请求
;/*
;;*******************************************************************************************************************
;*                          PeliCAN 模式 定义结束
;;*******************************************************************************************************************
;;*/
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -