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

📄 can162.lst

📁 Atmel mcu can interface design example
💻 LST
📖 第 1 页 / 共 4 页
字号:
    0363 DEC2      RCALL	_SJASetAccMask
    0364 2F60      MOV	R22,R16
(0450) 	   }while(temp);
    0365 2366      TST	R22
    0366 F7B9      BNE	0x035E
(0451) 	   WDR();
    0367 95A8      WDR
(0452) 	   for(k=0;k<6;k++); 				//延时约5us
    0368 2744      CLR	R20
    0369 2755      CLR	R21
    036A C002      RJMP	0x036D
    036B 5F4F      SUBI	R20,0xFF
    036C 4F5F      SBCI	R21,0xFF
    036D 3046      CPI	R20,6
    036E E0E0      LDI	R30,0
    036F 075E      CPC	R21,R30
    0370 F3D0      BCS	0x036B
(0453) 	   do
(0454) 	   {
(0455) 	      temp = SJASetOtherReg();
    0371 DF36      RCALL	_SJASetOtherReg
    0372 2F60      MOV	R22,R16
(0456) 	   }while(temp);
    0373 2366      TST	R22
    0374 F7E1      BNE	0x0371
(0457) 	   WDR();
    0375 95A8      WDR
(0458) 	   for(k=0;k<6;k++); 				//延时约5us
    0376 2744      CLR	R20
    0377 2755      CLR	R21
    0378 C002      RJMP	0x037B
    0379 5F4F      SUBI	R20,0xFF
    037A 4F5F      SBCI	R21,0xFF
    037B 3046      CPI	R20,6
    037C E0E0      LDI	R30,0
    037D 075E      CPC	R21,R30
    037E F3D0      BCS	0x0379
(0459) 	   do
(0460) 	   {
(0461) 	      temp = SJAQuitResetMode();
    037F DE0D      RCALL	_SJAQuitResetMode
    0380 2F60      MOV	R22,R16
(0462) 	   }while(temp);
    0381 2366      TST	R22
    0382 F7E1      BNE	0x037F
(0463) 	   
(0464) 	   WDR();
    0383 95A8      WDR
(0465) 	   for(k=0;k<6;k++); 				//延时约5us
    0384 2744      CLR	R20
    0385 2755      CLR	R21
    0386 C002      RJMP	0x0389
    0387 5F4F      SUBI	R20,0xFF
    0388 4F5F      SBCI	R21,0xFF
    0389 3046      CPI	R20,6
    038A E0E0      LDI	R30,0
    038B 075E      CPC	R21,R30
    038C F3D0      BCS	0x0387
(0466) 	   do
(0467) 	   {
(0468) 	      temp = SJASetIER(0x01);
    038D E001      LDI	R16,1
    038E DF4F      RCALL	_SJASetIER
    038F 2F60      MOV	R22,R16
(0469) 	   }while(temp);
    0390 2366      TST	R22
    0391 F7D9      BNE	0x038D
(0470) 	   
(0471) 	   
(0472) 	}
(0473) 	
(0474) 	write_sja(CMR,0x0c);		  	//清除数据溢出和释放接收缓冲器;
    0392 E02C      LDI	R18,0xC
    0393 E001      LDI	R16,1
    0394 DDBA      RCALL	_write_sja
(0475) 	for(k=0;k<6;k++); 				//延时约5us
    0395 2744      CLR	R20
    0396 2755      CLR	R21
    0397 C002      RJMP	0x039A
    0398 5F4F      SUBI	R20,0xFF
    0399 4F5F      SBCI	R21,0xFF
    039A 3046      CPI	R20,6
    039B E0E0      LDI	R30,0
    039C 075E      CPC	R21,R30
    039D F3D0      BCS	0x0398
(0476) 	WDR();
    039E 95A8      WDR
(0477) 	do
(0478) 	{
(0479) 	   write_sja(MODE, 0x0C);
    039F E02C      LDI	R18,0xC
    03A0 2700      CLR	R16
    03A1 DDAD      RCALL	_write_sja
(0480) 	}while((read_sja(MODE) & 0x01));
    03A2 2700      CLR	R16
    03A3 DD9E      RCALL	_read_sja
    03A4 FD00      SBRC	R16,0
    03A5 CFF9      RJMP	0x039F
(0481) 	/*WDR();
(0482) 	for(k=0;k<6;k++); 				//延时约5us
(0483) 	if(SJATestRstMode())
(0484) 	{
(0485) 	   do
(0486) 	   {
(0487) 	      temp = SJASetIER(0x01);
(0488) 	   }while(temp);
(0489) 	}*/
(0490) 	SEI();
    03A6 9478      BSET	7
