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

📄 canmonitor.lst

📁 AT90CAN128的CAN通信源码测试成功
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0178) 	        Length = 0x80;
     2F2 E880      LDI	R24,0x80
     2F3 2EC8      MOV	R12,R24
(0179) 	      }
(0180) 	
(0181) 	   sja_write_data(TXEFF,TransmitMessage[0]);           //写TX贞报文
     2F4 9120 00B9 LDS	R18,TransmitMessage
     2F6 E100      LDI	R16,0x10
     2F7 DF61      RCALL	_sja_write_data
(0182)        sja_write_data(TXID0,TransmitMessage[1]);           //写TX标识码1  
     2F8 9120 00BA LDS	R18,TransmitMessage+1
     2FA E101      LDI	R16,0x11
     2FB DF5D      RCALL	_sja_write_data
(0183) 	   sja_write_data(TXID1,TransmitMessage[2]);         
     2FC 9120 00BB LDS	R18,TransmitMessage+2
     2FE E102      LDI	R16,0x12
     2FF DF59      RCALL	_sja_write_data
(0184) 	   if(FF)                                              //FF=0:标准CAN格式
     300 20EE      TST	R14
     301 F041      BEQ	0x030A
(0185) 	       {                                               //FF=1:扩展CAN格式
(0186) 	          sja_write_data(TXID2,TransmitMessage[3]);
     302 9120 00BC LDS	R18,TransmitMessage+3
     304 E103      LDI	R16,0x13
     305 DF53      RCALL	_sja_write_data
(0187) 	          sja_write_data(TXID3,TransmitMessage[4]);
     306 9120 00BD LDS	R18,0x00BD
     308 E104      LDI	R16,0x14
     309 DF4F      RCALL	_sja_write_data
(0188) 	       }   
(0189) 	   for (i=0;i<Length;i++)
     30A 24AA      CLR	R10
     30B C018      RJMP	0x0324
(0190) 	      { 
(0191) 	          if(FF)
     30C 20EE      TST	R14
     30D F059      BEQ	0x0319
(0192) 	              sja_write_data(TXDATA0+i,TransmitMessage[5+i]);
     30E EB8E      LDI	R24,0xBE
     30F E090      LDI	R25,0
     310 2DEA      MOV	R30,R10
     311 27FF      CLR	R31
     312 0FE8      ADD	R30,R24
     313 1FF9      ADC	R31,R25
     314 8120      LDD	R18,Z+0
     315 2D0A      MOV	R16,R10
     316 5E0B      SUBI	R16,0xEB
     317 DF41      RCALL	_sja_write_data
     318 C00A      RJMP	0x0323
(0193) 	          else 
(0194) 	              sja_write_data(TXDATA0+i,TransmitMessage[3+i]); 
     319 EB8C      LDI	R24,0xBC
     31A E090      LDI	R25,0
     31B 2DEA      MOV	R30,R10
     31C 27FF      CLR	R31
     31D 0FE8      ADD	R30,R24
     31E 1FF9      ADC	R31,R25
     31F 8120      LDD	R18,Z+0
     320 2D0A      MOV	R16,R10
     321 5E0B      SUBI	R16,0xEB
     322 DF36      RCALL	_sja_write_data
     323 94A3      INC	R10
     324 14AC      CP	R10,R12
     325 F330      BCS	0x030C
(0195) 	      }   
(0196) 	   led_off; 
     326 9A97      SBI	0x12,7
(0197) 	  //置位发送请求
(0198) 	  //sja_write_data(CMR,0x10);          //发送请求命令:zijieshou     
(0199)       sja_write_data(CMR,0x01);          //发送请求命令当错误时可重发                    
     327 E021      LDI	R18,1
     328 E001      LDI	R16,1
     329 DF2F      RCALL	_sja_write_data
(0200) 	  }
     32A 940C 0664 JMP	pop_xgset00FC
_sja_tx:
  sreg                 --> Y,+0
  FF                   --> R10
  Length               --> R12
  state                --> R10
  i                    --> R14
  TransmitMessage      --> Y,+7
     32C 931A      ST	R17,-Y
     32D 930A      ST	R16,-Y
     32E 940E 066F CALL	push_xgset00FC
     330 9721      SBIW	R28,1
