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

📄 can_test.lst

📁 MCU:ATMEGA8515 Frequence: 16M 描述:利用已有CAN TEST V1.0电路板进行调试, 可靠性测试已通过
💻 LST
📖 第 1 页 / 共 3 页
字号:
    00E4 075E      CPC	R21,R30
    00E5 F3D0      BCS	0x00E0
(0107) 	write_sja(BTR0,0x04); 	        //设置时钟分频器,500k
    00E6 E024      LDI	R18,4
    00E7 E006      LDI	R16,6
    00E8 DFC8      RCALL	_write_sja
(0108) 	write_sja(BTR1,0x1c); 	        
    00E9 E12C      LDI	R18,0x1C
    00EA E007      LDI	R16,7
    00EB DFC5      RCALL	_write_sja
(0109) 	write_sja(OCR,0x1a); 	        //输出控制
    00EC E12A      LDI	R18,0x1A
    00ED E008      LDI	R16,0x8
    00EE DFC2      RCALL	_write_sja
(0110) 	write_sja(RXERR,0x00);			
    00EF 2722      CLR	R18
    00F0 E00E      LDI	R16,0xE
    00F1 DFBF      RCALL	_write_sja
(0111) 	write_sja(TXERR,0x00);
    00F2 2722      CLR	R18
    00F3 E00F      LDI	R16,0xF
    00F4 DFBC      RCALL	_write_sja
(0112) 	write_sja(ECC,0x00);
    00F5 2722      CLR	R18
    00F6 E00C      LDI	R16,0xC
    00F7 DFB9      RCALL	_write_sja
(0113) 	write_sja(RBSA,0x00);			//缓存器起始地址寄存器设置为0
    00F8 2722      CLR	R18
    00F9 E10E      LDI	R16,0x1E
    00FA DFB6      RCALL	_write_sja
(0114) 	
(0115) 	write_sja(ACR0,0x00); 	        //acceptcode default ffffffff
    00FB 2722      CLR	R18
    00FC E100      LDI	R16,0x10
    00FD DFB3      RCALL	_write_sja
(0116) 	write_sja(ACR1,0x00);
    00FE 2722      CLR	R18
    00FF E101      LDI	R16,0x11
    0100 DFB0      RCALL	_write_sja
(0117) 	write_sja(ACR2,0x00);
    0101 2722      CLR	R18
    0102 E102      LDI	R16,0x12
    0103 DFAD      RCALL	_write_sja
(0118) 	write_sja(ACR3,0x00);
    0104 2722      CLR	R18
    0105 E103      LDI	R16,0x13
    0106 DFAA      RCALL	_write_sja
(0119) 
(0120) 	write_sja(AMR0,0xff);  			//acceptmask default ffffffff
    0107 EF2F      LDI	R18,0xFF
    0108 E104      LDI	R16,0x14
    0109 DFA7      RCALL	_write_sja
(0121) 	write_sja(AMR0,0xff);
    010A EF2F      LDI	R18,0xFF
    010B E104      LDI	R16,0x14
    010C DFA4      RCALL	_write_sja
(0122) 	write_sja(AMR0,0xff);
    010D EF2F      LDI	R18,0xFF
    010E E104      LDI	R16,0x14
    010F DFA1      RCALL	_write_sja
(0123) 	write_sja(AMR0,0xff);
    0110 EF2F      LDI	R18,0xFF
    0111 E104      LDI	R16,0x14
    0112 DF9E      RCALL	_write_sja
(0124) 
(0125) 	write_sja(IER,0x01);            //开放接收中断
    0113 E021      LDI	R18,1
    0114 E004      LDI	R16,4
    0115 DF9B      RCALL	_write_sja
(0126) 	write_sja(CMR,0x0c);		  	//清除数据溢出和释放接收缓冲器;
    0116 E02C      LDI	R18,0xC
    0117 E001      LDI	R16,1
    0118 DF98      RCALL	_write_sja
(0127) 	do
(0128) 	{
(0129) 	   write_sja(MODE,0x08); 		//设置SJA1000 工作模式,单滤波接收工作模式
    0119 E028      LDI	R18,0x8
    011A 2700      CLR	R16
    011B DF95      RCALL	_write_sja
(0130) 	}
(0131) 	while((read_sja(MODE)&0x01));	//确认复位标志是否被删除                      
    011C 2700      CLR	R16
    011D DF82      RCALL	_read_sja
    011E FD00      SBRC	R16,0
    011F CFF9      RJMP	0x0119