(0491) 	
(0492) } 
    03A7 9623      ADIW	R28,3
    03A8 940E04BE  CALL	pop_gset2
    03AA 9508      RET
(0493) /*************************************************
(0494)                 SJA1000发送子函数
(0495) *************************************************/
(0496) void CanTransmit(void) 
(0497) { 
(0498) 	unsigned char status;
(0499) 	CLI();		   	   	 		   //关中断		
_CanTransmit:
  status               --> Y+1
    03AB 94F8      BCLR	7
(0500) 	//实际用时对SJAWriteDataToTxBuf();的调用在个检测模块中
(0501) 	/*SJAWriteDataToTxBuf(0, 0x88);
(0502)     SJAWriteDataToTxBuf(1, 0x00);		
(0503) 	SJAWriteDataToTxBuf(2, 0x00);
(0504) 	SJAWriteDataToTxBuf(3, 0x00);
(0505) 	SJAWriteDataToTxBuf(4, 0x00);
(0506) 	SJAWriteDataToTxBuf(5, 0x01);
(0507) 	SJAWriteDataToTxBuf(6, 0x02);
(0508) 	SJAWriteDataToTxBuf(7, 0x03);	
(0509) 	SJAWriteDataToTxBuf(8, 0x04);	
(0510) 	SJAWriteDataToTxBuf(9, 0x05);	
(0511) 	SJAWriteDataToTxBuf(10, 0x06);	
(0512) 	SJAWriteDataToTxBuf(11, 0x07);	
(0513) 	SJAWriteDataToTxBuf(12, 0xaa);*/
(0514) 	TX_Buffer[0]=0x88;		
    03AC E888      LDI	R24,0x88
    03AD 9380008C  STS	R24,_TX_Buffer
(0515) 	TX_Buffer[1]=0x00;	
    03AF 2422      CLR	R2
    03B0 9220008D  STS	R2,_TX_Buffer+1
(0516) 	TX_Buffer[2]=0x00;	
    03B2 9220008E  STS	R2,_TX_Buffer+2
(0517) 	TX_Buffer[3]=0x00;	
    03B4 9220008F  STS	R2,_TX_Buffer+3
(0518) 	TX_Buffer[4]=0x00;	
    03B6 92200090  STS	R2,0x90
(0519) 	TX_Buffer[5]=0x01;	
    03B8 E081      LDI	R24,1
    03B9 93800091  STS	R24,0x91
(0520) 	TX_Buffer[6]=0x02;	
    03BB E082      LDI	R24,2
    03BC 93800092  STS	R24,0x92
(0521) 	TX_Buffer[7]=0x03;	
    03BE E083      LDI	R24,3
    03BF 93800093  STS	R24,0x93
(0522) 	TX_Buffer[8]=0x04;	
    03C1 E084      LDI	R24,4
    03C2 93800094  STS	R24,0x94
(0523) 	TX_Buffer[9]=0x05;	
    03C4 E085      LDI	R24,5
    03C5 93800095  STS	R24,0x95
(0524) 	TX_Buffer[10]=0x06;	
    03C7 E086      LDI	R24,6
    03C8 93800096  STS	R24,0x96
(0525) 	TX_Buffer[11]=0x07;	
    03CA E087      LDI	R24,7
    03CB 93800097  STS	R24,0x97
(0526) 	TX_Buffer[12]=0xaa;	
    03CD EA8A      LDI	R24,0xAA
    03CE 93800098  STS	R24,0x98
(0527) 					  
(0528) 	while(!(read_sja(SR)&0x04));  //wait until reg2^2==1 ,即判断发送缓冲器的状态
    03D0 E002      LDI	R16,2
    03D1 DD70      RCALL	_read_sja
    03D2 FF02      SBRS	R16,2
    03D3 CFFC      RJMP	0x03D0
(0529) 	
(0530) 	write_sja(TXEFF, TX_Buffer[0]);		   //扩展帧,数据长度为8个字节
    03D4 9120008C  LDS	R18,_TX_Buffer
    03D6 E100      LDI	R16,0x10
    03D7 DD77      RCALL	_write_sja
(0531) 	write_sja(TXID0, TX_Buffer[1]);
    03D8 9120008D  LDS	R18,_TX_Buffer+1
    03DA E101      LDI	R16,0x11
    03DB DD73      RCALL	_write_sja
(0532) 	write_sja(TXID1, TX_Buffer[2]);
    03DC 9120008E  LDS	R18,_TX_Buffer+2
    03DE E102      LDI	R16,0x12
    03DF DD6F      RCALL	_write_sja
(0533) 	write_sja(TXID2, TX_Buffer[3]);
    03E0 9120008F  LDS	R18,_TX_Buffer+3
    03E2 E103      LDI	R16,0x13
    03E3 DD6B      RCALL	_write_sja
(0534) 	write_sja(TXID3, TX_Buffer[4]);
    03E4 91200090  LDS	R18,0x90
    03E6 E104      LDI	R16,0x14
    03E7 DD67      RCALL	_write_sja
(0535) 	write_sja(TXDATA0, TX_Buffer[5]);
    03E8 91200091  LDS	R18,0x91
    03EA E105      LDI	R16,0x15
    03EB DD63      RCALL	_write_sja
(0536) 	write_sja(TXDATA1, TX_Buffer[6]);
    03EC 91200092  LDS	R18,0x92
    03EE E106      LDI	R16,0x16
    03EF DD5F      RCALL	_write_sja
(0537) 	write_sja(TXDATA2, TX_Buffer[7]);
    03F0 91200093  LDS	R18,0x93
    03F2 E107      LDI	R16,0x17
    03F3 DD5B      RCALL	_write_sja
(0538) 	write_sja(TXDATA3, TX_Buffer[8]);
    03F4 91200094  LDS	R18,0x94
    03F6 E108      LDI	R16,0x18
    03F7 DD57      RCALL	_write_sja
(0539) 	write_sja(TXDATA4, TX_Buffer[9]);
    03F8 91200095  LDS	R18,0x95
    03FA E109      LDI	R16,0x19
    03FB DD53      RCALL	_write_sja
(0540) 	write_sja(TXDATA5, TX_Buffer[10]);
    03FC 91200096  LDS	R18,0x96
    03FE E10A      LDI	R16,0x1A
    03FF DD4F      RCALL	_write_sja
(0541) 	write_sja(TXDATA6, TX_Buffer[11]);
    0400 91200097  LDS	R18,0x97
    0402 E10B      LDI	R16,0x1B
    0403 DD4B      RCALL	_write_sja
(0542) 	write_sja(TXDATA7, TX_Buffer[12]);
    0404 91200098  LDS	R18,0x98
    0406 E10C      LDI	R16,0x1C
    0407 DD47      RCALL	_write_sja
(0543) 	write_sja(CMR,0x10);		  //发送请求命令
    0408 E120      LDI	R18,0x10
    0409 E001      LDI	R16,1
    040A DD44      RCALL	_write_sja
(0544) 	while(!(read_sja(SR) & 0x08));//检测SR.3位,判断发送是否完成
    040B E002      LDI	R16,2
    040C DD35      RCALL	_read_sja
    040D FF03      SBRS	R16,3
    040E CFFC      RJMP	0x040B
(0545) 	SEI();				  	  	  //开中断
    040F 9478      BSET	7
(0546) } 
    0410 9508      RET
