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

📄 si4700.lss

📁 mega8控制的fm程序(SI4700)。
💻 LSS
📖 第 1 页 / 共 5 页
字号:
 172:	9c 99       	sbic	0x13, 4	; 19
 174:	b7 cf       	rjmp	.-146    	; 0xe4 <OperationSi4700_2w+0x62>
			}
        	scl(0);
 176:	ad 98       	cbi	0x15, 5	; 21
 178:	1f 5f       	subi	r17, 0xFF	; 255
 17a:	21 96       	adiw	r28, 0x01	; 1
 17c:	11 96       	adiw	r26, 0x01	; 1
 17e:	14 17       	cp	r17, r20
 180:	08 f4       	brcc	.+2      	; 0x184 <OperationSi4700_2w+0x102>
 182:	bb cf       	rjmp	.-138    	; 0xfa <OperationSi4700_2w+0x78>
		//_delay_us(2);
	}
	

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

STOP: make sure here: SCLK = 0

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

	STOP:

	BIT_SET(DDRC,4);
 184:	a4 9a       	sbi	0x14, 4	; 20
	sda(0)
 186:	ac 98       	cbi	0x15, 4	; 21
	scl(1)
 188:	ad 9a       	sbi	0x15, 5	; 21
	sda(1)
 18a:	ac 9a       	sbi	0x15, 4	; 21
	//_delay_us(2);

	return(error);

}
 18c:	80 2f       	mov	r24, r16
 18e:	99 27       	eor	r25, r25
 190:	df 91       	pop	r29
 192:	cf 91       	pop	r28
 194:	1f 91       	pop	r17
 196:	0f 91       	pop	r16
 198:	08 95       	ret

0000019a <Si4700_Intialization>:


UINT32 g_bandl=87500,g_bandh=108000;
UINT8 g_space=100,g_vol_level=0x08;
/**************************************

Si4700_Intialization():
after initialization please make sure(FW/B15):
0x00: 0x1242
0x01: 0x080F/0A0F
0x07: 0x3C04
0x08: 0x0008
0x09: 0x0001

***************************************/
void Si4700_Intialization(void)
{
 19a:	cf 92       	push	r12
 19c:	df 92       	push	r13
 19e:	ef 92       	push	r14
 1a0:	ff 92       	push	r15
 1a2:	0f 93       	push	r16
 1a4:	1f 93       	push	r17
 1a6:	cf 93       	push	r28
 1a8:	df 93       	push	r29
 1aa:	cd b7       	in	r28, 0x3d	; 61
 1ac:	de b7       	in	r29, 0x3e	; 62
 1ae:	a8 97       	sbiw	r28, 0x28	; 40
 1b0:	0f b6       	in	r0, 0x3f	; 63
 1b2:	f8 94       	cli
 1b4:	de bf       	out	0x3e, r29	; 62
 1b6:	0f be       	out	0x3f, r0	; 63
 1b8:	cd bf       	out	0x3d, r28	; 61
	unsigned char si4700_initialization[] = {0x40,0x01,0x00,0x00,0x90,0x04,0x0c,0x18,0x00,0x20,0x81,0x00};
 1ba:	6e 01       	movw	r12, r28
 1bc:	08 94       	sec
 1be:	c1 1c       	adc	r12, r1
 1c0:	d1 1c       	adc	r13, r1
 1c2:	d6 01       	movw	r26, r12
 1c4:	ea e6       	ldi	r30, 0x6A	; 106
 1c6:	f0 e0       	ldi	r31, 0x00	; 0
 1c8:	8c e0       	ldi	r24, 0x0C	; 12
 1ca:	01 90       	ld	r0, Z+
 1cc:	0d 92       	st	X+, r0
 1ce:	81 50       	subi	r24, 0x01	; 1
 1d0:	e1 f7       	brne	.-8      	; 0x1ca <Si4700_Intialization+0x30>
	unsigned char error_ind = 0,reg_data[28]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},i;
 1d2:	3d e0       	ldi	r19, 0x0D	; 13
 1d4:	e3 2e       	mov	r14, r19
 1d6:	f1 2c       	mov	r15, r1
 1d8:	ec 0e       	add	r14, r28
 1da:	fd 1e       	adc	r15, r29
 1dc:	8c e1       	ldi	r24, 0x1C	; 28
 1de:	f7 01       	movw	r30, r14
 1e0:	11 92       	st	Z+, r1
 1e2:	8a 95       	dec	r24
 1e4:	e9 f7       	brne	.-6      	; 0x1e0 <Si4700_Intialization+0x46>
	g_vol_level=si4700_initialization[7]&0xf;
 1e6:	88 85       	ldd	r24, Y+8	; 0x08
 1e8:	8f 70       	andi	r24, 0x0F	; 15
 1ea:	80 93 60 00 	sts	0x0060, r24
	double __tmp = ((F_CPU) / 4e3) * __ms;
	if (__tmp < 1.0)
		__ticks = 1;
	else if (__tmp > 65535)
		__ticks = 0;	/* i.e. 65536 */
 1ee:	00 e0       	ldi	r16, 0x00	; 0
 1f0:	10 e0       	ldi	r17, 0x00	; 0
 1f2:	c8 01       	movw	r24, r16
 1f4:	01 97       	sbiw	r24, 0x01	; 1
 1f6:	f1 f7       	brne	.-4      	; 0x1f4 <Si4700_Intialization+0x5a>
	
	if(si4700_initialization[7]&0xc0==0x00){
		g_bandl=87500;
		g_bandh=108000;	
	}
	else if(si4700_initialization[7]&0xc0==0x40){
		g_bandl=76000;
		g_bandh=108000;	
	}
	else if(si4700_initialization[7]&0xc0==0x80){
		g_bandl=76000;
		g_bandh=90000;	
	}
	
	if(si4700_initialization[7]&0x30==0x00){
		g_space=200;	
	}
	else if(si4700_initialization[7]&0x30==0x10){
		g_space=100;	
	}
	else if(si4700_initialization[7]&0x30==0x20){
		g_space=50;	
	}
	
	
	_delay_ms(100);
	ResetSi4700_2w();
 1f8:	3b df       	rcall	.-394    	; 0x70 <ResetSi4700_2w>

	error_ind = OperationSi4700_2w(WRITE, &(si4700_initialization[0]), 12);
 1fa:	4c e0       	ldi	r20, 0x0C	; 12
 1fc:	be 01       	movw	r22, r28
 1fe:	6f 5f       	subi	r22, 0xFF	; 255
 200:	7f 4f       	sbci	r23, 0xFF	; 255
 202:	80 e2       	ldi	r24, 0x20	; 32
 204:	3e df       	rcall	.-388    	; 0x82 <OperationSi4700_2w>
	if(error_ind)
 206:	88 23       	and	r24, r24
 208:	a1 f4       	brne	.+40     	; 0x232 <Si4700_Intialization+0x98>
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 20a:	c8 01       	movw	r24, r16
 20c:	01 97       	sbiw	r24, 0x01	; 1
 20e:	f1 f7       	brne	.-4      	; 0x20c <Si4700_Intialization+0x72>
		return;

	_delay_ms(100);
/////////////////
	error_ind = OperationSi4700_2w(READ, reg_data, 26);
 210:	4a e1       	ldi	r20, 0x1A	; 26
 212:	b7 01       	movw	r22, r14
 214:	81 e2       	ldi	r24, 0x21	; 33
 216:	35 df       	rcall	.-406    	; 0x82 <OperationSi4700_2w>
	if(error_ind)
 218:	88 23       	and	r24, r24
 21a:	59 f4       	brne	.+22     	; 0x232 <Si4700_Intialization+0x98>
		return;	
	for(i=0;i<26;i++){
 21c:	98 2f       	mov	r25, r24
		while(!(UCSRA & (1<<UDRE)));//等待发送缓冲器为空
 21e:	5d 9b       	sbis	0x0b, 5	; 11
 220:	fe cf       	rjmp	.-4      	; 0x21e <Si4700_Intialization+0x84>
		UDR=reg_data[i];
 222:	f6 01       	movw	r30, r12
 224:	e9 0f       	add	r30, r25
 226:	f1 1d       	adc	r31, r1
 228:	84 85       	ldd	r24, Z+12	; 0x0c
 22a:	8c b9       	out	0x0c, r24	; 12
 22c:	9f 5f       	subi	r25, 0xFF	; 255
 22e:	9a 31       	cpi	r25, 0x1A	; 26
 230:	b0 f3       	brcs	.-20     	; 0x21e <Si4700_Intialization+0x84>
 232:	a8 96       	adiw	r28, 0x28	; 40
 234:	0f b6       	in	r0, 0x3f	; 63
 236:	f8 94       	cli
 238:	de bf       	out	0x3e, r29	; 62
 23a:	0f be       	out	0x3f, r0	; 63
 23c:	cd bf       	out	0x3d, r28	; 61
 23e:	df 91       	pop	r29
 240:	cf 91       	pop	r28
 242:	1f 91       	pop	r17
 244:	0f 91       	pop	r16
 246:	ff 90       	pop	r15
 248:	ef 90       	pop	r14
 24a:	df 90       	pop	r13
 24c:	cf 90       	pop	r12
 24e:	08 95       	ret

00000250 <Si4700_Channel_Selection>:
	}
