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

📄 can_module.s

📁 Atmel mcu can interface design example
💻 S
📖 第 1 页 / 共 3 页
字号:
; 	if(!SJATestRstMode())
	xcall _SJATestRstMode
	tst R16
	breq X8
	xjmp L115
X8:
	.dbline 422
; 	{
L117:
	.dbline 424
; 	   do
; 	   {
	.dbline 425
; 	      temp = SJASetClockDivision(0xC8);
	ldi R16,200
	xcall _SJASetClockDivision
	mov R22,R16
	.dbline 426
L118:
	.dbline 426
; 	   }while(temp);
	tst R22
	brne L117
	.dbline 427
; 	   WDR();
	wdr
	.dbline 428
	clr R20
	clr R21
	xjmp L123
L120:
	.dbline 428
L121:
	.dbline 428
	subi R20,255  ; offset = 1
	sbci R21,255
L123:
	.dbline 428
; 	   for(k=0;k<6;k++); 				//延时约5us
	cpi R20,6
	ldi R30,0
	cpc R21,R30
	brlo L120
L124:
	.dbline 430
; 	   do
; 	   {
	.dbline 431
; 	      temp = SJASetOutControl(0x1a);
	ldi R16,26
	xcall _SJASetOutControl
	mov R22,R16
	.dbline 432
L125:
	.dbline 432
; 	   }while(temp);
	tst R22
	brne L124
	.dbline 433
; 	   WDR();
	wdr
	.dbline 434
	clr R20
	clr R21
	xjmp L130
L127:
	.dbline 434
L128:
	.dbline 434
	subi R20,255  ; offset = 1
	sbci R21,255
L130:
	.dbline 434
; 	   for(k=0;k<6;k++); 				//延时约5us
	cpi R20,6
	ldi R30,0
	cpc R21,R30
	brlo L127
L131:
	.dbline 436
; 	   do
; 	   {
	.dbline 437
; 	      temp = SJASetBaudRateStandard(2);
	ldi R16,2
	xcall _SJASetBaudRateStandard
	mov R22,R16
	.dbline 438
L132:
	.dbline 438
; 	   }while(temp);
	tst R22
	brne L131
	.dbline 439
; 	   WDR();
	wdr
	.dbline 440
	clr R20
	clr R21
	xjmp L137
L134:
	.dbline 440
L135:
	.dbline 440
	subi R20,255  ; offset = 1
	sbci R21,255
L137:
	.dbline 440
; 	   for(k=0;k<6;k++); 				//延时约5us
	cpi R20,6
	ldi R30,0
	cpc R21,R30
	brlo L134
L138:
	.dbline 442
; 	   do
; 	   {
	.dbline 443
; 	      temp = SJASetAccCode(0x00, 0x00, 0x00, 0x00);
	clr R2
	std y+2,R2
	std y+0,R2
	clr R18
	clr R16
	xcall _SJASetAccCode
	mov R22,R16
	.dbline 444
L139:
	.dbline 444
; 	   }while(temp);
	tst R22
	brne L138
	.dbline 445
; 	   WDR();
	wdr
	.dbline 446
	clr R20
	clr R21
	xjmp L144
L141:
	.dbline 446
L142:
	.dbline 446
	subi R20,255  ; offset = 1
	sbci R21,255
L144:
	.dbline 446
; 	   for(k=0;k<6;k++); 				//延时约5us
	cpi R20,6
	ldi R30,0
	cpc R21,R30
	brlo L141
L145:
	.dbline 448
; 	   do
; 	   {
	.dbline 449
; 	      temp = SJASetAccMask(0xFF, 0xFF, 0xFF, 0xFF);
	ldi R24,255
	std y+2,R24
	std y+0,R24
	ldi R18,255
	ldi R16,255
	xcall _SJASetAccMask
	mov R22,R16
	.dbline 450
L146:
	.dbline 450
; 	   }while(temp);
	tst R22
	brne L145
	.dbline 451
; 	   WDR();
	wdr
	.dbline 452
	clr R20
	clr R21
	xjmp L151
L148:
	.dbline 452
L149:
	.dbline 452
	subi R20,255  ; offset = 1
	sbci R21,255
L151:
	.dbline 452
; 	   for(k=0;k<6;k++); 				//延时约5us
	cpi R20,6
	ldi R30,0
	cpc R21,R30
	brlo L148
L152:
	.dbline 454
; 	   do
; 	   {
	.dbline 455
; 	      temp = SJASetOtherReg();
	xcall _SJASetOtherReg
	mov R22,R16
	.dbline 456
L153:
	.dbline 456
; 	   }while(temp);
	tst R22
	brne L152
	.dbline 457
; 	   WDR();
	wdr
	.dbline 458
	clr R20
	clr R21
	xjmp L158
L155:
	.dbline 458
L156:
	.dbline 458
	subi R20,255  ; offset = 1
	sbci R21,255
L158:
	.dbline 458
; 	   for(k=0;k<6;k++); 				//延时约5us
	cpi R20,6
	ldi R30,0
	cpc R21,R30
	brlo L155
L159:
	.dbline 460
; 	   do
; 	   {
	.dbline 461
; 	      temp = SJAQuitResetMode();
	xcall _SJAQuitResetMode
	mov R22,R16
	.dbline 462
L160:
	.dbline 462
; 	   }while(temp);
	tst R22
	brne L159
	.dbline 464
; 	   
; 	   WDR();
	wdr
	.dbline 465
	clr R20
	clr R21
	xjmp L165
L162:
	.dbline 465
L163:
	.dbline 465
	subi R20,255  ; offset = 1
	sbci R21,255
L165:
	.dbline 465
; 	   for(k=0;k<6;k++); 				//延时约5us
	cpi R20,6
	ldi R30,0
	cpc R21,R30
	brlo L162
L166:
	.dbline 467
; 	   do
; 	   {
	.dbline 468
; 	      temp = SJASetIER(0x01);
	ldi R16,1
	xcall _SJASetIER
	mov R22,R16
	.dbline 469
L167:
	.dbline 469
; 	   }while(temp);
	tst R22
	brne L166
	.dbline 472
; 	   
; 	   
; 	}
L115:
	.dbline 474
