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

📄 si4700.lss

📁 mega8控制的fm程序(SI4700)。
💻 LSS
📖 第 1 页 / 共 5 页
字号:
 334:	04 c0       	rjmp	.+8      	; 0x33e <Si4700_Channel_Selection+0xee>
 336:	8f ef       	ldi	r24, 0xFF	; 255
 338:	c8 16       	cp	r12, r24
 33a:	d1 04       	cpc	r13, r1
 33c:	70 f3       	brcs	.-36     	; 0x31a <Si4700_Channel_Selection+0xca>
	while(((si4700_reg_data[0]&0x40) != 0) && (loop_counter < 0xff));		
	loop_counter = 0;

	//read REG0A&0B
	error_ind = OperationSi4700_2w(READ,&(si4700_reg_data[0]), 4);	
 33e:	44 e0       	ldi	r20, 0x04	; 4
 340:	be 01       	movw	r22, r28
 342:	68 5f       	subi	r22, 0xF8	; 248
 344:	7f 4f       	sbci	r23, 0xFF	; 255
 346:	81 e2       	ldi	r24, 0x21	; 33
 348:	9c de       	rcall	.-712    	; 0x82 <OperationSi4700_2w>
 34a:	2b 96       	adiw	r28, 0x0b	; 11
 34c:	0f b6       	in	r0, 0x3f	; 63
 34e:	f8 94       	cli
 350:	de bf       	out	0x3e, r29	; 62
 352:	0f be       	out	0x3f, r0	; 63
 354:	cd bf       	out	0x3d, r28	; 61
 356:	df 91       	pop	r29
 358:	cf 91       	pop	r28
 35a:	1f 91       	pop	r17
 35c:	0f 91       	pop	r16
 35e:	ff 90       	pop	r15
 360:	ef 90       	pop	r14
 362:	df 90       	pop	r13
 364:	cf 90       	pop	r12
 366:	bf 90       	pop	r11
 368:	af 90       	pop	r10
 36a:	08 95       	ret

0000036c <Si4700_Channel_Seek_UP>:
	if(error_ind)
		return;	
	

}

/*****************************************************************************************************

Si4700_Channel_Seek()
return 0: good, current channel is valid
return 1: I2C error 
return 2: used in SKMODE0, seek fail, no any valid channel, should end seek
return 2: used in SKMODE1, Band Limit, Stop seeking at the upper or lower band limit, should end seek
return 3: AFC rail, current channel is invalid, should seek next one

******************************************************************************************************/
UINT32 Si4700_Channel_Seek_UP(void)

{
 36c:	ef 92       	push	r14
 36e:	ff 92       	push	r15
 370:	0f 93       	push	r16
 372:	1f 93       	push	r17
 374:	cf 93       	push	r28
 376:	df 93       	push	r29
 378:	cd b7       	in	r28, 0x3d	; 61
 37a:	de b7       	in	r29, 0x3e	; 62
 37c:	a2 97       	sbiw	r28, 0x22	; 34
 37e:	0f b6       	in	r0, 0x3f	; 63
 380:	f8 94       	cli
 382:	de bf       	out	0x3e, r29	; 62
 384:	0f be       	out	0x3f, r0	; 63
 386:	cd bf       	out	0x3d, r28	; 61
	unsigned short loop_counter = 0;
 388:	00 e0       	ldi	r16, 0x00	; 0
 38a:	10 e0       	ldi	r17, 0x00	; 0
	unsigned char si4700_reg_data[32];
	unsigned char error_ind = 0, seek_error = 0;
	unsigned char si4700_channel_seek_start[] = {0x41};
 38c:	81 e4       	ldi	r24, 0x41	; 65
 38e:	89 a3       	std	Y+33, r24	; 0x21
	unsigned char si4700_channel_seek_stop[] = {0x40};
 390:	80 e4       	ldi	r24, 0x40	; 64
 392:	8a a3       	std	Y+34, r24	; 0x22
	UINT32 frq;
	//set seek bit
 	error_ind = OperationSi4700_2w(WRITE,&(si4700_channel_seek_start[0]), 1);
 394:	41 e0       	ldi	r20, 0x01	; 1
 396:	be 01       	movw	r22, r28
 398:	6f 5d       	subi	r22, 0xDF	; 223
 39a:	7f 4f       	sbci	r23, 0xFF	; 255
 39c:	80 e2       	ldi	r24, 0x20	; 32
 39e:	71 de       	rcall	.-798    	; 0x82 <OperationSi4700_2w>
	if(error_ind)
 3a0:	88 23       	and	r24, r24
 3a2:	09 f0       	breq	.+2      	; 0x3a6 <Si4700_Channel_Seek_UP+0x3a>
 3a4:	3b c0       	rjmp	.+118    	; 0x41c <Si4700_Channel_Seek_UP+0xb0>
		return 1;

	//wait STC=1
	do
	{	
		error_ind = OperationSi4700_2w(READ,&(si4700_reg_data[0]), 1);
 3a6:	41 e0       	ldi	r20, 0x01	; 1
 3a8:	be 01       	movw	r22, r28
 3aa:	6f 5f       	subi	r22, 0xFF	; 255
 3ac:	7f 4f       	sbci	r23, 0xFF	; 255
 3ae:	81 e2       	ldi	r24, 0x21	; 33
 3b0:	68 de       	rcall	.-816    	; 0x82 <OperationSi4700_2w>
		if(error_ind)
 3b2:	88 23       	and	r24, r24
 3b4:	99 f5       	brne	.+102    	; 0x41c <Si4700_Channel_Seek_UP+0xb0>
			return 1;	
		loop_counter++;
 3b6:	0f 5f       	subi	r16, 0xFF	; 255
 3b8:	1f 4f       	sbci	r17, 0xFF	; 255
		__ticks = 1;
	else if (__tmp > 65535)
		__ticks = 0;	/* i.e. 65536 */
	else
		__ticks = (uint16_t)__tmp;
 3ba:	80 e1       	ldi	r24, 0x10	; 16
 3bc:	97 e2       	ldi	r25, 0x27	; 39
 3be:	01 97       	sbiw	r24, 0x01	; 1
 3c0:	f1 f7       	brne	.-4      	; 0x3be <Si4700_Channel_Seek_UP+0x52>
		_delay_ms(5);
	}
 3c2:	89 81       	ldd	r24, Y+1	; 0x01
 3c4:	86 fd       	sbrc	r24, 6
 3c6:	04 c0       	rjmp	.+8      	; 0x3d0 <Si4700_Channel_Seek_UP+0x64>
 3c8:	8f e0       	ldi	r24, 0x0F	; 15
 3ca:	0f 3f       	cpi	r16, 0xFF	; 255
 3cc:	18 07       	cpc	r17, r24
 3ce:	58 f3       	brcs	.-42     	; 0x3a6 <Si4700_Channel_Seek_UP+0x3a>
	while(((si4700_reg_data[0]&0x40) == 0) && (loop_counter < 0xfff));	//for loop_counter, when seek, the loop time must > 2s		
	loop_counter = 0;
 3d0:	00 e0       	ldi	r16, 0x00	; 0
 3d2:	10 e0       	ldi	r17, 0x00	; 0

	//if you use SKMODE = 0, you can check Seek Fail here
	//if you use SKMODE = 1, you can check Band Limit here
	if((si4700_reg_data[0]&0x20) != 0)
		seek_error = 2;
		
	//you can check AFC Rail here
	else if((si4700_reg_data[0]&0x10) != 0)
		seek_error = 3;

	//clear seek bit
	error_ind = OperationSi4700_2w(WRITE,&(si4700_channel_seek_stop[0]), 1);
 3d4:	41 e0       	ldi	r20, 0x01	; 1
 3d6:	be 01       	movw	r22, r28
 3d8:	6e 5d       	subi	r22, 0xDE	; 222
 3da:	7f 4f       	sbci	r23, 0xFF	; 255
 3dc:	80 e2       	ldi	r24, 0x20	; 32
 3de:	51 de       	rcall	.-862    	; 0x82 <OperationSi4700_2w>
	if(error_ind)
 3e0:	88 23       	and	r24, r24
 3e2:	e1 f4       	brne	.+56     	; 0x41c <Si4700_Channel_Seek_UP+0xb0>
		return 1;	

	//wait STC=0
	do
	{	
		error_ind = OperationSi4700_2w(READ,&(si4700_reg_data[0]), 1);
 3e4:	41 e0       	ldi	r20, 0x01	; 1
 3e6:	be 01       	movw	r22, r28
 3e8:	6f 5f       	subi	r22, 0xFF	; 255
 3ea:	7f 4f       	sbci	r23, 0xFF	; 255
 3ec:	81 e2       	ldi	r24, 0x21	; 33
 3ee:	49 de       	rcall	.-878    	; 0x82 <OperationSi4700_2w>
		if(error_ind)
 3f0:	88 23       	and	r24, r24
 3f2:	a1 f4       	brne	.+40     	; 0x41c <Si4700_Channel_Seek_UP+0xb0>
			return 1;	
		loop_counter++;
 3f4:	0f 5f       	subi	r16, 0xFF	; 255
 3f6:	1f 4f       	sbci	r17, 0xFF	; 255
		__ticks = 1;
	else if (__tmp > 65535)
		__ticks = 0;	/* i.e. 65536 */
	else
		__ticks = (uint16_t)__tmp;
 3f8:	80 e1       	ldi	r24, 0x10	; 16
 3fa:	97 e2       	ldi	r25, 0x27	; 39
 3fc:	01 97       	sbiw	r24, 0x01	; 1
 3fe:	f1 f7       	brne	.-4      	; 0x3fc <Si4700_Channel_Seek_UP+0x90>
		_delay_ms(5);
	}
 400:	89 81       	ldd	r24, Y+1	; 0x01
 402:	86 ff       	sbrs	r24, 6
 404:	03 c0       	rjmp	.+6      	; 0x40c <Si4700_Channel_Seek_UP+0xa0>
 406:	0f 3f       	cpi	r16, 0xFF	; 255
 408:	11 05       	cpc	r17, r1
 40a:	60 f3       	brcs	.-40     	; 0x3e4 <Si4700_Channel_Seek_UP+0x78>
	while(((si4700_reg_data[0]&0x40) != 0) && (loop_counter < 0xff));		
	loop_counter = 0;

	//you can read REG0A&0B for channel number or RSSI here
	error_ind = OperationSi4700_2w(READ,&(si4700_reg_data[0]), 4);	
 40c:	44 e0       	ldi	r20, 0x04	; 4
 40e:	be 01       	movw	r22, r28
 410:	6f 5f       	subi	r22, 0xFF	; 255
 412:	7f 4f       	sbci	r23, 0xFF	; 255
 414:	81 e2       	ldi	r24, 0x21	; 33
 416:	35 de       	rcall	.-918    	; 0x82 <OperationSi4700_2w>
	if(error_ind)
 418:	88 23       	and	r24, r24
 41a:	29 f0       	breq	.+10     	; 0x426 <Si4700_Channel_Seek_UP+0xba>
 41c:	21 e0       	ldi	r18, 0x01	; 1
 41e:	30 e0       	ldi	r19, 0x00	; 0
 420:	40 e0       	ldi	r20, 0x00	; 0
 422:	50 e0       	ldi	r21, 0x00	; 0
 424:	2c c0       	rjmp	.+88     	; 0x47e <__stack+0x1f>
		return 1;	
	frq=(((UINT32)si4700_reg_data[2]<<8)|(UINT32)si4700_reg_data[3])&0x03ff;
 426:	8b 81       	ldd	r24, Y+3	; 0x03
 428:	99 27       	eor	r25, r25
 42a:	aa 27       	eor	r26, r26
 42c:	bb 27       	eor	r27, r27
 42e:	22 27       	eor	r18, r18
 430:	38 2f       	mov	r19, r24
 432:	49 2f       	mov	r20, r25
 434:	5a 2f       	mov	r21, r26
 436:	8c 81       	ldd	r24, Y+4	; 0x04
 438:	99 27       	eor	r25, r25
 43a:	aa 27       	eor	r26, r26
 43c:	bb 27       	eor	r27, r27
 43e:	28 2b       	or	r18, r24
 440:	39 2b       	or	r19, r25
 442:	4a 2b       	or	r20, r26
 444:	5b 2b       	or	r21, r27
 446:	33 70       	andi	r19, 0x03	; 3
 448:	40 70       	andi	r20, 0x00	; 0
 44a:	50 70       	andi	r21, 0x00	; 0
	return frq*g_space+g_bandl;
 44c:	80 91 61 00 	lds	r24, 0x0061
 450:	e8 2e       	mov	r14, r24
 452:	ff 24       	eor	r15, r15
 454:	00 27       	eor	r16, r16
 456:	11 27       	eor	r17, r17
 458:	ca 01       	movw	r24, r20
 45a:	b9 01       	movw	r22, r18
 45c:	a8 01       	movw	r20, r16
 45e:	97 01       	movw	r18, r14
 460:	4a d2       	rcall	.+1172   	; 0x8f6 <__mulsi3>
 462:	9b 01       	movw	r18, r22
 464:	ac 01       	movw	r20, r24
 466:	80 91 66 00 	lds	r24, 0x0066
 46a:	90 91 67 00 	lds	r25, 0x0067
 46e:	a0 91 68 00 	lds	r26, 0x0068
 472:	b0 91 69 00 	lds	r27, 0x0069
 476:	28 0f       	add	r18, r24
 478:	39 1f       	adc	r19, r25
 47a:	4a 1f       	adc	r20, r26
 47c:	5b 1f       	adc	r21, r27
	//return seek_error;
	
}
 47e:	ca 01       	movw	r24, r20
 480:	b9 01       	movw	r22, r18
 482:	a2 96       	adiw	r28, 0x22	; 34
 484:	0f b6       	in	r0, 0x3f	; 63
 486:	f8 94       	cli
 488:	de bf       	out	0x3e, r29	; 62
 48a:	0f be       	out	0x3f, r0	; 63
 48c:	cd bf       	out	0x3d, r28	; 61
 48e:	df 91       	pop	r29
 490:	cf 91       	pop	r28
 492:	1f 91       	pop	r17
 494:	0f 91       	pop	r16
 496:	ff 90       	pop	r15
 498:	ef 90       	pop	r14
 49a:	08 95       	ret

