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

📄 16mcan.lst

📁 can tongxunCAN128的底层驱动
💻 LST
📖 第 1 页 / 共 3 页
字号:
    022B 8020      LDD	R2,Z+0
    022C 922000F7  STS	0xF7,R2
(0110)      CANIDM2 = CANIDM[i][1];
    022E E084      LDI	R24,4
    022F 9F84      MUL	R24,R20
    0230 01F0      MOVW	R30,R0
    0231 EB85      LDI	R24,0xB5
    0232 E091      LDI	R25,1
    0233 0FE8      ADD	R30,R24
    0234 1FF9      ADC	R31,R25
    0235 8020      LDD	R2,Z+0
    0236 922000F6  STS	0xF6,R2
(0111)      CANIDM3 = CANIDM[i][2];
    0238 E084      LDI	R24,4
    0239 9F84      MUL	R24,R20
    023A 01F0      MOVW	R30,R0
    023B EB86      LDI	R24,0xB6
    023C E091      LDI	R25,1
    023D 0FE8      ADD	R30,R24
    023E 1FF9      ADC	R31,R25
    023F 8020      LDD	R2,Z+0
    0240 922000F5  STS	0xF5,R2
(0112)      CANIDM4 = CANIDM[i][3];               //0 = ignore bit
    0242 E084      LDI	R24,4
    0243 9F84      MUL	R24,R20
    0244 01F0      MOVW	R30,R0
    0245 EB87      LDI	R24,0xB7
    0246 E091      LDI	R25,1
    0247 0FE8      ADD	R30,R24
    0248 1FF9      ADC	R31,R25
    0249 8020      LDD	R2,Z+0
    024A 922000F4  STS	0xF4,R2
(0113)     //CANIDM4 = (1<<IDEMSK);                          //identifier extention mask
(0114)      CANCDMOB = (2<<CONMOB) | (1<<IDE);     //reception, ext. ID,rev2.0B
    024C E980      LDI	R24,0x90
    024D 938000EF  STS	0xEF,R24
(0115) 	 NOP();
    024F 0000      NOP
    0250 9543      INC	R20
    0251 304F      CPI	R20,0xF
    0252 F408      BCC	0x0254
    0253 CFA3      RJMP	0x01F7
(0116) 	}
(0117) 	
(0118)     //CANHPMOB = (2<<HPMOB);
(0119) 	CANGCON = (1<<ENASTB);              //start CAN interface, enable mode
    0254 E082      LDI	R24,2
    0255 938000D8  STS	0xD8,R24
(0120) /***********************************************************************/
(0121)     //interrupts
(0122)     //CANGIE = (1<<ENIT) | (1<<ENRX);         //enable receive interrupt
(0123) 	
(0124) 	CANGIE = (1<<ENIT) | (1<<ENTX)| (1<<ENRX);    //enable receive interrupt and transmitte interrupt 
    0257 EB80      LDI	R24,0xB0
    0258 938000DB  STS	0xDB,R24
(0125)     /////////////////////////////////////////////////////////////////////// 
(0126) 	CANIE1 = 0xff;                  
    025A EF8F      LDI	R24,0xFF
    025B 938000DF  STS	0xDF,R24
(0127) 	CANIE2 = 0x7f;                         //enable ALL MObs interrupt
    025D E78F      LDI	R24,0x7F
    025E 938000DE  STS	0xDE,R24
(0128)     CANSIT1 = 0;                          //clear MOb status interrupt
    0260 2422      CLR	R2
    0261 922000E1  STS	0xE1,R2
(0129)     CANSIT2 = 0;
    0263 922000E0  STS	0xE0,R2
(0130)     
(0131) ///////////////////////////	Enable Mob0 transmit/////////////////////
(0132)     CLI();
    0265 94F8      BCLR	7
(0133)     CANPAGE = (1<<4);
    0266 E180      LDI	R24,0x10
    0267 938000ED  STS	0xED,R24
(0134)     CANCDMOB |= (1<<CONMOB0);
    0269 918000EF  LDS	R24,0xEF
    026B 6480      ORI	R24,0x40
    026C 938000EF  STS	0xEF,R24
(0135) /////////////////////////////////////////////////////////////////////
(0136) 
(0137)     while (!(CANGSTA & (1<<ENFG)));         //wait until module ready
    026E 918000D9  LDS	R24,0xD9
    0270 7084      ANDI	R24,4
    0271 F3E1      BEQ	0x026E
