Всем привет. Дошли руки до этой замечательной микросхемы. Но возникла проблема - не могу считать с неё состояние. Для обмена использую I2C. Не могу понять где загвоздка. Отсылка команды происходит так:
программу управления пишу в CodeVisionAVR... Как отлаживать - ума не приложу. Микросхемы приемника нету в протеусе. Кто нить пробовал работать с si47xx?
оказалось что в начале блока считывания надо подать адрес микросхемы si4735 увеличенный на 1. В моем случае это 0xC7. На это я убил 3 дня
Вообще микросхема хитрая...
Выбор типа интерфейса осуществляется с помощью вывода GPO1. Если в момент подачи питания (вернее сразу после сброса) на этом выводе будет 1 - режим обмена данных будет двухпроводной (i2c), а если в этот момент на ноге GPO1 будет 0 () - 3-х проводной.
При интерфейсе i2c, адрес устройства задается выводом SEN. Если там 1 - адрес 0xC6 - на передачу команд в микросхему и 0хС7 - на чтение состояния, а если там 0 - адрес 0х22 - на запись и 0х23 на чтение.
мой девайс для отладки :
Микроконтроллер atmega8... si4735 спаяна на переходнике из-за того что сильно мелкая... Программа на микроконтроллер пока очень сырая. Просто две кнопки +/- частота. Десятичную точку на пока индикатор не вывожу, потом придумаю как. Сейчас ФМ диапазон и частота настройки 102,5 МГц.
Вроде бы более менее заработало. Сделал "магнитную антенну" намотав 100 витков на край ферритового стержня. Амплитудную модуляцию возле компа и моей светодиодной лампы трудно ловить, все забивает помехами, а ФМ вполне прилично работает.
//запрет автоматического распределения регистров #pragma regalloc- #define t 50 //продолжительность импульса при передачи данных на жк индикатор #define radio_adr 0xC6
unsigned char lcd_buffer[13]={ //массив для вывода на индикатор 1, //будет видно только 10 цифр 2, 3, 4, 5, 6, 7, 8, 9, 0, 11, 12, 0 };
char read_key() { char k; if (key != 100){ if (PINB.0==0){ delay_ms(10); if (PINB.0==0){ k=1; } } if (PINB.1==0){ delay_ms(10); if (PINB.1==0){ k=2; } } if (PINB.2==0){ delay_ms(50); if (PINB.2==0){ k=3; } } } if ((PINB.0==1)&&(PINB.1==1)&&(PINB.2==1)){ k=0; }
return k; }
void lcd_clr(){ for (l=0; l<14; l++){ lcd_buffer[l]=11; //заполняем весь буферный массив нулями } }
if (pos>9) pos=9; for (s=pos; s<pos+5; s++) dot[s]=0; //убираем точки с видимой части экрана if (data>9999){ lcd_buffer[pos] = data/10000; lcd_buffer[pos+1]=(data/1000)%10; lcd_buffer[pos+2]=(data/100)%10; lcd_buffer[pos+3]=(data/10)%10; lcd_buffer[pos+4]=data%10; dot[pos+5-d]=1; //точка на d символов справа } if ((data>999)&&(data<10000)){ lcd_buffer[pos]= data/1000; lcd_buffer[pos+1]=(data/100)%10; lcd_buffer[pos+2]=(data/10)%10; lcd_buffer[pos+3]=data%10; lcd_buffer[pos+4]=11; dot[pos+4-d]=1; } if ((data>99)&&(data<1000)){ lcd_buffer[pos]= data/100; lcd_buffer[pos+1]=(data/10)%10; lcd_buffer[pos+2]=data%10; lcd_buffer[pos+3]=11; lcd_buffer[pos+4]=11; dot[pos+3-d]=1; } if ((data>9)&&(data<100)){ lcd_buffer[pos]=data/10; lcd_buffer[pos+1]=data%10; lcd_buffer[pos+2]=11; lcd_buffer[pos+3]=11; lcd_buffer[pos+4]=11; dot[pos+2-d]=1; } if (data<10){ lcd_buffer[pos]=data%10; } }
void lcd_write(){ //передача на ЖК индикатор NJU6432 //PORTC.0 - DN PORTC.1=0; //CL PORTC.2=1; //CE delay_us(10); seg=1; for (i=1; i<14; i++){ temp_lcd=lcd[lcd_buffer[i-1]]; //заносим код числа во временную переменную if (dot[i]==1)temp_lcd=temp_lcd|0b01000000; //если в массиве точек указан текущий разряд - ставим точку for (n=0; n<8; n++){ PORTC.0=temp_lcd&0b00000001; // выводим в порт крайний бит текущего числа delay_us(10); PORTC.1=1; //вколючаем синхроимпульс delay_us(t); PORTC.1=0; //выключаем синхроимпульс delay_us(10); PORTC.0=0; delay_us(t); temp_lcd=temp_lcd>>1; //сдвиг вправо на 1 разряд seg++; if (seg==53){ //первая служебная тетрада for (p=0; p<4; p++){ PORTC.0=0; delay_us(10); PORTC.1=1; //вколючаем синхроимпульс delay_us(t); PORTC.1=0; //выключаем синхроимпульс delay_us(10); PORTC.0=0; delay_us(t);
Возник вопрос по существу... А какую тактовую частоту микроконтроллера лучше выбрать что бы было меньше помех радиоприему. Сейчас работает на частоте 1 МГц и как раз посредине средневолнового диапазона хорошая такая несущая... Есть вариант без сложностей выбрать 1, 2, 4 и 8 МГц. Что посоветуете?
Интересный у Вас проект! Контроллер при приёме сигнала приемником должен быть погружен в сон с отключенным тактовым генератором. Чтобы уменьшить помехи радиоприему в короткое время работы МК следует продумать монтаж. Если соберете на печатке с короткими проводниками, в том числе и к ЖКИ, то будет лучше. Пока на мекетке в длинными проводами от помех приему на АМ избавиться будет сложно.
Карма: 10
Рейтинг сообщений: 127
Зарегистрирован: Пт дек 26, 2014 20:33:38 Сообщений: 593 Откуда: Самая большая деревня. (По мнению Габриэля Гарсиа Маркеса)
Рейтинг сообщения:0
Посмотрел/послушал Ваш ролик, заметил - у Вас та же байда при перестройке частоты на УКВ (думаю что и на АМ тоже). Видимо что-то надо настроить в камне, чтобы этого не было, ведь в промышленных приемниках, сделанных на этой микросхеме, такого нет. Ковыряюсь с настройками AVC и SOFT_MUTE, пока безрезультатно.
_________________ О технике чего спорить-то, давайте попробуем.
Посмотрел/послушал Ваш ролик, заметил - у Вас та же байда при перестройке частоты на УКВ (думаю что и на АМ тоже). Видимо что-то надо настроить в камне, чтобы этого не было, ведь в промышленных приемниках, сделанных на этой микросхеме, такого нет. Ковыряюсь с настройками AVC и SOFT_MUTE, пока безрезультатно.
Да, на АМ очень сильно затихает в момент перестройки. На FM более менее нормально (станции слышно и во время перестройки). Не знаю как это побороть. На АМ вообще приходится ждать пока "выпиливает" усиление с после установки частоты. У вас ничего не получилось?
Карма: 10
Рейтинг сообщений: 127
Зарегистрирован: Пт дек 26, 2014 20:33:38 Сообщений: 593 Откуда: Самая большая деревня. (По мнению Габриэля Гарсиа Маркеса)
Рейтинг сообщения:0
Я с весны не возвращался к макетику, но скоро займусь. Промышленные радиоприемники на этой схеме вроде бы не имеют такого свойства, видимо надо играться с настройками АРУ и шумоподавителя.
_________________ О технике чего спорить-то, давайте попробуем.
Извиняюсь, что поднимаю мертвую тему. Приобрел на Али модуль с микросхемой Si4730. При подаче команды Power Up возвращает татус 0х40, то бишь ошибка. Это еще полбеды. При установке частоты в режиме FM не устанавливается бит STCINT в регистре статуса. Если просто читать статус, выдает 0х80, то есть норма. Версию чипа так же читает. Где подвох?
Зарегистрирован: Пт сен 09, 2016 18:27:15 Сообщений: 5
Рейтинг сообщения:0
Странные ныне пошли разработчики . Код писать умеют , а обычные буквари читать не хотят . Совсем читать не хотят . Силабовский чип - это по сути ФАПЧ прямого преобразования . У любого ФАПЧа - будь он цифровой или аналоговый ВСЕГДА будет " хрюк " при перестройке - для этого и нужно блокировать выход приемника . А в режиме АМ нужно еще время , чтобы эту самую АРУ правильно выставить .
Кому не нравятся слова ФАПЧ или даже УКВ - можете смело заМЯУнять на PLL и FM.
Карма: 10
Рейтинг сообщений: 127
Зарегистрирован: Пт дек 26, 2014 20:33:38 Сообщений: 593 Откуда: Самая большая деревня. (По мнению Габриэля Гарсиа Маркеса)
Рейтинг сообщения:0
Т.е. величина Хрюка постоянная и не регулируемая и сделать его менее заметным никак нельзя? И все настройки, предоставляемые разработчиками микросхемы бесполезны в этом деле? Кстати, интересно, как идёт перестройка частоты при малых приращениях - неужели происходит огромное переколебание в контуре ФАПЧ при перестройке частоты скажем с 5000 кГц до 5001 кГц (именно так я шагаю по диапазону). Я считал, что это должен быть достаточно незаметный Хрюк и если придавить АРУ, можно будет добиться приемлемымых результатов, когда перепад уровней будет зависеть только от самого сигнала, а не от действия АРУ. Видимо я был не прав, не понимая сути работы этой микросхемы. Жаль, придётся отказаться от её применения.
_________________ О технике чего спорить-то, давайте попробуем.
si47xx_reset(); cmd[0] = POWER_UP; // The device is being powered up in FM RX mode. cmd[1] = POWER_UP_IN_CTSIEN|POWER_UP_IN_FUNC_FMRX|0x10 ; // The opmode needs to be set to analog mode cmd[2] = POWER_UP_IN_OPMODE_RX_ANALOG; // Powerup the device while(!si47xx_waitForCTS()); i2c_Restart(); i2c_SendByte(0xc6); if(i2c_ReadAcknowledge()) return; i2c_PutString(cmd,3); i2c_Stop(); while(!si47xx_waitForCTS());
// If the calling function would like to have results then read them.
DelayMs(POWERUP_TIME); // wait for si47xx to powerup DelayMs(200); DelayMs(200);
Короче, разобрался, дело было в параметре REFCLK_FREQ, вместо значения ещё раз передавался адрес REFCLK_FREQ. Записал значение по умолчанию, 0x8000, Прерывания появились. Да, команда fmTuneFreq(frequency) это команда 0x20
Силабовский чип - это по сути ФАПЧ прямого преобразования . У любого ФАПЧа - будь он цифровой или аналоговый ВСЕГДА будет " хрюк " при перестройке - для этого и нужно блокировать выход приемника
Чириканье прослушивается тогда, когда неправильно выбраны параметры ФНЧ в петле ФАПЧ. Правильно сконструированный синтезатор издает настолько короткое "чик-чирик", что ничего приглушать не нужно.
У меня вопрос к pooh007 и dadigor. Как ведет себя SI4735 при расстройке на 50-100 килогерц от частоты FM радиостанции, то есть при неточной настройке на частоту? Прослушивается ли громкий скрежет, хрипы, скрипы? Смакетировал я себе DSP приемник на китайской микросхеме схожей с SI4735, уж больной она скрипит когда настраиваешься, аж уши отваливаются. При точной настройке все нормально, а чуть в стороне по частоте жутко верещит.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения