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

📄 main.lst

📁 AT90CAN128的CAN通信源码测试成功
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0129)     sja_write_data(TXERR,0x00);
    033C 2722      CLR	R18
    033D E00F      LDI	R16,0xF
    033E DFB1      RCALL	_sja_write_data
(0130)     sja_write_data(ECC,0x00);            //错误代码捕捉寄存器清零 
    033F 2722      CLR	R18
    0340 E00C      LDI	R16,0xC
    0341 DFAE      RCALL	_sja_write_data
(0131) 
(0132)     sja_write_data(RBSA,0x00);            //缓存器起始地址寄存器设置为0
    0342 2722      CLR	R18
    0343 E10E      LDI	R16,0x1E
    0344 DFAB      RCALL	_sja_write_data
(0133)     
(0134)     sja_write_data(ACR0,ACR0_ID);         //验收屏蔽
    0345 2722      CLR	R18
    0346 E100      LDI	R16,0x10
    0347 DFA8      RCALL	_sja_write_data
(0135)     sja_write_data(ACR1,ACR1_ID);
    0348 2722      CLR	R18
    0349 E101      LDI	R16,0x11
    034A DFA5      RCALL	_sja_write_data
(0136)     sja_write_data(ACR2,ACR2_ID);
    034B 2722      CLR	R18
    034C E102      LDI	R16,0x12
    034D DFA2      RCALL	_sja_write_data
(0137)     sja_write_data(ACR3,ACR3_ID);
    034E 2722      CLR	R18
    034F E103      LDI	R16,0x13
    0350 DF9F      RCALL	_sja_write_data
(0138) 
(0139)     sja_write_data(AMR0,AMR0_ID);           
    0351 EF2F      LDI	R18,0xFF
    0352 E104      LDI	R16,0x14
    0353 DF9C      RCALL	_sja_write_data
(0140)     sja_write_data(AMR1,AMR1_ID);
    0354 EF2F      LDI	R18,0xFF
    0355 E105      LDI	R16,0x15
    0356 DF99      RCALL	_sja_write_data
(0141)     sja_write_data(AMR2,AMR2_ID);
    0357 EF2F      LDI	R18,0xFF
    0358 E106      LDI	R16,0x16
    0359 DF96      RCALL	_sja_write_data
(0142)     sja_write_data(AMR3,AMR3_ID);
    035A EF2F      LDI	R18,0xFF
    035B E107      LDI	R16,0x17
    035C DF93      RCALL	_sja_write_data
(0143) 
(0144)     sja_write_data(IER,REG_IER_DATA);     //开放接收中断
    035D E821      LDI	R18,0x81
    035E E004      LDI	R16,4
    035F DF90      RCALL	_sja_write_data
(0145) 	
(0146)     sja_write_data(CMR,COS_CMD);          //清除数据溢出
    0360 E028      LDI	R18,0x8
    0361 E001      LDI	R16,1
    0362 DF8D      RCALL	_sja_write_data
(0147) 	delay_nus(10);
    0363 E00A      LDI	R16,0xA
    0364 E010      LDI	R17,0
    0365 DD21      RCALL	_delay_nus
(0148) 	sja_write_data(CMR,RRB_CMD);          //释放接收缓冲器
    0366 E024      LDI	R18,4
    0367 E001      LDI	R16,1
    0368 DF87      RCALL	_sja_write_data
(0149) 	
(0150)     do
(0151)     {
(0152)        //sja_write_data(MODE,0x04);       //设置SJA1000 工作模式;zijiance
(0153) 	   sja_write_data(MODE,0x08);         //设置SJA1000 工作模式
    0369 E028      LDI	R18,0x8
    036A 2700      CLR	R16
    036B DF84      RCALL	_sja_write_data
(0154)     }
(0155)     while((sja_read_data(MODE)&0x01));   //确认复位标志是否被删除    
    036C 2700      CLR	R16
    036D DF92      RCALL	_sja_read_data
    036E FD00      SBRC	R16,0
    036F CFF9      RJMP	0x0369
(0156) 	                  
(0157)     SEI();
    0370 9478      BSET	7
    0371 9508      RET
_sja_tx_service:
  FF                   --> R10
  Length               --> R12
  i                    --> R14
    0372 940E06CA  CALL	push_gset5x
