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

📄 can.s

📁 MCU:ATMEGA8515 Frequence: 16M 描述:利用已有CAN TEST V1.0电路板进行调试, 可靠性测试已通过
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module CAN.c
	.area data(ram, con, rel)
_sja_address::
	.blkb 2
	.area idata
	.word 32512
	.area data(ram, con, rel)
	.dbfile E:\罗鹏\工作资料\工作记录\CAN\程序\完成版本\CAN.c
	.dbsym e sja_address _sja_address pc
	.area text(rom, con, rel)
	.dbfile E:\罗鹏\工作资料\工作记录\CAN\程序\完成版本\CAN.c
	.dbfunc e read_sja _read_sja fc
;           addr -> R16
	.even
_read_sja::
	.dbline -1
	.dbline 76
; /******************************************
; MCU:ATMEGA8515
; Frequence: 8M
; ******************************************/
; #include "iom8515v.h"
; #include "macros.h"
; #include "MAIN.h"
; #include "CAN.h"
; #define startadd 0x7f00		//SJA1000的首地址
; uchar CanMode[14];
; uchar TransBuffer[13];
; uchar RxBuffer[13];
; uchar RevFlag;
; #define FALSE 0
; #define TRUE 1
; #define MODE	0x00		//模式寄存器
; #define CMR		0x01		//命令寄存器
; #define SR		0x02		//状态寄存器
; #define IR		0x03		//中断寄存器
; #define IER		0x04		//中断使能寄存器
; #define BTR0	0x06		//总线时序寄存器0
; #define BTR1	0x07		//总线时序寄存器1
; #define OCR		0x08		//输出控制寄存器 
; #define TEST	0x09
; #define ALC		0x0B		//仲裁丢失捕捉寄存器
; #define ECC		0x0C		//错误代码捕捉寄存器
; #define EWLR	0x0D		//错误报警限额寄存器
; #define RXERR	0x0E		//RX错误计数寄存器
; #define TXERR	0x0F		//TX错误计数寄存器
; #define ACR0	0x10		//验收代码寄存器
; #define ACR1	0x11
; #define ACR2	0x12
; #define ACR3	0x13
; #define AMR0	0x14		//验收屏障寄存器
; #define AMR1	0x15
; #define AMR2	0x16
; #define AMR3	0x17
; ///////////////////////////
; #define TXEFF   0x10
; #define TXID0   0x11
; #define TXID1   0x12
; #define TXID2   0x13
; #define TXID3   0x14
; 
; #define RXEFF   0x10
; #define RXID0   0x11
; #define RXID1   0x12
; #define RXID2   0x13
; #define RXID3   0x14
; 
; #define TXDATA0 0x15
; #define TXDATA1 0x16
; #define TXDATA2 0x17
; #define TXDATA3 0x18
; #define TXDATA4 0x19
; #define TXDATA5 0x1A
; #define TXDATA6 0x1B
; #define TXDATA7 0x1C
; 
; #define RXDATA0 0x15
; #define RXDATA1 0x16
; #define RXDATA2 0x17
; #define RXDATA3 0x18
; #define RXDATA4 0x19
; #define RXDATA5 0x1A
; #define RXDATA6 0x1B
; #define RXDATA7 0x1C
; //////////////////////////
; #define RMC		0x1D		//RX报文计数器
; #define RBSA	0x1E		//RX缓冲器起始地址寄存器
; #define CDR		0x1F		//时钟分频寄存器
; //////////////////////////////////////////////////////////////////////
; uchar *sja_address=(uchar *)startadd;
; 
; uchar read_sja(uchar addr) 				   //读SJA1000状态寄存器子程序
; {
	.dbline 77
; 	sja_address=(uchar *)startadd;
	ldi R24,32512
	ldi R25,127
	sts _sja_address+1,R25
	sts _sja_address,R24
	.dbline 78
; 	sja_address=sja_address+addr;
	mov R4,R16
	clr R5
	add R4,R24
	adc R5,R25
	sts _sja_address+1,R5
	sts _sja_address,R4
	.dbline 79
; 	return (*(sja_address));
	movw R30,R4
	ldd R16,z+0
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r addr 16 c
	.dbend
	.dbfunc e write_sja _write_sja fV
;            val -> R18
;           addr -> R16
	.even
_write_sja::
	.dbline -1
	.dbline 83
; }
; 
; void write_sja(uchar addr,uchar val) 	   //写SJA1000控制寄存器子程序
; {
	.dbline 84
; 	sja_address=(uchar *)startadd;
	ldi R24,32512
	ldi R25,127
	sts _sja_address+1,R25
	sts _sja_address,R24
	.dbline 85
; 	sja_address=sja_address+addr;
	mov R4,R16
	clr R5
	add R4,R24
	adc R5,R25
	sts _sja_address+1,R5
	sts _sja_address,R4
	.dbline 86
; 	*(sja_address)=val;
	movw R30,R4
	std z+0,R18
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbsym r val 18 c
	.dbsym r addr 16 c
	.dbend
	.dbfunc e Init_CAN _Init_CAN fV
;           temp -> <dead>
;              k -> R20,R21
	.even
_Init_CAN::
	rcall push_gset1
	.dbline -1
	.dbline 93
; }
; 
; /*************************************************
;             初始化SJA1000主控制器子函数
; *************************************************/
; void Init_CAN(void)                
; {
	.dbline 96
; 	uchar temp;
; 	uint k ; 
; 	CLI();
	cli
	.dbline 97
; 	write_sja(MODE,0x09);
	ldi R18,9
	clr R16
	rcall _write_sja
	.dbline 98
; 	read_sja(IR);		 	   	    //读取CAN的中断标识
	ldi R16,3
	rcall _read_sja
	rjmp L5
L4:
	.dbline 100
	.dbline 101
	ldi R18,1
	clr R16
	rcall _write_sja
	.dbline 102
L5:
	.dbline 99
; 	while(!(read_sja(MODE)&0x01))	//检测SJA1000是否达到复位工作模式
	clr R16
	rcall _read_sja
	sbrs R16,0
	rjmp L4
	.dbline 104
	clr R20
	clr R21
	rjmp L10
L7:
	.dbline 104
L8:
	.dbline 104
	subi R20,255  ; offset = 1
	sbci R21,255
L10:
	.dbline 104
; 	{
; 	   write_sja(MODE,0x01);		//进入复位工作模式
; 	}
; 	
; 	for(k=0;k<6;k++); 				//延时约5us
	cpi R20,6
	ldi R30,0
	cpc R21,R30
	brlo L7
	.dbline 105
; 	write_sja(CDR,0xC8);            //PeliCAN 模式,禁能CLOCKOUT引脚
	ldi R18,200
	ldi R16,31
	rcall _write_sja
	.dbline 106
	clr R20
	clr R21
	rjmp L14
L11:
	.dbline 106
L12:
	.dbline 106
	subi R20,255  ; offset = 1
	sbci R21,255
L14:
	.dbline 106
; 	for(k=0;k<6;k++); 				//延时约5us
	cpi R20,6
	ldi R30,0
	cpc R21,R30
	brlo L11
	.dbline 107
; 	write_sja(BTR0,0x04); 	        //设置时钟分频器,500k
	ldi R18,4
	ldi R16,6
	rcall _write_sja
	.dbline 108
; 	write_sja(BTR1,0x1c); 	        
	ldi R18,28
	ldi R16,7
	rcall _write_sja
	.dbline 109
; 	write_sja(OCR,0x1a); 	        //输出控制
	ldi R18,26
	ldi R16,8
	rcall _write_sja
	.dbline 110
; 	write_sja(RXERR,0x00);			
	clr R18
	ldi R16,14
	rcall _write_sja
	.dbline 111
; 	write_sja(TXERR,0x00);
	clr R18
	ldi R16,15
	rcall _write_sja
	.dbline 112
; 	write_sja(ECC,0x00);
	clr R18
	ldi R16,12
	rcall _write_sja
	.dbline 113
; 	write_sja(RBSA,0x00);			//缓存器起始地址寄存器设置为0
	clr R18
	ldi R16,30
	rcall _write_sja
	.dbline 115
; 	
; 	write_sja(ACR0,0x00); 	        //acceptcode default ffffffff
	clr R18
	ldi R16,16
	rcall _write_sja
	.dbline 116
; 	write_sja(ACR1,0x00);
	clr R18
	ldi R16,17
	rcall _write_sja
	.dbline 117
; 	write_sja(ACR2,0x00);
	clr R18
	ldi R16,18
	rcall _write_sja
	.dbline 118
; 	write_sja(ACR3,0x00);
	clr R18
	ldi R16,19
	rcall _write_sja
	.dbline 120
; 
; 	write_sja(AMR0,0xff);  			//acceptmask default ffffffff
	ldi R18,255
	ldi R16,20
	rcall _write_sja
	.dbline 121
; 	write_sja(AMR0,0xff);
	ldi R18,255
	ldi R16,20
	rcall _write_sja
	.dbline 122
; 	write_sja(AMR0,0xff);
	ldi R18,255
	ldi R16,20
	rcall _write_sja
	.dbline 123
; 	write_sja(AMR0,0xff);
	ldi R18,255
	ldi R16,20
	rcall _write_sja
	.dbline 125
; 
; 	write_sja(IER,0x01);            //开放接收中断
	ldi R18,1
	ldi R16,4
	rcall _write_sja
	.dbline 126
; 	write_sja(CMR,0x0c);		  	//清除数据溢出和释放接收缓冲器;
	ldi R18,12
	ldi R16,1
	rcall _write_sja
L15:
	.dbline 128
; 	do
; 	{
	.dbline 129
; 	   write_sja(MODE,0x08); 		//设置SJA1000 工作模式,单滤波接收工作模式
	ldi R18,8
	clr R16
	rcall _write_sja
	.dbline 130
; 	}
L16:
	.dbline 131
; 	while((read_sja(MODE)&0x01));	//确认复位标志是否被删除                      
	clr R16
	rcall _read_sja
	sbrc R16,0
	rjmp L15
	.dbline 132
; 	SEI();
	sei
	.dbline -2
L3:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym l temp 1 c
	.dbsym r k 20 i
	.dbend
	.dbfunc e CanTransmit _CanTransmit fV
;         status -> <dead>
	.even
_CanTransmit::
	.dbline -1
	.dbline 139
; }
; 
; /*************************************************
;                 SJA1000发送子函数
; *************************************************/
; void CanTransmit(void) 
; { 
	.dbline 141
; 	uchar status;
; 	CLI();		   	   	 		   //关中断		
	cli
	.dbline 142
; 	TransBuffer[0]=0x88;		
	ldi R24,136
	sts _TransBuffer,R24
	.dbline 143
; 	TransBuffer[1]=0x00;	
	clr R2
	sts _TransBuffer+1,R2
	.dbline 144
; 	TransBuffer[2]=0x00;	

⌨️ 快捷键说明

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