//////////	
}

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

Si4700_Channel_Selection()

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

void Si4700_Channel_Selection(UINT32 frq)
{
 250:	af 92       	push	r10
 252:	bf 92       	push	r11
 254:	cf 92       	push	r12
 256:	df 92       	push	r13
 258:	ef 92       	push	r14
 25a:	ff 92       	push	r15
 25c:	0f 93       	push	r16
 25e:	1f 93       	push	r17
 260:	cf 93       	push	r28
 262:	df 93       	push	r29
 264:	cd b7       	in	r28, 0x3d	; 61
 266:	de b7       	in	r29, 0x3e	; 62
 268:	2b 97       	sbiw	r28, 0x0b	; 11
 26a:	0f b6       	in	r0, 0x3f	; 63
 26c:	f8 94       	cli
 26e:	de bf       	out	0x3e, r29	; 62
 270:	0f be       	out	0x3f, r0	; 63
 272:	cd bf       	out	0x3d, r28	; 61
 274:	7b 01       	movw	r14, r22
 276:	8c 01       	movw	r16, r24
	unsigned short loop_counter = 0;
 278:	cc 24       	eor	r12, r12
 27a:	dd 24       	eor	r13, r13
	
	unsigned char si4700_reg_data[4];	
	unsigned char error_ind = 0;
	unsigned char si4700_channel_start_tune[] = {0x40,0x01,0x80,0xCA};	//107.7MHz
 27c:	80 e4       	ldi	r24, 0x40	; 64
 27e:	8c 83       	std	Y+4, r24	; 0x04
 280:	44 e0       	ldi	r20, 0x04	; 4
 282:	a4 2e       	mov	r10, r20
 284:	b1 2c       	mov	r11, r1
 286:	ac 0e       	add	r10, r28
 288:	bd 1e       	adc	r11, r29
 28a:	81 e0       	ldi	r24, 0x01	; 1
 28c:	8d 83       	std	Y+5, r24	; 0x05
 28e:	80 e8       	ldi	r24, 0x80	; 128
 290:	8e 83       	std	Y+6, r24	; 0x06
 292:	8a ec       	ldi	r24, 0xCA	; 202
 294:	8f 83       	std	Y+7, r24	; 0x07
	unsigned char si4700_channel_stop_tune[] = {0x40,0x01,0x00};	
 296:	de 01       	movw	r26, r28
 298:	11 96       	adiw	r26, 0x01	; 1
 29a:	e6 e7       	ldi	r30, 0x76	; 118
 29c:	f0 e0       	ldi	r31, 0x00	; 0
 29e:	83 e0       	ldi	r24, 0x03	; 3
 2a0:	01 90       	ld	r0, Z+
 2a2:	0d 92       	st	X+, r0
 2a4:	81 50       	subi	r24, 0x01	; 1
 2a6:	e1 f7       	brne	.-8      	; 0x2a0 <Si4700_Channel_Selection+0x50>
	si4700_channel_start_tune[3]=(frq-g_bandl)/g_space;//channel
 2a8:	80 91 66 00 	lds	r24, 0x0066
 2ac:	90 91 67 00 	lds	r25, 0x0067
 2b0:	a0 91 68 00 	lds	r26, 0x0068
 2b4:	b0 91 69 00 	lds	r27, 0x0069
 2b8:	e8 1a       	sub	r14, r24
 2ba:	f9 0a       	sbc	r15, r25
 2bc:	0a 0b       	sbc	r16, r26
 2be:	1b 0b       	sbc	r17, r27
 2c0:	80 91 61 00 	lds	r24, 0x0061
 2c4:	28 2f       	mov	r18, r24
 2c6:	33 27       	eor	r19, r19
 2c8:	44 27       	eor	r20, r20
 2ca:	55 27       	eor	r21, r21
 2cc:	c8 01       	movw	r24, r16
 2ce:	b7 01       	movw	r22, r14
 2d0:	31 d3       	rcall	.+1634   	; 0x934 <__udivmodsi4>
 2d2:	f5 01       	movw	r30, r10
 2d4:	23 83       	std	Z+3, r18	; 0x03
	
	//set tune bit
 	error_ind = OperationSi4700_2w(WRITE, &(si4700_channel_start_tune[0]), 4);
 2d6:	44 e0       	ldi	r20, 0x04	; 4
 2d8:	b5 01       	movw	r22, r10
 2da:	80 e2       	ldi	r24, 0x20	; 32
 2dc:	d2 de       	rcall	.-604    	; 0x82 <OperationSi4700_2w>
	if(error_ind)
 2de:	88 23       	and	r24, r24
 2e0:	a1 f5       	brne	.+104    	; 0x34a <Si4700_Channel_Selection+0xfa>
		return;

	//wait STC=1
	do
	{	
		error_ind = OperationSi4700_2w(READ, &(si4700_reg_data[0]), 1);
 2e2:	41 e0       	ldi	r20, 0x01	; 1
 2e4:	be 01       	movw	r22, r28
 2e6:	68 5f       	subi	r22, 0xF8	; 248
 2e8:	7f 4f       	sbci	r23, 0xFF	; 255
 2ea:	81 e2       	ldi	r24, 0x21	; 33
 2ec:	ca de       	rcall	.-620    	; 0x82 <OperationSi4700_2w>
		if(error_ind)
 2ee:	88 23       	and	r24, r24
 2f0:	61 f5       	brne	.+88     	; 0x34a <Si4700_Channel_Selection+0xfa>
			return;	
		loop_counter++;
 2f2:	08 94       	sec
 2f4:	c1 1c       	adc	r12, r1
 2f6:	d1 1c       	adc	r13, r1
	}
 2f8:	88 85       	ldd	r24, Y+8	; 0x08
 2fa:	86 fd       	sbrc	r24, 6
 2fc:	04 c0       	rjmp	.+8      	; 0x306 <Si4700_Channel_Selection+0xb6>
 2fe:	ff ef       	ldi	r31, 0xFF	; 255
 300:	cf 16       	cp	r12, r31
 302:	d1 04       	cpc	r13, r1
 304:	70 f3       	brcs	.-36     	; 0x2e2 <Si4700_Channel_Selection+0x92>
	while(((si4700_reg_data[0]&0x40) == 0) && (loop_counter < 0xff));		
	loop_counter = 0;
 306:	cc 24       	eor	r12, r12
 308:	dd 24       	eor	r13, r13

	//clear tune bit
	error_ind = OperationSi4700_2w(WRITE, &(si4700_channel_stop_tune[0]), 3);
 30a:	43 e0       	ldi	r20, 0x03	; 3
 30c:	be 01       	movw	r22, r28
 30e:	6f 5f       	subi	r22, 0xFF	; 255
 310:	7f 4f       	sbci	r23, 0xFF	; 255
 312:	80 e2       	ldi	r24, 0x20	; 32
 314:	b6 de       	rcall	.-660    	; 0x82 <OperationSi4700_2w>
	if(error_ind)
 316:	88 23       	and	r24, r24
 318:	c1 f4       	brne	.+48     	; 0x34a <Si4700_Channel_Selection+0xfa>
		return;		

	//wait STC=0
	do
	{	
		error_ind = OperationSi4700_2w(READ, &(si4700_reg_data[0]), 1);
 31a:	41 e0       	ldi	r20, 0x01	; 1
 31c:	be 01       	movw	r22, r28
 31e:	68 5f       	subi	r22, 0xF8	; 248
 320:	7f 4f       	sbci	r23, 0xFF	; 255
 322:	81 e2       	ldi	r24, 0x21	; 33
 324:	ae de       	rcall	.-676    	; 0x82 <OperationSi4700_2w>
		if(error_ind)
 326:	88 23       	and	r24, r24
 328:	81 f4       	brne	.+32     	; 0x34a <Si4700_Channel_Selection+0xfa>
			return;	
	loop_counter++;
 32a:	08 94       	sec
 32c:	c1 1c       	adc	r12, r1
 32e:	d1 1c       	adc	r13, r1
	}
 330:	88 85       	ldd	r24, Y+8	; 0x08
 332:	86 ff       	sbrs	r24, 6

⌨️ 快捷键说明

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