; 	
; 	write_sja(CMR,0x0c);		  	//清除数据溢出和释放接收缓冲器;
	ldi R18,12
	ldi R16,1
	xcall _write_sja
	.dbline 475
	clr R20
	clr R21
	xjmp L172
L169:
	.dbline 475
L170:
	.dbline 475
	subi R20,255  ; offset = 1
	sbci R21,255
L172:
	.dbline 475
; 	for(k=0;k<6;k++); 				//延时约5us
	cpi R20,6
	ldi R30,0
	cpc R21,R30
	brlo L169
	.dbline 476
; 	WDR();
	wdr
L173:
	.dbline 478
; 	do
; 	{
	.dbline 479
; 	   write_sja(MODE, 0x0C);
	ldi R18,12
	clr R16
	xcall _write_sja
	.dbline 480
L174:
	.dbline 480
; 	}while((read_sja(MODE) & 0x01));
	clr R16
	xcall _read_sja
	sbrc R16,0
	rjmp L173
	.dbline 490
; 	/*WDR();
; 	for(k=0;k<6;k++); 				//延时约5us
; 	if(SJATestRstMode())
; 	{
; 	   do
; 	   {
; 	      temp = SJASetIER(0x01);
; 	   }while(temp);
; 	}*/
; 	SEI();
	sei
	.dbline -2
	.dbline 492
; 	
; } 
L100:
	adiw R28,3
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r temp 22 c
	.dbsym r k 20 i
	.dbend
	.dbfunc e CanTransmit _CanTransmit fV
;         status -> <dead>
	.even
_CanTransmit::
	.dbline -1
	.dbline 497