(0132) 	SEI();
    0120 9478      BSET	7
    0121 D14B      RCALL	pop_gset1
    0122 9508      RET
(0133) }
(0134) 
(0135) /*************************************************
(0136)                 SJA1000发送子函数
(0137) *************************************************/
(0138) void CanTransmit(void) 
(0139) { 
(0140) 	uchar status;
(0141) 	CLI();		   	   	 		   //关中断		
_CanTransmit:
  status               --> Y+1
    0123 94F8      BCLR	7
(0142) 	TransBuffer[0]=0x88;		
    0124 E888      LDI	R24,0x88
    0125 93800078  STS	TransBuffer,R24
(0143) 	TransBuffer[1]=0x00;	
    0127 2422      CLR	R2
    0128 92200079  STS	TransBuffer+1,R2
(0144) 	TransBuffer[2]=0x00;	
    012A 9220007A  STS	TransBuffer+2,R2
(0145) 	TransBuffer[3]=0x00;	
    012C 9220007B  STS	TransBuffer+3,R2
(0146) 	TransBuffer[4]=0x00;	
    012E 9220007C  STS	0x7C,R2
(0147) 	TransBuffer[5]=0x01;	
    0130 E081      LDI	R24,1
    0131 9380007D  STS	0x7D,R24
(0148) 	TransBuffer[6]=0x02;	
    0133 E082      LDI	R24,2
    0134 9380007E  STS	0x7E,R24
(0149) 	TransBuffer[7]=0x03;	
    0136 E083      LDI	R24,3
    0137 9380007F  STS	0x7F,R24
(0150) 	TransBuffer[8]=0x04;	
    0139 E084      LDI	R24,4
    013A 93800080  STS	0x80,R24
(0151) 	TransBuffer[9]=0x05;	
    013C E085      LDI	R24,5
    013D 93800081  STS	0x81,R24
(0152) 	TransBuffer[10]=0x06;	
    013F E086      LDI	R24,6
    0140 93800082  STS	0x82,R24
(0153) 	TransBuffer[11]=0x07;	
    0142 E087      LDI	R24,7
    0143 93800083  STS	0x83,R24
(0154) 	TransBuffer[12]=0xaa;					  
    0145 EA8A      LDI	R24,0xAA
    0146 93800084  STS	0x84,R24
(0155) 	while(!(read_sja(SR)&0x04));   //wait until reg2^2==1 ,即判断发送缓冲器的状态
    0148 E002      LDI	R16,2
    0149 DF56      RCALL	_read_sja
    014A FF02      SBRS	R16,2
    014B CFFC      RJMP	0x0148
(0156) 	write_sja(TXEFF,TransBuffer[0]);		   //扩展帧,数据长度为8个字节
    014C 91200078  LDS	R18,TransBuffer
    014E E100      LDI	R16,0x10
    014F DF61      RCALL	_write_sja
(0157) 	write_sja(TXID0,TransBuffer[1]);
    0150 91200079  LDS	R18,TransBuffer+1
    0152 E101      LDI	R16,0x11
    0153 DF5D      RCALL	_write_sja
(0158) 	write_sja(TXID1,TransBuffer[2]);
    0154 9120007A  LDS	R18,TransBuffer+2
    0156 E102      LDI	R16,0x12
    0157 DF59      RCALL	_write_sja
(0159) 	write_sja(TXID2,TransBuffer[3]);
    0158 9120007B  LDS	R18,TransBuffer+3
    015A E103      LDI	R16,0x13
    015B DF55      RCALL	_write_sja
(0160) 	write_sja(TXID3,TransBuffer[4]);
    015C 9120007C  LDS	R18,0x7C
    015E E104      LDI	R16,0x14
    015F DF51      RCALL	_write_sja
(0161) 	write_sja(TXDATA0,TransBuffer[5]);
    0160 9120007D  LDS	R18,0x7D
    0162 E105      LDI	R16,0x15
    0163 DF4D      RCALL	_write_sja
(0162) 	write_sja(TXDATA1,TransBuffer[6]);
    0164 9120007E  LDS	R18,0x7E
    0166 E106      LDI	R16,0x16
    0167 DF49      RCALL	_write_sja
(0163) 	write_sja(TXDATA2,TransBuffer[7]);
    0168 9120007F  LDS	R18,0x7F
    016A E107      LDI	R16,0x17
    016B DF45      RCALL	_write_sja
(0164) 	write_sja(TXDATA3,TransBuffer[8]);
    016C 91200080  LDS	R18,0x80
    016E E108      LDI	R16,0x18
    016F DF41      RCALL	_write_sja
(0165) 	write_sja(TXDATA4,TransBuffer[9]);
    0170 91200081  LDS	R18,0x81
    0172 E109      LDI	R16,0x19
    0173 DF3D      RCALL	_write_sja
(0166) 	write_sja(TXDATA5,TransBuffer[10]);
    0174 91200082  LDS	R18,0x82
    0176 E10A      LDI	R16,0x1A
    0177 DF39      RCALL	_write_sja
(0167) 	write_sja(TXDATA6,TransBuffer[11]);
    0178 91200083  LDS	R18,0x83
    017A E10B      LDI	R16,0x1B
    017B DF35      RCALL	_write_sja
(0168) 	write_sja(TXDATA7,TransBuffer[12]);
    017C 91200084  LDS	R18,0x84
    017E E10C      LDI	R16,0x1C
    017F DF31      RCALL	_write_sja
(0169) 	write_sja(CMR,0x01);		  //发送请求命令
    0180 E021      LDI	R18,1
    0181 E001      LDI	R16,1
    0182 DF2E      RCALL	_write_sja
(0170) 	while(!(read_sja(SR) & 0x08));//检测SR.3位,判断发送是否完成
    0183 E002      LDI	R16,2
    0184 DF1B      RCALL	_read_sja
    0185 FF03      SBRS	R16,3
    0186 CFFC      RJMP	0x0183
(0171) 	SEI();				  	  	  //开中断
    0187 9478      BSET	7
    0188 9508      RET
_Receive:
  RxData               --> Y+0
  sff                  --> R12
  number               --> R20
  result               --> R22
  status               --> R20
  prbuf                --> R10
  i                    --> R12
    0189 D0DA      RCALL	push_gset4
    018A 972D      SBIW	R28,0xD
(0172) }
(0173) /*
(0174) void Search(void)                 //查询方式接收
(0175) {
(0176)    uchar SearchStatus=read_sja(SR);	//读取状态寄存器
(0177)    if(!(SearchStatus & 0xc3))		//是否存在总线关闭、错误状态、数据溢出、有数据位等状态
(0178)    {
(0179)       if((SearchStatus & 0x80) != 0)//如果总线关闭
(0180) 	  {
(0181) 	     read_sja(IR);	            //读取中断寄存器,清除中断位
(0182) 		 write_sja(MODE,0x08); 
(0183) 	  }
(0184) 	  else
(0185) 	  {
(0186) 	     read_sja(IR);
(0187)          if((read_sja(IR) & 0x08) != 0)//如果有数据溢出
(0188) 		 write_sja(CMR,0x0c);	       //在命令寄存器中清除数据溢出和释放接收缓冲区
(0189) 		 else
(0190) 		 {
(0191) 		    if((read_sja(IR) & 0x01) != 0)//IR.0=1,接收缓冲区有数据
(0192) 			{
(0193) 			    Status_lighting(1);
(0194) 				RevFlag=1;
(0195) 		    }
(0196) 	     }
(0197) 	  }
(0198)    }
(0199) }*/
(0200) 
(0201) 
(0202) uchar Receive(void)
(0203) {
(0204)  	uchar result=FALSE;
    018B 2766      CLR	R22
(0205) 	uchar status,number,i,sff;
(0206) 	uchar prbuf;
(0207) 	uchar RxData[13];
(0208) 	status=read_sja(SR);
    018C E002      LDI	R16,2
    018D DF12      RCALL	_read_sja
    018E 2F40      MOV	R20,R16
(0209) 	prbuf=RXEFF;
    018F E180      LDI	R24,0x10
    0190 2EA8      MOV	R10,R24
(0210) 	if((status&0xc3)!=0)  		  //读取总线脱离、错误状态、接收溢出、有数据等位
    0191 2F84      MOV	R24,R20
    0192 7C83      ANDI	R24,0xC3
    0193 F409      BNE	0x0195
    0194 C043      RJMP	0x01D8
(0211) 	{
(0212) 		if((status&0x80)==0x80)
    0195 2F84      MOV	R24,R20
    0196 7880      ANDI	R24,0x80
    0197 3880      CPI	R24,0x80
    0198 F429      BNE	0x019E
(0213) 		{
(0214) 			write_sja(MODE,0x00);
    0199 2722      CLR	R18
    019A 2700      CLR	R16
    019B DF15      RCALL	_write_sja
(0215) 			return FALSE;
    019C 2700      CLR	R16
    019D C03B      RJMP	0x01D9
(0216) 		}
(0217) 		if((status&0x02)==0x02)
    019E 2F84      MOV	R24,R20
    019F 7082      ANDI	R24,2
    01A0 3082      CPI	R24,2
    01A1 F429      BNE	0x01A7
(0218) 		{
(0219) 			write_sja(CMR,0x0c);
    01A2 E02C      LDI	R18,0xC
    01A3 E001      LDI	R16,1
    01A4 DF0C      RCALL	_write_sja
(0220) 			return FALSE;
    01A5 2700      CLR	R16
    01A6 C032      RJMP	0x01D9
(0221) 		}
(0222) 		
(0223) 		if((status&0x01)==0x01)
    01A7 2F84      MOV	R24,R20
    01A8 7081      ANDI	R24,1
    01A9 3081      CPI	R24,1
    01AA F569      BNE	0x01D8
(0224) 		{
(0225) 			if((read_sja(RXEFF)&0x40)==0x40)  //如果RTR=1,为远程帧
    01AB E100      LDI	R16,0x10
    01AC DEF3      RCALL	_read_sja
    01AD 2F80      MOV	R24,R16
    01AE 7480      ANDI	R24,0x40
    01AF 3480      CPI	R24,0x40
    01B0 F421      BNE	0x01B5
(0226) 			{
(0227) 				write_sja(CMR,0x04);		  //则释放FXFIFO
    01B1 E024      LDI	R18,4
    01B2 E001      LDI	R16,1
    01B3 DEFD      RCALL	_write_sja
(0228) 			}
    01B4 C023      RJMP	0x01D8
(0229) 			else							  //为0,则是数据帧
(0230) 			{
(0231) 				sff=read_sja(prbuf)&0x80;	  //取第一个字节的最高位
    01B5 2D0A      MOV	R16,R10
    01B6 DEE9      RCALL	_read_sja
    01B7 2F80      MOV	R24,R16
    01B8 7880      ANDI	R24,0x80
    01B9 2EC8      MOV	R12,R24
(0232) 				number=(read_sja(prbuf)&0x0f);//取第一个字节的低四位,即数据长度
    01BA 2D0A      MOV	R16,R10
    01BB DEE4      RCALL	_read_sja
    01BC 2F40      MOV	R20,R16
    01BD 704F      ANDI	R20,0xF
(0233) 				if ((sff&0x80)==0x80)		  //判断是标准帧还是扩展帧
    01BE 2D8C      MOV	R24,R12
    01BF 7880      ANDI	R24,0x80
    01C0 3880      CPI	R24,0x80
    01C1 F411      BNE	0x01C4
(0234) 				number=number+5;			  //扩展帧,则帧的总长度加5(13字节)
    01C2 5F4B      SUBI	R20,0xFB
    01C3 C001      RJMP	0x01C5
(0235) 				else
(0236) 				number=number+3;			  //标准帧,则帧的总长度加3(11字节)
    01C4 5F4D      SUBI	R20,0xFD
(0237) 				for(i=0;i<number;i++)		  //读取数据
    01C5 24CC      CLR	R12
    01C6 C00B      RJMP	0x01D2
(0238) 				{
(0239) 					RxBuffer[i]=read_sja(prbuf);
    01C7 2D0A      MOV	R16,R10
    01C8 DED7      RCALL	_read_sja
    01C9 E885      LDI	R24,0x85
    01CA E090      LDI	R25,0
    01CB 2DEC      MOV	R30,R12
    01CC 27FF      CLR	R31
    01CD 0FE8      ADD	R30,R24
    01CE 1FF9      ADC	R31,R25
    01CF 8300      STD	Z+0,R16
(0240) 					prbuf++;
    01D0 94A3      INC	R10
    01D1 94C3      INC	R12
    01D2 16C4      CP	R12,R20
    01D3 F398      BCS	0x01C7
(0241) 				}
(0242) 				result=TRUE;	 		 	  //读取到正确的数据则返回TRUE
    01D4 E061      LDI	R22,1
(0243) 				write_sja(CMR,0x04);		  //最后释放FXFIFO
    01D5 E024      LDI	R18,4
    01D6 E001      LDI	R16,1
    01D7 DED9      RCALL	_write_sja

⌨️ 快捷键说明

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