(0201) }
(0202) 
(0203) /******************************************************************** 
(0204) *  函数说明:SJA1000发送服务程序                                    * 
(0205) *  输入:RAM中以TransmitMessage开始的CAN的发送报文                  * 
(0206) *  输出:无                                                         * 
(0207) ********************************************************************/
(0208) void sja_tx(unsigned char *TransmitMessage)
(0209) {
(0210)   unsigned char Length;
(0211)   unsigned char FF,i,state;
(0212)   
(0213)   unsigned char sreg;
(0214)   sreg=SREG;                               //保存全局中断标志
     331 B62F      IN	R2,0x3F
     332 8228      STD	Y+0,R2
(0215)   CLI();
     333 94F8      BCLR	7
(0216)   
(0217)   state=sja_read_data(SR);     //读状态寄存器
     334 E002      LDI	R16,2
     335 DF33      RCALL	_sja_read_data
     336 2EA0      MOV	R10,R16
(0218)   while(state&(1<<4));         //正在接受则等待
     337 FCA4      SBRC	R10,4
     338 CFFE      RJMP	0x0337
(0219) //  while(state&(1<<3));       //上次发送未完成则等待
(0220)   if(state&(1<<2))            //判断发送缓冲是否释放
     339 FEA2      SBRS	R10,2
     33A C049      RJMP	0x0384
(0221)   {
(0222)     led_on;
     33B 9897      CBI	0x12,7
(0223)     FF=TransmitMessage[0]&0x80;          //取贞格式
     33C 81EF      LDD	R30,Y+7
     33D 85F8      LDD	R31,Y+8
     33E 8180      LDD	R24,Z+0
     33F 7880      ANDI	R24,0x80
     340 2EA8      MOV	R10,R24
(0224) 	Length=TransmitMessage[0]&0x0f;       //取数据长度代码
     341 8180      LDD	R24,Z+0
     342 708F      ANDI	R24,0xF
     343 2EC8      MOV	R12,R24
(0225) 	#ifdef DEBUG
(0226) 	  rprintfCRLF(); 
(0227) 	  rprintfStr("begin transmit..."); 
(0228) 	  rprintfCRLF(); 	   
(0229) 	#endif
(0230) 	if(Length>8)
     344 E088      LDI	R24,0x8
     345 158C      CP	R24,R12
     346 F408      BCC	0x0348
(0231) 	{
(0232) 	 Length = 8;
     347 2EC8      MOV	R12,R24
(0233) 	}
(0234) 	sja_write_data(TXEFF,TransmitMessage[0]);           //写TX贞报文
     348 81EF      LDD	R30,Y+7
     349 85F8      LDD	R31,Y+8
     34A 8120      LDD	R18,Z+0
     34B E100      LDI	R16,0x10
     34C DF0C      RCALL	_sja_write_data
(0235)     sja_write_data(TXID0,TransmitMessage[1]);           //写TX标识码1  
     34D 81EF      LDD	R30,Y+7
     34E 85F8      LDD	R31,Y+8
     34F 8121      LDD	R18,Z+1
     350 E101      LDI	R16,0x11
     351 DF07      RCALL	_sja_write_data
(0236)     sja_write_data(TXID1,TransmitMessage[2]);         
     352 81EF      LDD	R30,Y+7
     353 85F8      LDD	R31,Y+8
     354 8122      LDD	R18,Z+2
     355 E102      LDI	R16,0x12
     356 DF02      RCALL	_sja_write_data
(0237) 	if(FF)                                         //FF=0:标准CAN格式
     357 20AA      TST	R10
     358 F051      BEQ	0x0363
(0238) 	{                                            //FF=1:扩展CAN格式
(0239) 	sja_write_data(TXID2,TransmitMessage[3]);
     359 81EF      LDD	R30,Y+7
     35A 85F8      LDD	R31,Y+8
     35B 8123      LDD	R18,Z+3
     35C E103      LDI	R16,0x13
     35D DEFB      RCALL	_sja_write_data
(0240) 	sja_write_data(TXID3,TransmitMessage[4]);
     35E 81EF      LDD	R30,Y+7
     35F 85F8      LDD	R31,Y+8
     360 8124      LDD	R18,Z+4
     361 E104      LDI	R16,0x14
     362 DEF6      RCALL	_sja_write_data
(0241) 	}   
(0242) 	for (i=0;i<Length;i++)
     363 24EE      CLR	R14
     364 C018      RJMP	0x037D
(0243) 	{ 
(0244) 	  if(FF)
     365 20AA      TST	R10
     366 F059      BEQ	0x0372
(0245) 	    sja_write_data(21+i,TransmitMessage[5+i]);
     367 2DEE      MOV	R30,R14
     368 27FF      CLR	R31
     369 800F      LDD	R0,Y+7
     36A 8418      LDD	R1,Y+8
     36B 0DE0      ADD	R30,R0
     36C 1DF1      ADC	R31,R1
     36D 8125      LDD	R18,Z+5
     36E 2D0E      MOV	R16,R14
     36F 5E0B      SUBI	R16,0xEB
     370 DEE8      RCALL	_sja_write_data
     371 C00A      RJMP	0x037C
(0246) 	  else 
(0247) 	    sja_write_data(19+i,TransmitMessage[3+i]); 
     372 2DEE      MOV	R30,R14
     373 27FF      CLR	R31
     374 800F      LDD	R0,Y+7
     375 8418      LDD	R1,Y+8
     376 0DE0      ADD	R30,R0
     377 1DF1      ADC	R31,R1
     378 8123      LDD	R18,Z+3
     379 2D0E      MOV	R16,R14
     37A 5E0D      SUBI	R16,0xED
     37B DEDD      RCALL	_sja_write_data
     37C 94E3      INC	R14
     37D 14EC      CP	R14,R12
     37E F330      BCS	0x0365
(0248) 	}    
(0249) 	//置位发送请求
(0250) 	//sja_write_data(CMR,0x10);          //发送请求命令 
(0251) 	sja_write_data(CMR,0x01);          //发送请求命令当错误时可重发 
     37F E021      LDI	R18,1
     380 E001      LDI	R16,1
     381 DED7      RCALL	_sja_write_data
(0252) 	led_off;        
     382 9A97      SBI	0x12,7
(0253) 	#ifdef DEBUG
(0254) 	  rprintfStr("transmit over"); 
(0255) 	  rprintfCRLF(); 
(0256) 	  rprintfCRLF(); 	   
(0257) 	#endif              
(0258)   }
     383 C005      RJMP	0x0389
(0259)   else                                    //发送缓冲被锁,将数据存入RAM缓存
(0260)   {
(0261)     flag.mess_wait=TRUE;
     384 9180 0071 LDS	R24,flag
     386 6081      ORI	R24,1
     387 9380 0071 STS	flag,R24
(0262)   }
(0263)   
(0264)   SREG=sreg;                
     389 8008      LDD	R0,Y+0
     38A BE0F      OUT	0x3F,R0
(0265)   SEI();
     38B 9478      BSET	7
     38C 9621      ADIW	R28,1
     38D 940E 0664 CALL	pop_xgset00FC
     38F 9622      ADIW	R28,2
     390 9508      RET
_sja_rx_service:
  ptr                  --> Y,+0
  number               --> R10
  i                    --> R12
     391 940E 066F CALL	push_xgset00FC
     393 9721      SBIW	R28,1
(0266) }
(0267) 
(0268) 
(0269) /******************************************************************** 
(0270) *  函数说明:SJA1000接受中断服务函数,                              * 
(0271) *  输入:无                                                         * 
(0272) *  输出:正确读取返回TURE否则返回FALSE 。                           * 
(0273) *  影响变量:接受缓冲在正确读取时被刷新                             *
(0274) ********************************************************************/
(0275) void sja_rx_service(void)
(0276) {
(0277)     unsigned char number,i,ptr;
(0278)     ptr=RXEFF;           
     394 E180      LDI	R24,0x10
     395 8388      STD	Y+0,R24
(0279)             if((sja_read_data(RXEFF)&0x40)==0x40)  //如果RTR=1,为远程帧
     396 E100      LDI	R16,0x10
     397 DED1      RCALL	_sja_read_data
     398 2F80      MOV	R24,R16
     399 7480      ANDI	R24,0x40
     39A 3480      CPI	R24,0x40
     39B F421      BNE	0x03A0
(0280)     		{
(0281)                 sja_write_data(CMR,0x04);          //则释放接收缓冲
     39C E024      LDI	R18,4
     39D E001      LDI	R16,1
     39E DEBA      RCALL	_sja_write_data
(0282)     		}
     39F C02B      RJMP	0x03CB
(0283)             else                    		         //为0,则是数据帧
(0284)     		{
(0285)                 number=(sja_read_data(RXEFF)&0x0f);//取第一个字节的低四位,即数据长度	
     3A0 E100      LDI	R16,0x10
     3A1 DEC7      RCALL	_sja_read_data
     3A2 2F80      MOV	R24,R16
     3A3 708F      ANDI	R24,0xF
     3A4 2EA8      MOV	R10,R24
(0286) 				if (number>0x08)
     3A5 E088      LDI	R24,0x8
     3A6 158A      CP	R24,R10
     3A7 F408      BCC	0x03A9
(0287) 				number=0x08;			
     3A8 2EA8      MOV	R10,R24
(0288)                 if ((sja_read_data(RXEFF))&0x80)         //判断是标准帧还是扩展帧
     3A9 E100      LDI	R16,0x10
     3AA DEBE      RCALL	_sja_read_data
     3AB 2EC0      MOV	R12,R16
     3AC FF07      SBRS	R16,7
     3AD C004      RJMP	0x03B2
(0289) 				{
(0290)                 number=number+5;              //扩展帧,则帧的总长度加5(13字节)
     3AE 2D8A      MOV	R24,R10
     3AF 5F8B      SUBI	R24,0xFB
     3B0 2EA8      MOV	R10,R24
(0291) 				}
     3B1 C003      RJMP	0x03B5
(0292)         		else
(0293) 				{
(0294)                 number=number+3;              //标准帧,则帧的总长度加3(11字节)
     3B2 2D8A      MOV	R24,R10
     3B3 5F8D      SUBI	R24,0xFD
     3B4 2EA8      MOV	R10,R24
(0295) 				}
(0296)                 for(i=0;i<number;i++)   	  //读取数据
     3B5 24CC      CLR	R12
     3B6 C00F      RJMP	0x03C6
(0297)         		{
(0298)                     RxBuffer[i]=sja_read_data(RXEFF+i);
     3B7 2D0C      MOV	R16,R12
     3B8 5F00      SUBI	R16,0xF0
     3B9 DEAF      RCALL	_sja_read_data
     3BA 2EE0      MOV	R14,R16
     3BB EA8C      LDI	R24,0xAC
     3BC E090      LDI	R25,0
     3BD 2DEC      MOV	R30,R12
     3BE 27FF      CLR	R31
     3BF 0FE8      ADD	R30,R24
     3C0 1FF9      ADC	R31,R25
     3C1 82E0      STD	Z+0,R14
(0299)                 	ptr++;
     3C2 8008      LDD	R0,Y+0
     3C3 9403      INC	R0
     3C4 8208      STD	Y+0,R0
     3C5 94C3      INC	R12
     3C6 14CA      CP	R12,R10
     3C7 F378      BCS	0x03B7
(0300)         		}
(0301)                 sja_write_data(CMR,0x04);          //最后释放FXFIFO
     3C8 E024      LDI	R18,4
     3C9 E001      LDI	R16,1
     3CA DE8E      RCALL	_sja_write_data
(0302)     		}
     3CB 9621      ADIW	R28,1
     3CC 940C 0664 JMP	pop_xgset00FC
_Search:
  SearchStatus         --> R10
     3CE 92AA      ST	R10,-Y
(0303) }
(0304) 
(0305) /******************************************************************** 
(0306) *  函数说明:SJA1000查询方式接收函数,                              * 
(0307) *  输入:无                                                         * 
(0308) *  输出:无                                                         * 
(0309) ********************************************************************/
(0310) void Search(void)                
(0311) {
(0312)    unsigned char SearchStatus;
(0313)    SearchStatus=sja_read_data(SR); //读取状态寄存器
     3CF E002      LDI	R16,2
     3D0 DE98      RCALL	_sja_read_data
     3D1 2EA0      MOV	R10,R16
(0314) #ifdef DEBUG
(0315)     rprintfStr("SR:   ");
(0316) 	rprintfu08(SearchStatus);
(0317) 	rprintfCRLF();
(0318) #endif   
(0319) //   if((SearchStatus & 0x83))       //是否存在总线关闭、错误状态、数据溢出、有数据位等状态
(0320) //   { 
(0321)       if(SearchStatus&(1<<7))//如果总线关闭
     3D2 FF07      SBRS	R16,7

⌨️ 快捷键说明

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