0000049c <Si4700_Channel_Seek_DOWN>:


/*****************************************************************************************************

Si4700_Channel_Seek()
return 0: good, current channel is valid
return 1: I2C error 
return 2: used in SKMODE0, seek fail, no any valid channel, should end seek
return 2: used in SKMODE1, Band Limit, Stop seeking at the upper or lower band limit, should end seek
return 3: AFC rail, current channel is invalid, should seek next one

******************************************************************************************************/
UINT32 Si4700_Channel_Seek_DOWN(void)

{
 49c:	ef 92       	push	r14
 49e:	ff 92       	push	r15
 4a0:	0f 93       	push	r16
 4a2:	1f 93       	push	r17
 4a4:	cf 93       	push	r28
 4a6:	df 93       	push	r29
 4a8:	cd b7       	in	r28, 0x3d	; 61
 4aa:	de b7       	in	r29, 0x3e	; 62
 4ac:	a2 97       	sbiw	r28, 0x22	; 34
 4ae:	0f b6       	in	r0, 0x3f	; 63
 4b0:	f8 94       	cli
 4b2:	de bf       	out	0x3e, r29	; 62
 4b4:	0f be       	out	0x3f, r0	; 63
 4b6:	cd bf       	out	0x3d, r28	; 61
	unsigned short loop_counter = 0;
	unsigned char si4700_reg_data[32];
	unsigned char error_ind = 0, seek_error = 0;
	unsigned char si4700_channel_seek_start[] = {0x43};
 4b8:	83 e4       	ldi	r24, 0x43	; 67
 4ba:	89 a3       	std	Y+33, r24	; 0x21
	unsigned char si4700_channel_seek_stop[] = {0x40};
 4bc:	80 e4       	ldi	r24, 0x40	; 64
 4be:	8a a3       	std	Y+34, r24	; 0x22
	UINT32 frq;
	//set seek bit
 	error_ind = OperationSi4700_2w(WRITE,&(si4700_channel_seek_start[0]), 1);
 4c0:	41 e0       	ldi	r20, 0x01	; 1
 4c2:	be 01       	movw	r22, r28
 4c4:	6f 5d       	subi	r22, 0xDF	; 223
 4c6:	7f 4f       	sbci	r23, 0xFF	; 255
 4c8:	80 e2       	ldi	r24, 0x20	; 32
 4ca:	db dd       	rcall	.-1098   	; 0x82 <OperationSi4700_2w>
	if(error_ind)
 4cc:	88 23       	and	r24, r24
 4ce:	51 f5       	brne	.+84     	; 0x524 <Si4700_Channel_Seek_DOWN+0x88>
		return 1;

	//wait STC=1
	do
	{	
		error_ind = OperationSi4700_2w(READ,&(si4700_reg_data[0]), 1);
 4d0:	41 e0       	ldi	r20, 0x01	; 1
 4d2:	be 01       	movw	r22, r28
 4d4:	6f 5f       	subi	r22, 0xFF	; 255
 4d6:	7f 4f       	sbci	r23, 0xFF	; 255
 4d8:	81 e2       	ldi	r24, 0x21	; 33
 4da:	d3 dd       	rcall	.-1114   	; 0x82 <OperationSi4700_2w>
		if(error_ind)
 4dc:	88 23       	and	r24, r24
 4de:	11 f5       	brne	.+68     	; 0x524 <Si4700_Channel_Seek_DOWN+0x88>
		__ticks = 1;
	else if (__tmp > 65535)
		__ticks = 0;	/* i.e. 65536 */
	else
		__ticks = (uint16_t)__tmp;
 4e0:	80 e1       	ldi	r24, 0x10	; 16
 4e2:	97 e2       	ldi	r25, 0x27	; 39
 4e4:	01 97       	sbiw	r24, 0x01	; 1
 4e6:	f1 f7       	brne	.-4      	; 0x4e4 <Si4700_Channel_Seek_DOWN+0x48>
			return 1;	
		loop_counter++;
		_delay_ms(5);
		//if(loop_counter==1000)UDR=si4700_reg_data[0];
	}
 4e8:	89 81       	ldd	r24, Y+1	; 0x01
 4ea:	86 ff       	sbrs	r24, 6
 4ec:	f1 cf       	rjmp	.-30     	; 0x4d0 <Si4700_Channel_Seek_DOWN+0x34>
	while((si4700_reg_data[0]&0x40) == 0);	//for loop_counter, when seek, the loop time must > 2s		
	//while(((si4700_reg_data[0]&0x40) == 0) && (loop_counter < 0xfff));	//for loop_counter, when seek, the loop time must > 2s		
	loop_counter = 0;

	//if you use SKMODE = 0, you can check Seek Fail here
	//if you use SKMODE = 1, you can check Band Limit here
	if((si4700_reg_data[0]&0x20) != 0)
		seek_error = 2;
		
	//you can check AFC Rail here
	else if((si4700_reg_data[0]&0x10) != 0)
		seek_error = 3;

⌨️ 快捷键说明

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