(0158) }
(0159) 
(0160) /******************************************************************** 
(0161) *  函数说明:SJA1000中断发送服务程序,若有待发送报文则及时发送      * 
(0162) *  输入:无                                                         * 
(0163) *  输出:无                                                         * 
(0164) ********************************************************************/
(0165) void sja_tx_service(void)
(0166) {
(0167) unsigned char Length;
(0168) unsigned char FF,i;
(0169)    if(flag.mess_wait==TRUE)
    0374 91800071  LDS	R24,flag
    0376 7081      ANDI	R24,1
    0377 3081      CPI	R24,1
    0378 F009      BEQ	0x037A
    0379 C049      RJMP	0x03C3
(0170)       {
(0171) 	   led_on;
    037A 9897      CBI	0x12,7
(0172) 	   flag.mess_wait=FALSE;            //清报文待发送标志
    037B 91800071  LDS	R24,flag
    037D 7F8E      ANDI	R24,0xFE
    037E 93800071  STS	flag,R24
(0173) 	   FF=TransmitMessage[0]&0x80;          //取贞格式
    0380 918000B9  LDS	R24,TransmitMessage
    0382 7880      ANDI	R24,0x80
    0383 2EA8      MOV	R10,R24
(0174) 	   Length=TransmitMessage[0]&0x0f;       //取数据长度代码
    0384 918000B9  LDS	R24,TransmitMessage
    0386 708F      ANDI	R24,0xF
(0175) 	
(0176) 	   if(Length=0x08)
    0387 E088      LDI	R24,0x8
    0388 2EC8      MOV	R12,R24
    0389 20CC      TST	R12
    038A F011      BEQ	0x038D
(0177) 	      {
(0178) 	        Length = 0x80;
    038B E880      LDI	R24,0x80
    038C 2EC8      MOV	R12,R24
(0179) 	      }
(0180) 	
(0181) 	   sja_write_data(TXEFF,TransmitMessage[0]);           //写TX贞报文
    038D 912000B9  LDS	R18,TransmitMessage
    038F E100      LDI	R16,0x10
    0390 DF5F      RCALL	_sja_write_data
(0182)        sja_write_data(TXID0,TransmitMessage[1]);           //写TX标识码1  
    0391 912000BA  LDS	R18,TransmitMessage+1
    0393 E101      LDI	R16,0x11
    0394 DF5B      RCALL	_sja_write_data
(0183) 	   sja_write_data(TXID1,TransmitMessage[2]);         
    0395 912000BB  LDS	R18,TransmitMessage+2
    0397 E102      LDI	R16,0x12
    0398 DF57      RCALL	_sja_write_data
(0184) 	   if(FF)                                              //FF=0:标准CAN格式
    0399 20AA      TST	R10
    039A F041      BEQ	0x03A3
(0185) 	       {                                               //FF=1:扩展CAN格式
(0186) 	          sja_write_data(TXID2,TransmitMessage[3]);
    039B 912000BC  LDS	R18,TransmitMessage+3
    039D E103      LDI	R16,0x13
    039E DF51      RCALL	_sja_write_data
(0187) 	          sja_write_data(TXID3,TransmitMessage[4]);
    039F 912000BD  LDS	R18,0xBD
    03A1 E104      LDI	R16,0x14
    03A2 DF4D      RCALL	_sja_write_data
(0188) 	       }   
(0189) 	   for (i=0;i<Length;i++)
    03A3 24EE      CLR	R14
    03A4 C018      RJMP	0x03BD
(0190) 	      { 
(0191) 	          if(FF)
    03A5 20AA      TST	R10
    03A6 F059      BEQ	0x03B2
(0192) 	              sja_write_data(TXDATA0+i,TransmitMessage[5+i]);
    03A7 EB8E      LDI	R24,0xBE
    03A8 E090      LDI	R25,0
    03A9 2DEE      MOV	R30,R14
    03AA 27FF      CLR	R31
    03AB 0FE8      ADD	R30,R24
    03AC 1FF9      ADC	R31,R25
    03AD 8120      LDD	R18,Z+0
    03AE 2D0E      MOV	R16,R14
    03AF 5E0B      SUBI	R16,0xEB
    03B0 DF3F      RCALL	_sja_write_data
    03B1 C00A      RJMP	0x03BC
(0193) 	          else 
(0194) 	              sja_write_data(TXDATA0+i,TransmitMessage[3+i]); 
    03B2 EB8C      LDI	R24,0xBC
    03B3 E090      LDI	R25,0
    03B4 2DEE      MOV	R30,R14
    03B5 27FF      CLR	R31
    03B6 0FE8      ADD	R30,R24
    03B7 1FF9      ADC	R31,R25
    03B8 8120      LDD	R18,Z+0
    03B9 2D0E      MOV	R16,R14
    03BA 5E0B      SUBI	R16,0xEB
    03BB DF34      RCALL	_sja_write_data
    03BC 94E3      INC	R14
    03BD 14EC      CP	R14,R12
    03BE F330      BCS	0x03A5
(0195) 	      }   
(0196) 	   led_off; 
    03BF 9A97      SBI	0x12,7
(0197) 	  //置位发送请求
(0198) 	  //sja_write_data(CMR,0x10);          //发送请求命令:zijieshou     
(0199)       sja_write_data(CMR,0x01);          //发送请求命令当错误时可重发                    
    03C0 E021      LDI	R18,1
    03C1 E001      LDI	R16,1
    03C2 DF2D      RCALL	_sja_write_data
(0200) 	  }
    03C3 940E06C0  CALL	pop_gset5x
    03C5 9508      RET
_sja_tx:
  sreg                 --> Y+0
  FF                   --> R12
  Length               --> R10
  state                --> R14
  i                    --> R14
  TransmitMessage      --> Y+7
    03C6 931A      ST	R17,-Y
    03C7 930A      ST	R16,-Y
    03C8 940E06CA  CALL	push_gset5x
    03CA 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;                               //保存全局中断标志
    03CB B62F      IN	R2,0x3F
    03CC 8228      STD	Y+0,R2
(0215)   CLI();
    03CD 94F8      BCLR	7
(0216)   
(0217)   state=sja_read_data(SR);     //读状态寄存器
    03CE E002      LDI	R16,2
    03CF DF30      RCALL	_sja_read_data
    03D0 2EE0      MOV	R14,R16
(0218)   while(state&(1<<4));         //正在接受则等待
    03D1 FCE4      SBRC	R14,4
    03D2 CFFE      RJMP	0x03D1
(0219) //  while(state&(1<<3));       //上次发送未完成则等待
(0220)   if(state&(1<<2))            //判断发送缓冲是否释放
    03D3 FEE2      SBRS	R14,2
    03D4 C049      RJMP	0x041E
(0221)   {
(0222)     led_on;
    03D5 9897      CBI	0x12,7
(0223)     FF=TransmitMessage[0]&0x80;          //取贞格式
    03D6 81EF      LDD	R30,Y+7
    03D7 85F8      LDD	R31,Y+8
    03D8 8180      LDD	R24,Z+0
    03D9 7880      ANDI	R24,0x80
    03DA 2EC8      MOV	R12,R24
(0224) 	Length=TransmitMessage[0]&0x0f;       //取数据长度代码
    03DB 8180      LDD	R24,Z+0
    03DC 708F      ANDI	R24,0xF
    03DD 2EA8      MOV	R10,R24
(0225) 	#ifdef DEBUG
(0226) 	  rprintfCRLF(); 
(0227) 	  rprintfStr("begin transmit..."); 
(0228) 	  rprintfCRLF(); 	   
(0229) 	#endif
(0230) 	if(Length>8)
    03DE E088      LDI	R24,0x8
    03DF 158A      CP	R24,R10
    03E0 F408      BCC	0x03E2
(0231) 	{
(0232) 	 Length = 8;
    03E1 2EA8      MOV	R10,R24
(0233) 	}
(0234) 	sja_write_data(TXEFF,TransmitMessage[0]);           //写TX贞报文
    03E2 81EF      LDD	R30,Y+7
    03E3 85F8      LDD	R31,Y+8
    03E4 8120      LDD	R18,Z+0
    03E5 E100      LDI	R16,0x10
    03E6 DF09      RCALL	_sja_write_data
(0235)     sja_write_data(TXID0,TransmitMessage[1]);           //写TX标识码1  
    03E7 81EF      LDD	R30,Y+7
    03E8 85F8      LDD	R31,Y+8
    03E9 8121      LDD	R18,Z+1
    03EA E101      LDI	R16,0x11
    03EB DF04      RCALL	_sja_write_data
(0236)     sja_write_data(TXID1,TransmitMessage[2]);         
    03EC 81EF      LDD	R30,Y+7
    03ED 85F8      LDD	R31,Y+8
    03EE 8122      LDD	R18,Z+2
    03EF E102      LDI	R16,0x12
    03F0 DEFF      RCALL	_sja_write_data
(0237) 	if(FF)                                         //FF=0:标准CAN格式
    03F1 20CC      TST	R12
    03F2 F051      BEQ	0x03FD
(0238) 	{                                            //FF=1:扩展CAN格式
(0239) 	sja_write_data(TXID2,TransmitMessage[3]);
    03F3 81EF      LDD	R30,Y+7
    03F4 85F8      LDD	R31,Y+8
    03F5 8123      LDD	R18,Z+3
    03F6 E103      LDI	R16,0x13
    03F7 DEF8      RCALL	_sja_write_data
(0240) 	sja_write_data(TXID3,TransmitMessage[4]);
    03F8 81EF      LDD	R30,Y+7
    03F9 85F8      LDD	R31,Y+8
    03FA 8124      LDD	R18,Z+4
    03FB E104      LDI	R16,0x14
    03FC DEF3      RCALL	_sja_write_data
(0241) 	}   
(0242) 	for (i=0;i<Length;i++)
    03FD 24EE      CLR	R14
    03FE C018      RJMP	0x0417
(0243) 	{ 
(0244) 	  if(FF)
    03FF 20CC      TST	R12
    0400 F059      BEQ	0x040C
(0245) 	    sja_write_data(21+i,TransmitMessage[5+i]);
    0401 2DEE      MOV	R30,R14
    0402 27FF      CLR	R31
    0403 800F      LDD	R0,Y+7
    0404 8418      LDD	R1,Y+8
    0405 0DE0      ADD	R30,R0
    0406 1DF1      ADC	R31,R1
    0407 8125      LDD	R18,Z+5
    0408 2D0E      MOV	R16,R14
    0409 5E0B      SUBI	R16,0xEB
    040A DEE5      RCALL	_sja_write_data
    040B C00A      RJMP	0x0416
(0246) 	  else 
(0247) 	    sja_write_data(19+i,TransmitMessage[3+i]); 
    040C 2DEE      MOV	R30,R14
    040D 27FF      CLR	R31
    040E 800F      LDD	R0,Y+7
    040F 8418      LDD	R1,Y+8
    0410 0DE0      ADD	R30,R0
    0411 1DF1      ADC	R31,R1
    0412 8123      LDD	R18,Z+3
    0413 2D0E      MOV	R16,R14
    0414 5E0D      SUBI	R16,0xED
    0415 DEDA      RCALL	_sja_write_data
    0416 94E3      INC	R14
    0417 14EA      CP	R14,R10
    0418 F330      BCS	0x03FF
(0248) 	}    
(0249) 	//置位发送请求
(0250) 	//sja_write_data(CMR,0x10);          //发送请求命令 
(0251) 	sja_write_data(CMR,0x01);          //发送请求命令当错误时可重发 
    0419 E021      LDI	R18,1
    041A E001      LDI	R16,1
    041B DED4      RCALL	_sja_write_data
(0252) 	led_off;        
    041C 9A97      SBI	0x12,7
(0253) 	#ifdef DEBUG
(0254) 	  rprintfStr("transmit over"); 
(0255) 	  rprintfCRLF(); 
(0256) 	  rprintfCRLF(); 	   
(0257) 	#endif              
(0258)   }
    041D C005      RJMP	0x0423
(0259)   else                                    //发送缓冲被锁,将数据存入RAM缓存
(0260)   {
(0261)     flag.mess_wait=TRUE;
    041E 91800071  LDS	R24,flag
    0420 6081      ORI	R24,1
    0421 93800071  STS	flag,R24
(0262)   }
(0263)   
(0264)   SREG=sreg;                
    0423 8008      LDD	R0,Y+0
    0424 BE0F      OUT	0x3F,R0
(0265)   SEI();
    0425 9478      BSET	7
    0426 9621      ADIW	R28,1
    0427 940E06C0  CALL	pop_gset5x
    0429 9622      ADIW	R28,2
    042A 9508      RET

⌨️ 快捷键说明

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