_CanReceive:
  sff                  --> R12
  number               --> R20
  result               --> R22
  status               --> R20
  prbuf                --> R10
  i                    --> R12
    0411 940E04B6  CALL	push_gset4
(0547) 
(0548) unsigned char CanReceive(void)
(0549) {
(0550)  	unsigned char result = FALSE;
    0413 2766      CLR	R22
(0551) 	unsigned char status,number,i,sff;
(0552) 	unsigned char prbuf;
(0553) 	status = read_sja(SR);
    0414 E002      LDI	R16,2
    0415 DD2C      RCALL	_read_sja
    0416 2F40      MOV	R20,R16
(0554) 	prbuf = RXEFF;
    0417 E180      LDI	R24,0x10
    0418 2EA8      MOV	R10,R24
(0555) 	if((status&0xc3) != 0)  		  //读取总线脱离、错误状态、接收溢出、有数据等位
    0419 2F84      MOV	R24,R20
    041A 7C83      ANDI	R24,0xC3
    041B F409      BNE	0x041D
    041C C043      RJMP	0x0460
(0556) 	{
(0557) 		if((status&0x80) == 0x80)
    041D 2F84      MOV	R24,R20
    041E 7880      ANDI	R24,0x80
    041F 3880      CPI	R24,0x80
    0420 F429      BNE	0x0426
(0558) 		{
(0559) 			write_sja(MODE, 0x00);
    0421 2722      CLR	R18
    0422 2700      CLR	R16
    0423 DD2B      RCALL	_write_sja
(0560) 			return FALSE;
    0424 2700      CLR	R16
    0425 C03B      RJMP	0x0461
(0561) 		}
(0562) 		if((status&0x02) == 0x02)
    0426 2F84      MOV	R24,R20
    0427 7082      ANDI	R24,2
    0428 3082      CPI	R24,2
    0429 F429      BNE	0x042F
(0563) 		{
(0564) 			write_sja(CMR, 0x0c);
    042A E02C      LDI	R18,0xC
    042B E001      LDI	R16,1
    042C DD22      RCALL	_write_sja
(0565) 			return FALSE;
    042D 2700      CLR	R16
    042E C032      RJMP	0x0461
(0566) 		}
(0567) 		
(0568) 		if((status&0x01) == 0x01)
    042F 2F84      MOV	R24,R20
    0430 7081      ANDI	R24,1
    0431 3081      CPI	R24,1
    0432 F569      BNE	0x0460
(0569) 		{
(0570) 			if((read_sja(RXEFF) & 0x40) == 0x40)  //如果RTR=1,为远程帧
    0433 E100      LDI	R16,0x10
    0434 DD0D      RCALL	_read_sja
    0435 2F80      MOV	R24,R16
    0436 7480      ANDI	R24,0x40
    0437 3480      CPI	R24,0x40
    0438 F421      BNE	0x043D
(0571) 			{
(0572) 				write_sja(CMR, 0x04);		  //则释放FXFIFO
    0439 E024      LDI	R18,4
    043A E001      LDI	R16,1
    043B DD13      RCALL	_write_sja
(0573) 			}
    043C C023      RJMP	0x0460
(0574) 			else							  //为0,则是数据帧
(0575) 			{
(0576) 				sff = read_sja(prbuf) & 0x80;	  //取第一个字节的最高位
    043D 2D0A      MOV	R16,R10
    043E DD03      RCALL	_read_sja
    043F 2F80      MOV	R24,R16
    0440 7880      ANDI	R24,0x80
    0441 2EC8      MOV	R12,R24
(0577) 				number = (read_sja(prbuf) & 0x0f);//取第一个字节的低四位,即数据长度
    0442 2D0A      MOV	R16,R10
    0443 DCFE      RCALL	_read_sja
    0444 2F40      MOV	R20,R16
    0445 704F      ANDI	R20,0xF
(0578) 				if((sff & 0x80) == 0x80)		  //判断是标准帧还是扩展帧
    0446 2D8C      MOV	R24,R12
    0447 7880      ANDI	R24,0x80
    0448 3880      CPI	R24,0x80
    0449 F411      BNE	0x044C
(0579) 				   number = number + 5;			  //扩展帧,则帧的总长度加5(13字节)
    044A 5F4B      SUBI	R20,0xFB
    044B C001      RJMP	0x044D
(0580) 				else
(0581) 				   number = number + 3;			  //标准帧,则帧的总长度加3(11字节)
    044C 5F4D      SUBI	R20,0xFD
(0582) 				for(i = 0; i < number; i++)		  //读取数据
    044D 24CC      CLR	R12
    044E C00B      RJMP	0x045A
(0583) 				{
(0584) 					RX_Buffer[i]=read_sja(prbuf);
    044F 2D0A      MOV	R16,R10
    0450 DCF1      RCALL	_read_sja
    0451 E78F      LDI	R24,0x7F
    0452 E090      LDI	R25,0
    0453 2DEC      MOV	R30,R12
    0454 27FF      CLR	R31
    0455 0FE8      ADD	R30,R24
    0456 1FF9      ADC	R31,R25
    0457 8300      STD	R16,0+Z
(0585) 					prbuf++;
    0458 94A3      INC	R10
    0459 94C3      INC	R12
    045A 16C4      CP	R12,R20
    045B F398      BCS	0x044F
(0586) 				}
(0587) 				result = TRUE;	 		 	  //读取到正确的数据则返回TRUE
    045C E061      LDI	R22,1
(0588) 				write_sja(CMR, 0x04);		  //最后释放FXFIFO
    045D E024      LDI	R18,4
    045E E001      LDI	R16,1
    045F DCEF      RCALL	_write_sja
(0589) 			}
(0590) 		}
(0591) 	}
(0592) 	return result;
FILE: <library>
    0460 2F06      MOV	R16,R22
    0461 940E04C4  CALL	pop_gset4
    0463 9508      RET
push_arg4:
    0464 933A      ST	R19,-Y
    0465 932A      ST	R18,-Y
push_arg2:
    0466 931A      ST	R17,-Y
    0467 930A      ST	R16,-Y
    0468 9508      RET
push_lset:
    0469 93FA      ST	R31,-Y
    046A 93EA      ST	R30,-Y
    046B 93BA      ST	R27,-Y
    046C 93AA      ST	R26,-Y
    046D 939A      ST	R25,-Y
    046E 938A      ST	R24,-Y
    046F 933A      ST	R19,-Y
    0470 932A      ST	R18,-Y
    0471 931A      ST	R17,-Y
    0472 930A      ST	R16,-Y
    0473 929A      ST	R9,-Y
    0474 928A      ST	R8,-Y
    0475 927A      ST	R7,-Y
    0476 926A      ST	R6,-Y
    0477 925A      ST	R5,-Y
    0478 924A      ST	R4,-Y
    0479 923A      ST	R3,-Y
    047A 922A      ST	R2,-Y
    047B 921A      ST	R1,-Y
    047C 920A      ST	R0,-Y
    047D B60F      IN	R0,P3F
    047E 920A      ST	R0,-Y
    047F 9508      RET
pop_lset:
    0480 9009      LD	R0,Y+
    0481 BE0F      OUT	P3F,R0
    0482 9009      LD	R0,Y+
    0483 9019      LD	R1,Y+
    0484 9029      LD	R2,Y+
    0485 9039      LD	R3,Y+
    0486 9049      LD	R4,Y+
    0487 9059      LD	R5,Y+
    0488 9069      LD	R6,Y+
    0489 9079      LD	R7,Y+
    048A 9089      LD	R8,Y+
    048B 9099      LD	R9,Y+
    048C 9109      LD	R16,Y+
    048D 9119      LD	R17,Y+
    048E 9129      LD	R18,Y+
    048F 9139      LD	R19,Y+
    0490 9189      LD	R24,Y+
    0491 9199      LD	R25,Y+
    0492 91A9      LD	R26,Y+
    0493 91B9      LD	R27,Y+
    0494 91E9      LD	R30,Y+
    0495 91F9      LD	R31,Y+
    0496 9508      RET
push_gset1:
    0497 935A      ST	R21,-Y
    0498 934A      ST	R20,-Y
    0499 9508      RET
pop_gset1:
    049A E0E1      LDI	R30,1
pop:
    049B 9149      LD	R20,Y+
    049C 9159      LD	R21,Y+
    049D FDE0      SBRC	R30,0
    049E 9508      RET
    049F 9169      LD	R22,Y+
    04A0 9179      LD	R23,Y+
    04A1 FDE1      SBRC	R30,1
    04A2 9508      RET
    04A3 90A9      LD	R10,Y+
    04A4 90B9      LD	R11,Y+
    04A5 FDE2      SBRC	R30,2
    04A6 9508      RET
    04A7 90C9      LD	R12,Y+
    04A8 90D9      LD	R13,Y+
    04A9 FDE3      SBRC	R30,3
    04AA 9508      RET
    04AB 90E9      LD	R14,Y+
    04AC 90F9      LD	R15,Y+
    04AD 9508      RET
push_gset2:
    04AE 937A      ST	R23,-Y
    04AF 936A      ST	R22,-Y
    04B0 940C0497  JMP	push_gset1
push_gset3:
    04B2 92BA      ST	R11,-Y
    04B3 92AA      ST	R10,-Y
    04B4 940C04AE  JMP	push_gset2
push_gset4:
    04B6 92DA      ST	R13,-Y
    04B7 92CA      ST	R12,-Y
    04B8 940C04B2  JMP	push_gset3
push_gset5:
    04BA 92FA      ST	R15,-Y
    04BB 92EA      ST	R14,-Y
    04BC 940C04B6  JMP	push_gset4
pop_gset2:
    04BE E0E2      LDI	R30,2
    04BF 940C049B  JMP	pop
pop_gset3:
    04C1 E0E4      LDI	R30,4
    04C2 940C049B  JMP	pop
pop_gset4:
    04C4 E0E8      LDI	R30,0x8
    04C5 940C049B  JMP	pop
pop_gset5:
    04C7 27EE      CLR	R30
    04C8 940C049B  JMP	pop

⌨️ 快捷键说明

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