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

📄 can162.lst

📁 Atmel mcu can interface design example
💻 LST
📖 第 1 页 / 共 4 页
字号:
    025B 2F68      MOV	R22,R24
    025C 2388      TST	R24
    025D F6A9      BNE	0x0233
(0226) 	   }
(0227) 	}
(0228) 	return Err_Flag;
    025E 2F04      MOV	R16,R20
    025F 940E04C7  CALL	pop_gset5
    0261 9624      ADIW	R28,4
    0262 9508      RET
_SJASetBaudRateStandard:
  Err_Flag             --> R20
  Err_Cnt              --> R22
  BaudRateSize         --> R10
    0263 940E04B2  CALL	push_gset3
    0265 2EA0      MOV	R10,R16
(0229) }
(0230) 
(0231) //16MHZ
(0232) unsigned char SJA_BTR_CODETAB[] = {
(0233)       0x53, 0x2F,   //20KBPS    0
(0234) 	  0x87, 0xFF,   //40KBPS    1
(0235) 	  0x47, 0x2F,   //50KBPS    2
(0236) 	  0x83, 0xFF,   //80KBPS    3
(0237) 	  0x43, 0x2F,   //100KBPS   4
(0238) 	  0x03, 0x1C,   //125KBPS   5
(0239) 	  0x81, 0xFA,   //200KBPS   6
(0240) 	  0x01, 0x1C,   //250KBPS   7
(0241) 	  0x80, 0xFA,   //400KBPS   8
(0242) 	  0x00, 0x1C,   //500KBPS   9
(0243) 	  0x80, 0xB6,   //666KBPS   10
(0244) 	  0x00, 0x16,   //800KBPS   11
(0245) 	  0x00, 0x14    //1000KBPS  12
(0246) };
(0247) 
(0248) unsigned char SJASetBaudRateStandard(unsigned char BaudRateSize)
(0249) {
(0250)      unsigned char Err_Cnt = 0x20;
    0266 E260      LDI	R22,0x20
(0251) 	 unsigned char Err_Flag = TRUE;
    0267 E041      LDI	R20,1
(0252) 	 if(BaudRateSize > 12)
    0268 E08C      LDI	R24,0xC
    0269 158A      CP	R24,R10
    026A F008      BCS	0x026C
    026B C032      RJMP	0x029E
(0253) 	 {
(0254) 	    Err_Flag = TRUE;
(0255) 	 }
    026C C037      RJMP	0x02A4
(0256) 	 else
(0257) 	 {
(0258) 	    while(--Err_Cnt)
(0259) 		{
(0260) 		    write_sja(BTR0, SJA_BTR_CODETAB[BaudRateSize*2]);
    026D E082      LDI	R24,2
    026E 9D8A      MUL	R24,R10
    026F 01F0      MOVW	R30,R0
    0270 E680      LDI	R24,0x60
    0271 E090      LDI	R25,0
    0272 0FE8      ADD	R30,R24
    0273 1FF9      ADC	R31,R25
    0274 8120      LDD	R18,0+Z
    0275 E006      LDI	R16,6
    0276 DED8      RCALL	_write_sja
(0261) 			if(read_sja(BTR0) != SJA_BTR_CODETAB[BaudRateSize*2])
    0277 E006      LDI	R16,6
    0278 DEC9      RCALL	_read_sja
    0279 E082      LDI	R24,2
    027A 9D8A      MUL	R24,R10
    027B 01F0      MOVW	R30,R0
    027C E680      LDI	R24,0x60
    027D E090      LDI	R25,0
    027E 0FE8      ADD	R30,R24
    027F 1FF9      ADC	R31,R25
    0280 8020      LDD	R2,0+Z
    0281 1502      CP	R16,R2
    0282 F009      BEQ	0x0284
(0262) 			{
(0263) 			   continue;
    0283 C01A      RJMP	0x029E
(0264) 			}
(0265) 			
(0266) 			Err_Cnt = 0x20;
    0284 E260      LDI	R22,0x20
(0267) 			write_sja(BTR1, SJA_BTR_CODETAB[BaudRateSize*2 + 1]);
    0285 E082      LDI	R24,2
    0286 9D8A      MUL	R24,R10
    0287 01F0      MOVW	R30,R0
    0288 E681      LDI	R24,0x61
    0289 E090      LDI	R25,0
    028A 0FE8      ADD	R30,R24
    028B 1FF9      ADC	R31,R25
    028C 8120      LDD	R18,0+Z
    028D E007      LDI	R16,7
    028E DEC0      RCALL	_write_sja
(0268) 			if(read_sja(BTR1) != SJA_BTR_CODETAB[BaudRateSize*2 + 1])
    028F E007      LDI	R16,7
    0290 DEB1      RCALL	_read_sja
    0291 E082      LDI	R24,2
    0292 9D8A      MUL	R24,R10
    0293 01F0      MOVW	R30,R0
    0294 E681      LDI	R24,0x61
    0295 E090      LDI	R25,0
    0296 0FE8      ADD	R30,R24
    0297 1FF9      ADC	R31,R25
    0298 8020      LDD	R2,0+Z
    0299 1502      CP	R16,R2
    029A F009      BEQ	0x029C
(0269) 			{
(0270) 			   continue;
    029B C002      RJMP	0x029E
(0271) 			}
(0272) 			Err_Flag = FALSE;
    029C 2744      CLR	R20
(0273) 			break;
    029D C006      RJMP	0x02A4
    029E 2F86      MOV	R24,R22
    029F 5081      SUBI	R24,1
    02A0 2F68      MOV	R22,R24
    02A1 2388      TST	R24
    02A2 F009      BEQ	0x02A4
    02A3 CFC9      RJMP	0x026D
(0274) 		}
(0275) 	 }
(0276) 	 return Err_Flag;
    02A4 2F04      MOV	R16,R20
    02A5 940E04C1  CALL	pop_gset3
    02A7 9508      RET
_SJASetOtherReg:
  Err_Flag             --> R20
  Err_Cnt              --> R22
    02A8 940E04AE  CALL	push_gset2
(0277) 	 
(0278) }	
(0279) 
(0280) /*void SJAWriteDataToTxBuf(unsigned char Num, unsigned char Data)
(0281) {
(0282)     switch(Num)
(0283) 	{
(0284) 	      case 0:
(0285) 		       TX_Buffer[0] = Data;
(0286) 			   break;
(0287) 	      case 1:
(0288) 		       TX_Buffer[1] = Data;
(0289) 			   break;
(0290) 		  case 2:	   		   
(0291) 	           TX_Buffer[2] = Data;
(0292) 			   break;
(0293) 		  case 3:	   		   
(0294) 	           TX_Buffer[3] = Data;
(0295) 			   break;
(0296) 		  case 4:	   		   
(0297) 	           TX_Buffer[4] = Data;
(0298) 			   break;
(0299) 	      case 5:	   		   
(0300) 	           TX_Buffer[5] = Data;
(0301) 			   break;		   	   
(0302) 		  case 6:	   		   
(0303) 	           TX_Buffer[6] = Data;
(0304) 			   break;	
(0305) 		  case 7:	   		   
(0306) 	           TX_Buffer[7] = Data;
(0307) 			   break;	
(0308) 	      case 8:	   		   
(0309) 	           TX_Buffer[8] = Data;
(0310) 			   break;
(0311) 		  case 9:	   		   
(0312) 	           TX_Buffer[9] = Data;
(0313) 			   break;	
(0314) 		  case 10:	   		   
(0315) 	           TX_Buffer[10] = Data;
(0316) 			   break;	
(0317) 		  case 11:	   		   
(0318) 	           TX_Buffer[11] = Data;
(0319) 			   break;	
(0320) 		  case 12:	   		   
(0321) 	           TX_Buffer[12] = Data;
(0322) 			   break;		   	   	   			   	   	   	   
(0323) 	}
(0324) }*/
(0325) 
(0326) unsigned char SJASetOtherReg(void)
(0327) {
(0328)     unsigned char Err_Cnt = 0x20;
    02AA E260      LDI	R22,0x20
(0329) 	unsigned char Err_Flag = TRUE;
    02AB E041      LDI	R20,1
(0330) 	 
(0331) 	if(SJATestRstMode())
    02AC DEF7      RCALL	_SJATestRstMode
    02AD 2300      TST	R16
    02AE F131      BEQ	0x02D5
(0332) 	{
(0333) 	   Err_Flag = TRUE;
(0334) 	}
    02AF C02A      RJMP	0x02DA
(0335) 	else
(0336) 	{
(0337) 	 	while(--Err_Cnt)
(0338) 	 	{
(0339) 	     	write_sja(RXERR,0x00);	
    02B0 2722      CLR	R18
    02B1 E00E      LDI	R16,0xE
    02B2 DE9C      RCALL	_write_sja
(0340) 		 	if(read_sja(RXERR) != 0x00)
    02B3 E00E      LDI	R16,0xE
    02B4 DE8D      RCALL	_read_sja
    02B5 2300      TST	R16
    02B6 F009      BEQ	0x02B8
(0341) 		 	{
(0342) 		   		continue;
    02B7 C01D      RJMP	0x02D5
(0343) 		 	}
(0344) 		 
(0345) 		    Err_Cnt = 0x20;
    02B8 E260      LDI	R22,0x20
(0346) 		    write_sja(TXERR,0x00);;	
    02B9 2722      CLR	R18
    02BA E00F      LDI	R16,0xF
    02BB DE93      RCALL	_write_sja
(0347) 		    if(read_sja(TXERR) != 0x00)
    02BC E00F      LDI	R16,0xF
    02BD DE84      RCALL	_read_sja
    02BE 2300      TST	R16
    02BF F009      BEQ	0x02C1
(0348) 		    {
(0349) 		       continue;
    02C0 C014      RJMP	0x02D5
(0350) 		    } 
(0351) 		 
(0352) 		    Err_Cnt = 0x20;
    02C1 E260      LDI	R22,0x20
(0353) 		    write_sja(ECC,0x00);	
    02C2 2722      CLR	R18
    02C3 E00C      LDI	R16,0xC
    02C4 DE8A      RCALL	_write_sja
(0354) 		    if(read_sja(ECC) != 0x00)
    02C5 E00C      LDI	R16,0xC
    02C6 DE7B      RCALL	_read_sja
    02C7 2300      TST	R16
    02C8 F009      BEQ	0x02CA
(0355) 		    {
(0356) 		       continue;
    02C9 C00B      RJMP	0x02D5
(0357) 		    }
(0358) 		 
(0359) 		    Err_Cnt = 0x20;
    02CA E260      LDI	R22,0x20
(0360) 		    write_sja(RBSA,0x00);;	
    02CB 2722      CLR	R18
    02CC E10E      LDI	R16,0x1E
    02CD DE81      RCALL	_write_sja
(0361) 		    if(read_sja(RBSA) != 0x00)
    02CE E10E      LDI	R16,0x1E
    02CF DE72      RCALL	_read_sja
    02D0 2300      TST	R16
    02D1 F009      BEQ	0x02D3
(0362) 		    {
(0363) 		       continue;
    02D2 C002      RJMP	0x02D5
(0364) 		    }
(0365) 		 
(0366) 		    Err_Flag = FALSE;
    02D3 2744      CLR	R20
(0367) 		    break;
    02D4 C005      RJMP	0x02DA
    02D5 2F86      MOV	R24,R22
    02D6 5081      SUBI	R24,1
    02D7 2F68      MOV	R22,R24
    02D8 2388      TST	R24
    02D9 F6B1      BNE	0x02B0
(0368) 	   }
(0369) 	}
(0370) 	return Err_Flag;
    02DA 2F04      MOV	R16,R20
    02DB 940E04BE  CALL	pop_gset2
    02DD 9508      RET
_SJASetIER:
  Err_Flag             --> R20
  Err_Cnt              --> R22
  value                --> R10
    02DE 940E04B2  CALL	push_gset3
    02E0 2EA0      MOV	R10,R16
(0371) }
(0372) 
(0373) unsigned char SJASetIER(unsigned char value)
(0374) {
(0375)      unsigned char Err_Cnt = 0x20;
    02E1 E260      LDI	R22,0x20
(0376) 	 unsigned char Err_Flag = TRUE;
    02E2 E041      LDI	R20,1
    02E3 C009      RJMP	0x02ED
(0377) 	 
(0378) 	 /*if(SJATestRstMode())
(0379) 	 {
(0380) 	   Err_Flag = TRUE;
(0381) 	 }
(0382) 	 else*/
(0383) 	 //{
(0384) 	    while(--Err_Cnt)
(0385) 	    {
(0386) 	       write_sja(IER, value);
    02E4 2D2A      MOV	R18,R10
    02E5 E004      LDI	R16,4
    02E6 DE68      RCALL	_write_sja
(0387) 		   if(read_sja(IER) == value)
    02E7 E004      LDI	R16,4
    02E8 DE59      RCALL	_read_sja
    02E9 150A      CP	R16,R10
    02EA F411      BNE	0x02ED
(0388) 		   {
(0389) 		      Err_Flag = FALSE;
    02EB 2744      CLR	R20
(0390) 			  break;
    02EC C005      RJMP	0x02F2
    02ED 2F86      MOV	R24,R22
    02EE 5081      SUBI	R24,1
    02EF 2F68      MOV	R22,R24
    02F0 2388      TST	R24
    02F1 F791      BNE	0x02E4
(0391) 		   }
(0392) 	    }
(0393)      //}
(0394) 	 return Err_Flag;
    02F2 2F04      MOV	R16,R20
    02F3 940E04C1  CALL	pop_gset3
    02F5 9508      RET
_Init_CAN:
  temp                 --> R22
  k                    --> R20
    02F6 940E04AE  CALL	push_gset2
    02F8 9723      SBIW	R28,3
(0395) }
(0396) 
(0397) 
(0398) 
(0399) /*************************************************
(0400)                 SJA1000初始化子函数
(0401) *************************************************/
(0402) void Init_CAN(void)
(0403) {
(0404)     unsigned char temp;
(0405) 	unsigned int k ; 
(0406) 	CLI();
    02F9 94F8      BCLR	7
(0407) 	do
(0408) 	{
(0409) 	   temp = SJATestInterface(0x55);
    02FA E505      LDI	R16,0x55
    02FB DE60      RCALL	_SJATestInterface
    02FC 2F60      MOV	R22,R16
(0410) 	}while(temp);//检查硬件连线
    02FD 2366      TST	R22
    02FE F7D9      BNE	0x02FA
(0411) 	WDR();
    02FF 95A8      WDR
(0412) 	for(k=0;k<6;k++); 				//延时约5us
    0300 2744      CLR	R20
    0301 2755      CLR	R21
    0302 C002      RJMP	0x0305
    0303 5F4F      SUBI	R20,0xFF
    0304 4F5F      SBCI	R21,0xFF
    0305 3046      CPI	R20,6
    0306 E0E0      LDI	R30,0
    0307 075E      CPC	R21,R30
    0308 F3D0      BCS	0x0303
(0413) 	do
(0414) 	{
(0415) 	    temp = SJAEntryResetMode();
    0309 DE6A      RCALL	_SJAEntryResetMode
    030A 2F60      MOV	R22,R16
(0416) 	}while(temp);
    030B 2366      TST	R22
    030C F7E1      BNE	0x0309
(0417) 	WDR();
    030D 95A8      WDR
(0418) 	read_sja(IR);//clear IR
    030E E003      LDI	R16,3
    030F DE32      RCALL	_read_sja
(0419) 	for(k=0;k<6;k++); 				//延时约5us
    0310 2744      CLR	R20
    0311 2755      CLR	R21
    0312 C002      RJMP	0x0315
    0313 5F4F      SUBI	R20,0xFF
    0314 4F5F      SBCI	R21,0xFF
    0315 3046      CPI	R20,6
    0316 E0E0      LDI	R30,0
    0317 075E      CPC	R21,R30
    0318 F3D0      BCS	0x0313
(0420) 	WDR();
    0319 95A8      WDR
(0421) 	if(!SJATestRstMode())
    031A DE89      RCALL	_SJATestRstMode
    031B 2300      TST	R16
    031C F009      BEQ	0x031E
    031D C074      RJMP	0x0392
(0422) 	{
(0423) 	   do
(0424) 	   {
(0425) 	      temp = SJASetClockDivision(0xC8);
    031E EC08      LDI	R16,0xC8
    031F DEEB      RCALL	_SJASetClockDivision
    0320 2F60      MOV	R22,R16
(0426) 	   }while(temp);
    0321 2366      TST	R22
    0322 F7D9      BNE	0x031E
(0427) 	   WDR();
    0323 95A8      WDR
(0428) 	   for(k=0;k<6;k++); 				//延时约5us
    0324 2744      CLR	R20
    0325 2755      CLR	R21
    0326 C002      RJMP	0x0329
    0327 5F4F      SUBI	R20,0xFF
    0328 4F5F      SBCI	R21,0xFF
    0329 3046      CPI	R20,6
    032A E0E0      LDI	R30,0
    032B 075E      CPC	R21,R30
    032C F3D0      BCS	0x0327
(0429) 	   do
(0430) 	   {
(0431) 	      temp = SJASetOutControl(0x1a);
    032D E10A      LDI	R16,0x1A
    032E DE84      RCALL	_SJASetOutControl
    032F 2F60      MOV	R22,R16
(0432) 	   }while(temp);
    0330 2366      TST	R22
    0331 F7D9      BNE	0x032D
(0433) 	   WDR();
    0332 95A8      WDR
(0434) 	   for(k=0;k<6;k++); 				//延时约5us
    0333 2744      CLR	R20
    0334 2755      CLR	R21
    0335 C002      RJMP	0x0338
    0336 5F4F      SUBI	R20,0xFF
    0337 4F5F      SBCI	R21,0xFF
    0338 3046      CPI	R20,6
    0339 E0E0      LDI	R30,0
    033A 075E      CPC	R21,R30
    033B F3D0      BCS	0x0336
(0435) 	   do
(0436) 	   {
(0437) 	      temp = SJASetBaudRateStandard(2);
    033C E002      LDI	R16,2
    033D DF25      RCALL	_SJASetBaudRateStandard
    033E 2F60      MOV	R22,R16
(0438) 	   }while(temp);
    033F 2366      TST	R22
    0340 F7D9      BNE	0x033C
(0439) 	   WDR();
    0341 95A8      WDR
(0440) 	   for(k=0;k<6;k++); 				//延时约5us
    0342 2744      CLR	R20
    0343 2755      CLR	R21
    0344 C002      RJMP	0x0347
    0345 5F4F      SUBI	R20,0xFF
    0346 4F5F      SBCI	R21,0xFF
    0347 3046      CPI	R20,6
    0348 E0E0      LDI	R30,0
    0349 075E      CPC	R21,R30
    034A F3D0      BCS	0x0345
(0441) 	   do
(0442) 	   {
(0443) 	      temp = SJASetAccCode(0x00, 0x00, 0x00, 0x00);
    034B 2422      CLR	R2
    034C 822A      STD	R2,2+Y
    034D 8228      STD	R2,0+Y
    034E 2722      CLR	R18
    034F 2700      CLR	R16
    0350 DE7D      RCALL	_SJASetAccCode
    0351 2F60      MOV	R22,R16
(0444) 	   }while(temp);
    0352 2366      TST	R22
    0353 F7B9      BNE	0x034B
(0445) 	   WDR();
    0354 95A8      WDR
(0446) 	   for(k=0;k<6;k++); 				//延时约5us
    0355 2744      CLR	R20
    0356 2755      CLR	R21
    0357 C002      RJMP	0x035A
    0358 5F4F      SUBI	R20,0xFF
    0359 4F5F      SBCI	R21,0xFF
    035A 3046      CPI	R20,6
    035B E0E0      LDI	R30,0
    035C 075E      CPC	R21,R30
    035D F3D0      BCS	0x0358
(0447) 	   do
(0448) 	   {
(0449) 	      temp = SJASetAccMask(0xFF, 0xFF, 0xFF, 0xFF);
    035E EF8F      LDI	R24,0xFF
    035F 838A      STD	R24,2+Y
    0360 8388      STD	R24,0+Y
    0361 EF2F      LDI	R18,0xFF
    0362 EF0F      LDI	R16,0xFF

⌨️ 快捷键说明

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