(0138) 	
(0139)     CANGCON |= (1<<ENA);      //enable CAN controller
    0272 918000D8  LDS	R24,0xD8
    0274 6082      ORI	R24,2
    0275 938000D8  STS	0xD8,R24
    0277 9624      ADIW	R28,4
    0278 940E04C6  CALL	pop_gset3
    027A 9508      RET
_can_tx:
  i                    --> R10
  msg                  --> R12
    027B 940E04D1  CALL	push_gset4
    027D 0168      MOVW	R12,R16
(0140) }
(0141) 
(0142) /*******************************************************************
(0143) CAN transmission via mailbox 1 (polling)
(0144) *******************************************************************/
(0145) void can_tx (VCI_CAN_OBJ msg)
(0146) {
(0147)     unsigned char i;
(0148) 	//enable MOb1, auto increment index, start with index = 0
(0149)     CANPAGE = (1<<4);
    027E E180      LDI	R24,0x10
    027F 938000ED  STS	0xED,R24
(0150) 
(0151)     CANCDMOB = (1<<IDE) | (8<<DLC0);        //set IDE bit rev2.0B, data length = 8
    0281 E188      LDI	R24,0x18
    0282 938000EF  STS	0xEF,R24
(0152) 
(0153)    
(0154) 	msg.ID <<= 3;                   //write 29 Bit identifier
    0284 E083      LDI	R24,3
    0285 E090      LDI	R25,0
    0286 01F6      MOVW	R30,R12
    0287 8100      LDD	R16,Z+0
    0288 8111      LDD	R17,Z+1
    0289 8122      LDD	R18,Z+2
    028A 8133      LDD	R19,Z+3
    028B 938A      ST	R24,-Y
    028C 940E0523  CALL	lsl32
    028E 01F6      MOVW	R30,R12
    028F 8300      STD	Z+0,R16
    0290 8311      STD	Z+1,R17
    0291 8322      STD	Z+2,R18
    0292 8333      STD	Z+3,R19
(0155)     CANIDT4 = (unsigned char) (msg.ID&0xF8);
    0293 EF48      LDI	R20,0xF8
    0294 E050      LDI	R21,0
    0295 E060      LDI	R22,0
    0296 E070      LDI	R23,0
    0297 8020      LDD	R2,Z+0
    0298 8031      LDD	R3,Z+1
    0299 8042      LDD	R4,Z+2
    029A 8053      LDD	R5,Z+3
    029B 2224      AND	R2,R20
    029C 2235      AND	R3,R21
    029D 2246      AND	R4,R22
    029E 2257      AND	R5,R23
    029F 922000F0  STS	0xF0,R2
(0156)     CANIDT3 = (unsigned char) (msg.ID>>8);
    02A1 E088      LDI	R24,0x8
    02A2 E090      LDI	R25,0
    02A3 938A      ST	R24,-Y
    02A4 940E04BA  CALL	asr32
    02A6 930000F1  STS	0xF1,R16
(0157)     CANIDT2 = (unsigned char) (msg.ID>>16);
    02A8 01F6      MOVW	R30,R12
    02A9 8020      LDD	R2,Z+0
    02AA 8031      LDD	R3,Z+1
    02AB 8042      LDD	R4,Z+2
    02AC 8053      LDD	R5,Z+3
    02AD 0112      MOVW	R2,R4
    02AE 922000F2  STS	0xF2,R2
(0158)     CANIDT1 = (unsigned char) (msg.ID>>24);
    02B0 E188      LDI	R24,0x18
    02B1 E090      LDI	R25,0
    02B2 8100      LDD	R16,Z+0
    02B3 8111      LDD	R17,Z+1
    02B4 8122      LDD	R18,Z+2
    02B5 8133      LDD	R19,Z+3
    02B6 938A      ST	R24,-Y
    02B7 940E04BA  CALL	asr32
    02B9 930000F3  STS	0xF3,R16
(0159) 	
(0160)     for(i=0;i<8;i++)                               
    02BB 24AA      CLR	R10
    02BC C00A      RJMP	0x02C7
(0161)       {
(0162) 	   
(0163)        CANMSG = msg.Data[i];
    02BD 01C6      MOVW	R24,R12
    02BE 9604      ADIW	R24,4
    02BF 2DEA      MOV	R30,R10
    02C0 27FF      CLR	R31
    02C1 0FE8      ADD	R30,R24
    02C2 1FF9      ADC	R31,R25
    02C3 8020      LDD	R2,Z+0
    02C4 922000FA  STS	0xFA,R2
    02C6 94A3      INC	R10
    02C7 2D8A      MOV	R24,R10
    02C8 3088      CPI	R24,0x8
    02C9 F398      BCS	0x02BD
(0164) 	  }
(0165)    // for (i=0; i<8; i++)       //put data in mailbox 6
(0166)         
(0167)     CANCDMOB |= (1<<CONMOB0);           //enable transmission
    02CA 918000EF  LDS	R24,0xEF
    02CC 6480      ORI	R24,0x40
    02CD 938000EF  STS	0xEF,R24
    02CF 940E04C9  CALL	pop_gset4
    02D1 9508      RET
_can_tx_buff:
  tx_msg               --> R20
    02D2 940E04D7  CALL	push_gset1
    02D4 01A8      MOVW	R20,R16
    02D5 972C      SBIW	R28,0xC
(0168) 
(0169)     //while (!(CANSTMOB & (1<<TXOK)));        //wait until complete
(0170)     //CANSTMOB &= ~(1<<TXOK);             //reset flag
(0171) }
(0172) 
(0173) 
(0174) #define can_TX_BUFFER_SIZE  8
(0175) VCI_CAN_OBJ tx_msg_buff[can_TX_BUFFER_SIZE];
(0176) Uchar can_sendingP;
(0177) Uchar can_willsendP;
(0178) Uchar can_tx_count;
(0179) Uint CAN_tx_OverFlow= 60000;
(0180) void can_tx_buff(VCI_CAN_OBJ tx_msg)
(0181) { 
(0182)   CAN_tx_OverFlow = 60000;
    02D6 E680      LDI	R24,0x60
    02D7 EE9A      LDI	R25,0xEA
    02D8 939001F1  STS	CAN_tx_OverFlow+1,R25
    02DA 938001F0  STS	CAN_tx_OverFlow,R24
    02DC C024      RJMP	0x0301
(0183)   while (can_tx_count == can_TX_BUFFER_SIZE)
(0184)    { 
(0185)      CAN_tx_OverFlow--;
    02DD 918001F0  LDS	R24,CAN_tx_OverFlow
    02DF 919001F1  LDS	R25,CAN_tx_OverFlow+1
    02E1 9701      SBIW	R24,1
    02E2 939001F1  STS	CAN_tx_OverFlow+1,R25
    02E4 938001F0  STS	CAN_tx_OverFlow,R24
(0186) 	 if(CAN_tx_OverFlow<=50)
    02E6 E382      LDI	R24,0x32
    02E7 E090      LDI	R25,0
    02E8 902001F0  LDS	R2,CAN_tx_OverFlow
    02EA 903001F1  LDS	R3,CAN_tx_OverFlow+1
    02EC 1582      CP	R24,R2
    02ED 0593      CPC	R25,R3
    02EE F090      BCS	0x0301
(0187) 	   {
(0188) 	      can_tx_count = 0;
    02EF 2422      CLR	R2
    02F0 922001FE  STS	can_tx_count,R2
(0189) 		  can_sendingP = can_willsendP; 
    02F2 902001FF  LDS	R2,can_willsendP
    02F4 92200200  STS	can_sendingP,R2
(0190) 		  CANSTMOB &= ~(1<<TXOK);
    02F6 918000EE  LDS	R24,0xEE
    02F8 7B8F      ANDI	R24,0xBF
    02F9 938000EE  STS	0xEE,R24
(0191) 		  CAN_tx_OverFlow = 60000;
    02FB E680      LDI	R24,0x60
    02FC EE9A      LDI	R25,0xEA
    02FD 939001F1  STS	CAN_tx_OverFlow+1,R25
    02FF 938001F0  STS	CAN_tx_OverFlow,R24
    0301 918001FE  LDS	R24,can_tx_count
    0303 3088      CPI	R24,0x8
    0304 F2C1      BEQ	0x02DD
(0192) 	   }
(0193)    }
(0194)   if(can_tx_count || (CANGSTA & (1<<TXBSY)))
    0305 2388      TST	R24
    0306 F421      BNE	0x030B
    0307 918000D9  LDS	R24,0xD9
    0309 7180      ANDI	R24,0x10
    030A F111      BEQ	0x032D
(0195)   {
(0196)      tx_msg_buff[can_willsendP] = tx_msg;
    030B 902001FF  LDS	R2,can_willsendP
    030D E08C      LDI	R24,0xC
    030E 9D82      MUL	R24,R2
    030F 0110      MOVW	R2,R0
    0310 E081      LDI	R24,1
    0311 E092      LDI	R25,2
    0312 0E28      ADD	R2,R24
    0313 1E39      ADC	R3,R25
    0314 E00C      LDI	R16,0xC
    0315 E010      LDI	R17,0
    0316 923A      ST	R3,-Y
    0317 922A      ST	R2,-Y
    0318 935A      ST	R21,-Y
    0319 934A      ST	R20,-Y
    031A 940E052F  CALL	asgnblk
(0197)      if(++can_willsendP == can_TX_BUFFER_SIZE)
    031C 918001FF  LDS	R24,can_willsendP
    031E 5F8F      SUBI	R24,0xFF
    031F 2E28      MOV	R2,R24
    0320 922001FF  STS	can_willsendP,R2
    0322 3088      CPI	R24,0x8
    0323 F419      BNE	0x0327
(0198) 	     can_willsendP = 0;
    0324 2422      CLR	R2
    0325 922001FF  STS	can_willsendP,R2
(0199) 	 ++can_tx_count;
    0327 918001FE  LDS	R24,can_tx_count
    0329 5F8F      SUBI	R24,0xFF
    032A 938001FE  STS	can_tx_count,R24
(0200)   } 
    032C C017      RJMP	0x0344
(0201)   else 
(0202)   {
(0203)     if(can_willsendP != can_sendingP)
    032D 90200200  LDS	R2,can_sendingP
    032F 903001FF  LDS	R3,can_willsendP
    0331 1432      CP	R3,R2
    0332 F031      BEQ	0x0339
(0204) 	{
(0205) 	  NOP();
    0333 0000      NOP
(0206) 	  can_willsendP=0;
    0334 2422      CLR	R2
    0335 922001FF  STS	can_willsendP,R2
(0207) 	  can_sendingP=0;
    0337 92200200  STS	can_sendingP,R2
(0208) 	}
(0209)     can_tx(tx_msg);
    0339 01CE      MOVW	R24,R28
    033A E00C      LDI	R16,0xC
    033B E010      LDI	R17,0
    033C 939A      ST	R25,-Y
    033D 938A      ST	R24,-Y
    033E 935A      ST	R21,-Y
    033F 934A      ST	R20,-Y
    0340 940E052F  CALL	asgnblk
    0342 018E      MOVW	R16,R28
    0343 DF37      RCALL	_can_tx
(0210)   }  
    0344 962C      ADIW	R28,0xC
    0345 940E04DA  CALL	pop_gset1
    0347 9508      RET
_can_ReceiveData:
  RCFlag               --> Y,+1
  RCtemp2              --> R10
  RCtemp1              --> R12
  temp                 --> Y,+210
  RC_CANSI             --> Y,+208
  CAN_REMOb            --> Y,+180
  RCF                  --> R10
  tempp                --> R14
  nn                   --> R14
  tt                   --> Y,+207
  msg                  --> Y,+0
  i                    --> R12
  nb_data              --> R10
    0348 940E04EE  CALL	push_lset
    034A 940E04CF  CALL	push_gset5
    034C 97EF      SBIW	R28,0x3F
    034D 97EF      SBIW	R28,0x3F
    034E 97EF      SBIW	R28,0x3F
    034F 9766      SBIW	R28,0x16
(0211) }
(0212) 
(0213) 
(0214) /*******************************************************************
(0215) CAN receive interrupt service routine (mailbox i)
(0216) *******************************************************************/
(0217) #pragma interrupt_handler can_ReceiveData:19
(0218) void can_ReceiveData (void)             //receive interrupt 
(0219) {Uchar RCFlag;
(0220) 	unsigned char nb_data;
(0221) 	unsigned char temp = CANPAGE;           //save CANPAGE
    0350 902000ED  LDS	R2,0xED
    0352 01FE      MOVW	R30,R28
    0353 52EE      SUBI	R30,0x2E
    0354 4FFF      SBCI	R31,0xFF
    0355 8220      STD	Z+0,R2
(0222) 	unsigned char i,tt=0,CAN_REMOb[15],nn;
    0356 2400      CLR	R0
    0357 01FE      MOVW	R30,R28
    0358 53E1      SUBI	R30,0x31
    0359 4FFF      SBCI	R31,0xFF
    035A 8200      STD	Z+0,R0
(0223) 	unsigned int RC_CANSI,RCtemp1,RCtemp2,tempp,RCF;
(0224) 	VCI_CAN_OBJ msg[15];
(0225) 
(0226)     //VCI_CAN_OBJ CanTkfrm;
(0227) 
(0228) 	
(0229) if(CANSTMOB & (1<<TXOK))
    035B 918000EE  LDS	R24,0xEE
    035D 7480      ANDI	R24,0x40
    035E F199      BEQ	0x0392
(0230)  { 
(0231)    CANSTMOB &= ~(1<<TXOK);
    035F 918000EE  LDS	R24,0xEE
    0361 7B8F      ANDI	R24,0xBF
    0362 938000EE  STS	0xEE,R24
(0232)    if(can_tx_count)
    0364 902001FE  LDS	R2,can_tx_count
    0366 2022      TST	R2
    0367 F409      BNE	0x0369
    0368 C142      RJMP	0x04AB
(0233)      {
(0234) 	   --can_tx_count;
    0369 2D82      MOV	R24,R2
    036A 5081      SUBI	R24,1
    036B 938001FE  STS	can_tx_count,R24
(0235) 	   can_tx(tx_msg_buff[can_sendingP]);
    036D 90200200  LDS	R2,can_sendingP
    036F E08C      LDI	R24,0xC
    0370 9D82      MUL	R24,R2
    0371 0110      MOVW	R2,R0
    0372 E081      LDI	R24,1
    0373 E092      LDI	R25,2
    0374 0E28      ADD	R2,R24
    0375 1E39      ADC	R3,R25
    0376 01CE      MOVW	R24,R28
    0377 538D      SUBI	R24,0x3D
    0378 4F9F      SBCI	R25,0xFF
    0379 E00C      LDI	R16,0xC
    037A E010      LDI	R17,0
    037B 939A      ST	R25,-Y
    037C 938A      ST	R24,-Y
    037D 923A      ST	R3,-Y
    037E 922A      ST	R2,-Y
    037F 940E052F  CALL	asgnblk
    0381 018E      MOVW	R16,R28
    0382 530D      SUBI	R16,0x3D
    0383 4F1F      SBCI	R17,0xFF
    0384 DEF6      RCALL	_can_tx
(0236) 	   if(++can_sendingP==can_TX_BUFFER_SIZE) can_sendingP=0;
    0385 91800200  LDS	R24,can_sendingP
    0387 5F8F      SUBI	R24,0xFF
    0388 2E28      MOV	R2,R24
    0389 92200200  STS	can_sendingP,R2
    038B 3088      CPI	R24,0x8
    038C F009      BEQ	0x038E
    038D C11D      RJMP	0x04AB
    038E 2422      CLR	R2
    038F 92200200  STS	can_sendingP,R2
(0237) 	 }
(0238)  }
    0391 C119      RJMP	0x04AB
(0239) else 
(0240)  {	 
(0241) 	RCtemp2=CANSIT2;
    0392 90A000E0  LDS	R10,0xE0
    0394 24BB      CLR	R11
(0242) 	RCtemp1=CANSIT1;
    0395 90C000E1  LDS	R12,0xE1
    0397 24DD      CLR	R13
(0243) 	CANSTMOB &= ~(1<<RXOK);
    0398 918000EE  LDS	R24,0xEE
    039A 7D8F      ANDI	R24,0xDF
    039B 938000EE  STS	0xEE,R24
(0244) 	RC_CANSI=(RCtemp1<<8)|RCtemp2;
    039D 0116      MOVW	R2,R12
    039E 2C32      MOV	R3,R2
    039F 2422      CLR	R2
    03A0 282A      OR	R2,R10
    03A1 283B      OR	R3,R11
    03A2 01FE      MOVW	R30,R28
    03A3 53E0      SUBI	R30,0x30
    03A4 4FFF      SBCI	R31,0xFF
    03A5 8231      STD	Z+1,R3
    03A6 8220      STD	Z+0,R2
(0245)     for(i=0;i<15;i++)
    03A7 24CC      CLR	R12
    03A8 C02B      RJMP	0x03D4
(0246) 	 {
(0247) 	  tempp=(1<<i);
    03A9 2D2C      MOV	R18,R12
    03AA 2733      CLR	R19
    03AB E001      LDI	R16,1
    03AC E010      LDI	R17,0

⌨️ 快捷键说明

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