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

📄 can.s

📁 can tongxunCAN128的底层驱动
💻 S
📖 第 1 页 / 共 3 页
字号:
	.dbline 88
L18:
	.dbline 73
	inc R20
L20:
	.dbline 73
	cpi R20,15
	brlo L17
	.dbline 96
;             CANMSG = 0;         //clear data
;     }
; 
;     //bit timing -> datasheet page 260 (check table) 250Kbps
;     //CANBT1 = 0x02;            //16Mhz,1Mbps
;     //CANBT2 = 0x04;
;     //CANBT3 = 0x13;
;     
; 	//canbaud= EEPROM_read(0x0020);
; 	CANBT1 = CanBaud[2][0];         
	ldi R30,<_CanBaud+6
	ldi R31,>_CanBaud+6
	lpm R30,Z
	sts 226,R30
	.dbline 97
;     CANBT2 = CanBaud[2][1];
	ldi R30,<_CanBaud+6+1
	ldi R31,>_CanBaud+6+1
	lpm R30,Z
	sts 227,R30
	.dbline 98
;     CANBT3 = CanBaud[2][2];
	ldi R30,<_CanBaud+6+2
	ldi R31,>_CanBaud+6+2
	lpm R30,Z
	sts 228,R30
	.dbline 102
; 	
;     //configure MObi
; 	/******************************************************************/
;    for (i=0; i<15; i++)
	clr R20
	xjmp L33
L30:
	.dbline 103
	.dbline 104
	mov R24,R20
	andi R24,#0x0F
	swap R24
	sts 237,R24
	.dbline 105
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDT
	ldi R25,>_CANIDT
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 243,R2
	.dbline 106
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDT+1
	ldi R25,>_CANIDT+1
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 242,R2
	.dbline 107
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDT+2
	ldi R25,>_CANIDT+2
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 241,R2
	.dbline 108
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDT+3
	ldi R25,>_CANIDT+3
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 240,R2
	.dbline 109
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDM
	ldi R25,>_CANIDM
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 247,R2
	.dbline 110
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDM+1
	ldi R25,>_CANIDM+1
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 246,R2
	.dbline 111
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDM+2
	ldi R25,>_CANIDM+2
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 245,R2
	.dbline 112
	ldi R24,4
	mul R24,R20
	movw R30,R0
	ldi R24,<_CANIDM+3
	ldi R25,>_CANIDM+3
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 244,R2
	.dbline 114
	ldi R24,144
	sts 239,R24
	.dbline 115
	nop
	.dbline 116
L31:
	.dbline 102
	inc R20
L33:
	.dbline 102
	cpi R20,15
	brsh X2
	xjmp L30
X2:
	.dbline 119
;    {
; 	CANPAGE = (i<<4);                   //MOb number 0
;      CANIDT1 = CANIDT[i][0];        		//clear ID
;      CANIDT2 = CANIDT[i][1];
;      CANIDT3 = CANIDT[i][2];
;      CANIDT4 = CANIDT[i][3];
;      CANIDM1 = CANIDM[i][0];            	//clear mask
;      CANIDM2 = CANIDM[i][1];
;      CANIDM3 = CANIDM[i][2];
;      CANIDM4 = CANIDM[i][3];               //0 = ignore bit
;     //CANIDM4 = (1<<IDEMSK);                          //identifier extention mask
;      CANCDMOB = (2<<CONMOB) | (1<<IDE);     //reception, ext. ID,rev2.0B
; 	 NOP();
; 	}
; 	
;     //CANHPMOB = (2<<HPMOB);
; 	CANGCON = (1<<ENASTB);              //start CAN interface, enable mode
	ldi R24,2
	sts 216,R24
	.dbline 124
; /***********************************************************************/
;     //interrupts
;     //CANGIE = (1<<ENIT) | (1<<ENRX);         //enable receive interrupt
; 	
; 	CANGIE = (1<<ENIT) | (1<<ENTX)| (1<<ENRX);    //enable receive interrupt and transmitte interrupt 
	ldi R24,176
	sts 219,R24
	.dbline 126
;     /////////////////////////////////////////////////////////////////////// 
; 	CANIE1 = 0xff;                  
	ldi R24,255
	sts 223,R24
	.dbline 127
; 	CANIE2 = 0x7f;                         //enable ALL MObs interrupt
	ldi R24,127
	sts 222,R24
	.dbline 128
;     CANSIT1 = 0;                          //clear MOb status interrupt
	clr R2
	sts 225,R2
	.dbline 129
;     CANSIT2 = 0;
	sts 224,R2
	.dbline 132
;     
; ///////////////////////////	Enable Mob0 transmit/////////////////////
;     CLI();
	cli
	.dbline 133