; /*************************************************
;                 SJA1000发送子函数
; *************************************************/
; void CanTransmit(void) 
; { 
	.dbline 499
; 	unsigned char status;
; 	CLI();		   	   	 		   //关中断		
	cli
	.dbline 514
; 	//实际用时对SJAWriteDataToTxBuf();的调用在个检测模块中
; 	/*SJAWriteDataToTxBuf(0, 0x88);
;     SJAWriteDataToTxBuf(1, 0x00);		
; 	SJAWriteDataToTxBuf(2, 0x00);
; 	SJAWriteDataToTxBuf(3, 0x00);
; 	SJAWriteDataToTxBuf(4, 0x00);
; 	SJAWriteDataToTxBuf(5, 0x01);
; 	SJAWriteDataToTxBuf(6, 0x02);
; 	SJAWriteDataToTxBuf(7, 0x03);	
; 	SJAWriteDataToTxBuf(8, 0x04);	
; 	SJAWriteDataToTxBuf(9, 0x05);	
; 	SJAWriteDataToTxBuf(10, 0x06);	
; 	SJAWriteDataToTxBuf(11, 0x07);	
; 	SJAWriteDataToTxBuf(12, 0xaa);*/
; 	TX_Buffer[0]=0x88;		
	ldi R24,136
	sts _TX_Buffer,R24
	.dbline 515
; 	TX_Buffer[1]=0x00;	
	clr R2
	sts _TX_Buffer+1,R2
	.dbline 516
; 	TX_Buffer[2]=0x00;	
	sts _TX_Buffer+2,R2
	.dbline 517
; 	TX_Buffer[3]=0x00;	
	sts _TX_Buffer+3,R2
	.dbline 518
; 	TX_Buffer[4]=0x00;	
	sts _TX_Buffer+4,R2
	.dbline 519
; 	TX_Buffer[5]=0x01;	
	ldi R24,1
	sts _TX_Buffer+5,R24
	.dbline 520
; 	TX_Buffer[6]=0x02;	
	ldi R24,2
	sts _TX_Buffer+6,R24
	.dbline 521
; 	TX_Buffer[7]=0x03;	
	ldi R24,3
	sts _TX_Buffer+7,R24
	.dbline 522
; 	TX_Buffer[8]=0x04;	
	ldi R24,4
	sts _TX_Buffer+8,R24
	.dbline 523
; 	TX_Buffer[9]=0x05;	
	ldi R24,5
	sts _TX_Buffer+9,R24
	.dbline 524
; 	TX_Buffer[10]=0x06;	
	ldi R24,6
	sts _TX_Buffer+10,R24
	.dbline 525
; 	TX_Buffer[11]=0x07;	
	ldi R24,7
	sts _TX_Buffer+11,R24
	.dbline 526
; 	TX_Buffer[12]=0xaa;	
	ldi R24,170
	sts _TX_Buffer+12,R24
L189:
	.dbline 528
L190:
	.dbline 528
; 					  
; 	while(!(read_sja(SR)&0x04));  //wait until reg2^2==1 ,即判断发送缓冲器的状态
	ldi R16,2
	xcall _read_sja
	sbrs R16,2
	rjmp L189
	.dbline 530
; 	
; 	write_sja(TXEFF, TX_Buffer[0]);		   //扩展帧,数据长度为8个字节
	lds R18,_TX_Buffer
	ldi R16,16
	xcall _write_sja
	.dbline 531
; 	write_sja(TXID0, TX_Buffer[1]);
	lds R18,_TX_Buffer+1
	ldi R16,17
	xcall _write_sja
	.dbline 532
; 	write_sja(TXID1, TX_Buffer[2]);
	lds R18,_TX_Buffer+2
	ldi R16,18
	xcall _write_sja
	.dbline 533
; 	write_sja(TXID2, TX_Buffer[3]);
	lds R18,_TX_Buffer+3
	ldi R16,19
	xcall _write_sja
	.dbline 534
; 	write_sja(TXID3, TX_Buffer[4]);
	lds R18,_TX_Buffer+4
	ldi R16,20
	xcall _write_sja
	.dbline 535
; 	write_sja(TXDATA0, TX_Buffer[5]);
	lds R18,_TX_Buffer+5
	ldi R16,21
	xcall _write_sja
	.dbline 536
; 	write_sja(TXDATA1, TX_Buffer[6]);
	lds R18,_TX_Buffer+6
	ldi R16,22
	xcall _write_sja
	.dbline 537
; 	write_sja(TXDATA2, TX_Buffer[7]);
	lds R18,_TX_Buffer+7
	ldi R16,23
	xcall _write_sja
	.dbline 538
; 	write_sja(TXDATA3, TX_Buffer[8]);
	lds R18,_TX_Buffer+8
	ldi R16,24
	xcall _write_sja
	.dbline 539
; 	write_sja(TXDATA4, TX_Buffer[9]);
	lds R18,_TX_Buffer+9
	ldi R16,25
	xcall _write_sja
	.dbline 540
; 	write_sja(TXDATA5, TX_Buffer[10]);
	lds R18,_TX_Buffer+10
	ldi R16,26
	xcall _write_sja
	.dbline 541
; 	write_sja(TXDATA6, TX_Buffer[11]);
	lds R18,_TX_Buffer+11
	ldi R16,27
	xcall _write_sja
	.dbline 542
; 	write_sja(TXDATA7, TX_Buffer[12]);
	lds R18,_TX_Buffer+12
	ldi R16,28
	xcall _write_sja
	.dbline 543
; 	write_sja(CMR,0x10);		  //发送请求命令
	ldi R18,16
	ldi R16,1
	xcall _write_sja
L204:
	.dbline 544
L205:
	.dbline 544
; 	while(!(read_sja(SR) & 0x08));//检测SR.3位,判断发送是否完成
	ldi R16,2
	xcall _read_sja
	sbrs R16,3
	rjmp L204
	.dbline 545
; 	SEI();				  	  	  //开中断
	sei
	.dbline -2
	.dbline 546
; } 
L176:
	.dbline 0 ; func end
	ret
	.dbsym l status 1 c
	.dbend
	.dbfunc e CanReceive _CanReceive fc
;            sff -> R12
;         number -> R20
;         result -> R22
;         status -> R20
;          prbuf -> R10
;              i -> R12
	.even
