📄 si4700.lss
字号:
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 + -