;     CANPAGE = (1<<4);
	ldi R24,16
	sts 237,R24
	.dbline 134
;     CANCDMOB |= (1<<CONMOB0);
	lds R24,239
	ori R24,64
	sts 239,R24
L40:
	.dbline 137
L41:
	.dbline 137
; /////////////////////////////////////////////////////////////////////
; 
;     while (!(CANGSTA & (1<<ENFG)));         //wait until module ready
	lds R24,217
	andi R24,4
	breq L40
	.dbline 139
; 	
;     CANGCON |= (1<<ENA);      //enable CAN controller
	lds R24,216
	ori R24,2
	sts 216,R24
	.dbline -2
L2:
	adiw R28,4
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r temp2 10 i
	.dbsym r temp1 22 i
	.dbsym l temp 0 l
	.dbsym r j 22 c
	.dbsym r i 20 c
	.dbend
	.dbfunc e can_tx _can_tx fV
	.dbstruct 0 12 _VCI_CAN_OBJ
	.dbfield 0 ID L
	.dbfield 4 Data A[8:8]c
	.dbend
;              i -> R10
;            msg -> R12,R13
	.even
_can_tx::
	xcall push_gset4
	movw R12,R16
	.dbline -1
	.dbline 146
; }
; 
; /*******************************************************************
; CAN transmission via mailbox 1 (polling)
; *******************************************************************/
; void can_tx (VCI_CAN_OBJ msg)
; {
	.dbline 149
;     unsigned char i;
; 	//enable MOb1, auto increment index, start with index = 0
;     CANPAGE = (1<<4);
	ldi R24,16
	sts 237,R24
	.dbline 151
; 
;     CANCDMOB = (1<<IDE) | (8<<DLC0);        //set IDE bit rev2.0B, data length = 8
	ldi R24,24
	sts 239,R24
	.dbline 154
; 
;    
; 	msg.ID <<= 3;                   //write 29 Bit identifier
	ldi R24,3
	ldi R25,0
	movw R30,R12
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	st -y,R24
	xcall lsl32
	movw R30,R12
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 155
;     CANIDT4 = (unsigned char) (msg.ID&0xF8);
	ldi R20,248
	ldi R21,0
	ldi R22,0
	ldi R23,0
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	sts 240,R2
	.dbline 156
;     CANIDT3 = (unsigned char) (msg.ID>>8);
	ldi R24,8
	ldi R25,0
	st -y,R24
	xcall asr32
	sts 241,R16
	.dbline 157
;     CANIDT2 = (unsigned char) (msg.ID>>16);
	movw R30,R12
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R2,R4
	sts 242,R2
	.dbline 158
;     CANIDT1 = (unsigned char) (msg.ID>>24);
	ldi R24,24
	ldi R25,0
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	st -y,R24
	xcall asr32
	sts 243,R16
	.dbline 160
; 	
;     for(i=0;i<8;i++)                               
	clr R10
	xjmp L47
L44:
	.dbline 161
	.dbline 163
	movw R24,R12
	adiw R24,4
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 250,R2
	.dbline 164
L45:
	.dbline 160
	inc R10
L47:
	.dbline 160
	mov R24,R10
	cpi R24,8
	brlo L44
	.dbline 167
;       {
; 	   
;        CANMSG = msg.Data[i];
; 	  }
;    // for (i=0; i<8; i++)       //put data in mailbox 6
;         
;     CANCDMOB |= (1<<CONMOB0);           //enable transmission
	lds R24,239
	ori R24,64
	sts 239,R24
	.dbline -2
L43:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r i 10 c
	.dbsym r msg 12 pS[_VCI_CAN_OBJ]
	.dbend
	.area data(ram, con, rel)
	.dbfile F:\测量模块\16MCan\can.c
_CAN_tx_OverFlow::
	.blkb 2
	.area idata
	.word 60000
	.area data(ram, con, rel)
	.dbfile F:\测量模块\16MCan\can.c
	.dbsym e CAN_tx_OverFlow _CAN_tx_OverFlow i
	.area text(rom, con, rel)
	.dbfile F:\测量模块\16MCan\can.c
	.dbfunc e can_tx_buff _can_tx_buff fV
;         tx_msg -> R20,R21
	.even
_can_tx_buff::
	xcall push_gset1
	movw R20,R16
	sbiw R28,12
	.dbline -1
	.dbline 181
; 
;     //while (!(CANSTMOB & (1<<TXOK)));        //wait until complete
;     //CANSTMOB &= ~(1<<TXOK);             //reset flag
; }
; 
; 
; #define can_TX_BUFFER_SIZE  8
; VCI_CAN_OBJ tx_msg_buff[can_TX_BUFFER_SIZE];
; Uchar can_sendingP;
; Uchar can_willsendP;
; Uchar can_tx_count;
; Uint CAN_tx_OverFlow= 60000;
; void can_tx_buff(VCI_CAN_OBJ tx_msg)
; { 
	.dbline 182
;   CAN_tx_OverFlow = 60000;
	ldi R24,60000
	ldi R25,234
	sts _CAN_tx_OverFlow+1,R25
	sts _CAN_tx_OverFlow,R24
	xjmp L50
L49:
	.dbline 184
;   while (can_tx_count == can_TX_BUFFER_SIZE)
;    { 
	.dbline 185
;      CAN_tx_OverFlow--;
	lds R24,_CAN_tx_OverFlow
	lds R25,_CAN_tx_OverFlow+1
	sbiw R24,1
	sts _CAN_tx_OverFlow+1,R25
	sts _CAN_tx_OverFlow,R24
	.dbline 186
; 	 if(CAN_tx_OverFlow<=50)
	ldi R24,50
	ldi R25,0
	lds R2,_CAN_tx_OverFlow
	lds R3,_CAN_tx_OverFlow+1
	cp R24,R2
	cpc R25,R3
	brlo L52
	.dbline 187
; 	   {
	.dbline 188
; 	      can_tx_count = 0;
	clr R2
	sts _can_tx_count,R2
	.dbline 189
; 		  can_sendingP = can_willsendP; 
	lds R2,_can_willsendP
	sts _can_sendingP,R2
	.dbline 190
; 		  CANSTMOB &= ~(1<<TXOK);
	lds R24,238
	andi R24,191
	sts 238,R24
	.dbline 191
; 		  CAN_tx_OverFlow = 60000;
	ldi R24,60000
	ldi R25,234
	sts _CAN_tx_OverFlow+1,R25
	sts _CAN_tx_OverFlow,R24
	.dbline 192
; 	   }
L52:
	.dbline 193
L50:
	.dbline 183
	lds R24,_can_tx_count
	cpi R24,8
	breq L49
	.dbline 194
;    }
;   if(can_tx_count || (CANGSTA & (1<<TXBSY)))
	tst R24
	brne L56
	lds R24,217
	andi R24,16
	breq L54
L56:
	.dbline 195
;   {
	.dbline 196
;      tx_msg_buff[can_willsendP] = tx_msg;
	lds R2,_can_willsendP
	ldi R24,12
	mul R24,R2
	movw R2,R0
	ldi R24,<_tx_msg_buff
	ldi R25,>_tx_msg_buff
	add R2,R24
	adc R3,R25
	ldi R16,12
	ldi R17,0
	st -y,R3
	st -y,R2
	st -y,R21
	st -y,R20
	xcall asgnblk
	.dbline 197
;      if(++can_willsendP == can_TX_BUFFER_SIZE)
	lds R24,_can_willsendP
	subi R24,255    ; addi 1
	mov R2,R24
	sts _can_willsendP,R2
	cpi R24,8
	brne L57
	.dbline 198
; 	     can_willsendP = 0;
	clr R2
	sts _can_willsendP,R2
L57:
	.dbline 199
; 	 ++can_tx_count;
	lds R24,_can_tx_count
	subi R24,255    ; addi 1
	sts _can_tx_count,R24
	.dbline 200
;   } 
	xjmp L55
L54:
	.dbline 202
;   else 
;   {
	.dbline 203
;     if(can_willsendP != can_sendingP)
	lds R2,_can_sendingP
	lds R3,_can_willsendP
	cp R3,R2
	breq L59
	.dbline 204
; 	{
	.dbline 205
; 	  NOP();
	nop
	.dbline 206
; 	  can_willsendP=0;
	clr R2
	sts _can_willsendP,R2
	.dbline 207
; 	  can_sendingP=0;
	sts _can_sendingP,R2
	.dbline 208
; 	}
L59:
	.dbline 209
	movw R24,R28
	ldi R16,12
	ldi R17,0
	st -y,R25
	st -y,R24
	st -y,R21
	st -y,R20
	xcall asgnblk
	movw R16,R28
	xcall _can_tx
	.dbline 210
L55:
	.dbline -2
L48:
	adiw R28,12
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r tx_msg 20 pS[_VCI_CAN_OBJ]
	.dbend
	.area vector(rom, abs)
	.org 72
	jmp _can_ReceiveData
	.area text(rom, con, rel)
	.dbfile F:\测量模块\16MCan\can.c
	.dbfunc e can_ReceiveData _can_ReceiveData fV
;         RCFlag -> <dead>
;        RCtemp2 -> R10,R11
;        RCtemp1 -> R12,R13
;           temp -> y+210

⌨️ 快捷键说明

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