_CanReceive::
	xcall push_gset4
	.dbline -1
	.dbline 549
; 
; unsigned char CanReceive(void)
; {
	.dbline 550
;  	unsigned char result = FALSE;
	clr R22
	.dbline 553
; 	unsigned char status,number,i,sff;
; 	unsigned char prbuf;
; 	status = read_sja(SR);
	ldi R16,2
	xcall _read_sja
	mov R20,R16
	.dbline 554
; 	prbuf = RXEFF;
	ldi R24,16
	mov R10,R24
	.dbline 555
; 	if((status&0xc3) != 0)  		  //读取总线脱离、错误状态、接收溢出、有数据等位
	mov R24,R20
	andi R24,195
	brne X9
	xjmp L208
X9:
	.dbline 556
; 	{
	.dbline 557
; 		if((status&0x80) == 0x80)
	mov R24,R20
	andi R24,128
	cpi R24,128
	brne L210
	.dbline 558
; 		{
	.dbline 559
; 			write_sja(MODE, 0x00);
	clr R18
	clr R16
	xcall _write_sja
	.dbline 560
; 			return FALSE;
	clr R16
	xjmp L207
L210:
	.dbline 562
; 		}
; 		if((status&0x02) == 0x02)
	mov R24,R20
	andi R24,2
	cpi R24,2
	brne L212
	.dbline 563
; 		{
	.dbline 564
; 			write_sja(CMR, 0x0c);
	ldi R18,12
	ldi R16,1
	xcall _write_sja
	.dbline 565
; 			return FALSE;
	clr R16
	xjmp L207
L212:
	.dbline 568
; 		}
; 		
; 		if((status&0x01) == 0x01)
	mov R24,R20
	andi R24,1
	cpi R24,1
	brne L214
	.dbline 569
; 		{
	.dbline 570
; 			if((read_sja(RXEFF) & 0x40) == 0x40)  //如果RTR=1,为远程帧
	ldi R16,16
	xcall _read_sja
	mov R24,R16
	andi R24,64
	cpi R24,64
	brne L216
	.dbline 571
; 			{
	.dbline 572
; 				write_sja(CMR, 0x04);		  //则释放FXFIFO
	ldi R18,4
	ldi R16,1
	xcall _write_sja
	.dbline 573
; 			}
	xjmp L217
L216:
	.dbline 575
; 			else							  //为0,则是数据帧
; 			{
	.dbline 576
; 				sff = read_sja(prbuf) & 0x80;	  //取第一个字节的最高位
	mov R16,R10
	xcall _read_sja
	mov R24,R16
	andi R24,128
	mov R12,R24
	.dbline 577
; 				number = (read_sja(prbuf) & 0x0f);//取第一个字节的低四位,即数据长度
	mov R16,R10
	xcall _read_sja
	mov R20,R16
	andi R20,15
	.dbline 578
; 				if((sff & 0x80) == 0x80)		  //判断是标准帧还是扩展帧
	mov R24,R12
	andi R24,128
	cpi R24,128
	brne L218
	.dbline 579
; 				   number = number + 5;			  //扩展帧,则帧的总长度加5(13字节)
	subi R20,251    ; addi 5
	xjmp L219
L218:
	.dbline 581
; 				else
; 				   number = number + 3;			  //标准帧,则帧的总长度加3(11字节)
	subi R20,253    ; addi 3
L219:
	.dbline 582
; 				for(i = 0; i < number; i++)		  //读取数据
	clr R12
	xjmp L223
L220:
	.dbline 583
	.dbline 584
	mov R16,R10
	xcall _read_sja
	ldi R24,<_RX_Buffer
	ldi R25,>_RX_Buffer
	mov R30,R12
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R16
	.dbline 585
	inc R10
	.dbline 586
L221:
	.dbline 582
	inc R12
L223:
	.dbline 582
	cp R12,R20
	brlo L220
	.dbline 587
; 				{
; 					RX_Buffer[i]=read_sja(prbuf);
; 					prbuf++;
; 				}
; 				result = TRUE;	 		 	  //读取到正确的数据则返回TRUE
	ldi R22,1
	.dbline 588
; 				write_sja(CMR, 0x04);		  //最后释放FXFIFO
	ldi R18,4
	ldi R16,1
	xcall _write_sja
	.dbline 589
; 			}
L217:
	.dbline 590
; 		}
L214:
	.dbline 591
; 	}
L208:
	.dbline 592
; 	return result;
	mov R16,R22
	.dbline -2
L207:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r sff 12 c
	.dbsym r number 20 c
	.dbsym r result 22 c
	.dbsym r status 20 c
	.dbsym r prbuf 10 c
	.dbsym r i 12 c
	.dbend

⌨️ 快捷键说明

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