Расчет частоты приема для RDA5807M
Re: Расчет частоты приема для RDA5807M
Спасибо, буду пробовать. Может что получится
.
Re: Расчет частоты приема для RDA5807M
(продолжу фразу), если пользоваться адресацией 0x20/0x21 (писать/читать) и (!!!) МОЖНО, если пользоваться адресацией 0x22/0x23.WiseLord писал(а):Адресовать конкретный регистр нельзя...
1. Ссыль на форум изиэлектроникс: сообщение от AlexPM двенадцатое сверху.
2. Скриншот из приложения к руководству по программированию RDA5807FP на китайском языке. Нужное выделил жёлтым, надеюсь и без перевода понятно. Полностью руководство здесь. Приложение 1 расположено на предпоследней странице.
Re: Расчет частоты приема для RDA5807M
Спасибо, как говориться стоит попробовать. Но для начала я думаю надо просто сделать авто поиск. И чтоб модуль что нибудь нашел и воспроизвел, ну а затем уже все остальные навороты как уровень сигнала и названия радиостанций.
Re: Расчет частоты приема для RDA5807M
Таки не пойму, и потому упомню банальное: "Вам шашечки - или ехать?". Зачем Вам автопоиск сразу? Вам что, совсем неизвестны частоты радиостанций в вашем регионе? Выберите наиболее мощную, которая уверенно принимается и фиксированно зашлите её в RDA. Когда мне пришла мелкая кучка радиомодулей RDA5807M с AliExpress и надо было их быстро проверить, я просто воспользовался готовым кодом (там и исходники есть) отсюда. Правда, там сам автор слегка накосячил, потому исправленный вариант от него ищите в коментах после моего замечания.111284 писал(а):Но для начала я думаю надо просто сделать авто поиск. И чтоб модуль что нибудь нашел и воспроизвел...
Кстати, на том коде я и проверил то, что описал чуть выше. В частности, реализовал регулировку громкости в самой RDA не переписыванием полностью всех регистров, а записью только конкретного. Потому смело и утверждаю, что это работает.
Re: Расчет частоты приема для RDA5807M
Хочется все токи сделать свае, да и работаю в основном с PIC контроллерами на Ассемблере
, да и как мне показалось авто поиск это самое простое решение.
- Albert_V
- Друг Кота
- Сообщения: 4119
- Зарегистрирован: Чт сен 12, 2013 00:54:12
- Откуда: ЗаМКАДье. Там, где ЦУП
Re: Расчет частоты приема для RDA5807M
Вам уже правильно сказали, что автопоиск это не самое простое.
Начните с того, что на мобильнике включите радио и посмотрите какие станции у вас принимаются с "ломовым" уровнем.
Просчитайте значение, которое надо записать в регистр с адресом 3h для настройки на желаемую станцию.
На первой странице этой темы я уже говорил как просчитать значение и выкладывал pdf на RDA5807M.
Там, кроме этого регистра, придётся ещё в несколько регистров прописать осмысленные данные.
Начните с того, что на мобильнике включите радио и посмотрите какие станции у вас принимаются с "ломовым" уровнем.
Просчитайте значение, которое надо записать в регистр с адресом 3h для настройки на желаемую станцию.
На первой странице этой темы я уже говорил как просчитать значение и выкладывал pdf на RDA5807M.
Там, кроме этого регистра, придётся ещё в несколько регистров прописать осмысленные данные.
Re: Расчет частоты приема для RDA5807M
111284 писал(а):Хочется все токи сделать свае, да и работаю в основном с PIC контроллерами на Ассемблере...
Как правило, своё - это хорошо допиленное чужое. Если пишете на Asm, да ещё "с нуля", то в первую очередь подлежит проверке I2C. Даже и чужой I2C тоже не мешает проверить. Обычно косяки начинаются уже там. Потому по алгоритмам записи/чтения регистров RDA5807M лучше для начала убедиться, что то, что "доктор прописал" действительно попало куда надо. А уж потом начинать терзать всё остальное, в т.ч. и автопоиск. Вменяемое описание регистров на русском есть на Сatcat Electronics.
Re: Расчет частоты приема для RDA5807M
Ясно, думал что все наоборот. 
Re: Расчет частоты приема для RDA5807M
Благодаря этой ветке получилось в режиме автосканирования оживить данную микруху, но возникла такая проблема. При попытке считывания адресов с 0х0А и до 0хFH, да и даже достаточно просто считать 0х0A, старший байт считывается правильно а вот младший и последующие 255. Не могу понять что не так?
Ткните носом где я накосячил.
//============== чтение всех регистров==============
// передача старта==============
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // передача состояния СТАРТ
while (!(TWCR & (1<<TWINT))); // ждём установки флага TWINT.означает что условие СТАРТ было передано
// передаём адрес чипа и бит записи======
TWDR = (RDA5807_adrr<<1)|0 ; // обращение к RDA5807 + бит записи данных
TWCR = (1<<TWINT) | (1<<TWEN); //сброс бита TWINT в регистре TWCR для передачи адреса
while (!(TWCR & (1<<TWINT))); //ждём установки флага TWINT. это означает успешную передачу, и получение ответа о успешном принятииACK/NACK.
// передаём регистр к которому обращаемся=================
TWDR = 0x0a ; // передаём адрес регистра куда будут записыватсья настройки
TWCR = (1<<TWINT) | (1<<TWEN); //сброс бита TWINT в регистре TWCR для передачи адреса
while (!(TWCR & (1<<TWINT))); //ждём установки флага TWINT. это означает успешную передачу, и получение ответа о успешном принятииACK/NACK.
// передача старта для чтение из регистров=======
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // передача состояния СТАРТ
while (!(TWCR & (1<<TWINT))); // ждём установки флага TWINT.означает что условие СТАРТ было передано
// передаём адрес чипа и бит чтения========
TWDR = (RDA5807_adrr<<1)|1 ; // чтение данных по адресу 0х10 //передача адреса чипа и бита записи данных ;
TWCR = (1<<TWINT) | (1<<TWEN); //сброс бита TWINT в регистре TWCR для передачи адреса
while (!(TWCR & (1<<TWINT))); //ждём установки флага TWINT. это означает успешную передачу, и получение ответа о успешном принятииACK/NACK.
// ======приём регистр 0Х0А байты 0AH и 0AL
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
lcd_gotoxy(0,1); // столбец, строка
display_data(TWDR) ; // выводим значение старшего байта на дисплей
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
lcd_puts(" "); // делаем 3 пробела между старшим и младшим байтом
display_data(TWDR) ; // выводим значение младшего байта на дисплей
// ======приём регистр 0Х0В байты 0ВH и 0ВL
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
// H=TWDR; // приём старшего байта
lcd_gotoxy(0,2); // столбец, строка
display_data(TWDR) ; // выводим значение на дисплей
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
//L=TWDR; // приём младшего байта
lcd_puts(" "); // делаем 3 пробела между старшим и младшим байтом
display_data(TWDR) ; // выводим значение на дисплей
// ======приём регистр 0Х0C байты 0CH и 0CL
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
// H=TWDR; // приём старшего байта
lcd_gotoxy(0,3); // столбец, строка
display_data(TWDR) ; // выводим значение на дисплей
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
//L=TWDR; // приём младшего байта
lcd_puts(" "); // делаем 3 пробела между старшим и младшим байтом
display_data(TWDR) ; // выводим значение на дисплей
// ======приём регистр 0Х0D байты 0DH и 0DL
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
// H=TWDR; // приём старшего байта
lcd_gotoxy(0,4); // столбец, строка
display_data(TWDR) ; // выводим значение на дисплей
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
//L=TWDR; // приём младшего байта
lcd_puts(" "); // делаем 3 пробела между старшим и младшим байтом
display_data(TWDR) ; // выводим значение на дисплей
// ======приём регистр 0Х0E байты 0EH и 0EL
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
// H=TWDR; // приём старшего байта
lcd_gotoxy(0,5); // столбец, строка
display_data(TWDR) ; // выводим значение на дисплей
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
//L=TWDR; // приём младшего байта
lcd_puts(" "); // делаем 3 пробела между старшим и младшим байтом
display_data(TWDR) ; // выводим значение на дисплей
// ======приём регистр 0Х0F байты 0FH и 0FL
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
// H=TWDR; // приём старшего байта
lcd_gotoxy(0,6); // столбец, строка
display_data(TWDR) ; // выводим значение на дисплей
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
//L=TWDR; // приём младшего байта
lcd_puts(" "); // делаем 3 пробела между старшим и младшим байтом
display_data(TWDR) ; // выводим значение на дисплей
//формируем состояние СТОП
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
Ткните носом где я накосячил.
//============== чтение всех регистров==============
// передача старта==============
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // передача состояния СТАРТ
while (!(TWCR & (1<<TWINT))); // ждём установки флага TWINT.означает что условие СТАРТ было передано
// передаём адрес чипа и бит записи======
TWDR = (RDA5807_adrr<<1)|0 ; // обращение к RDA5807 + бит записи данных
TWCR = (1<<TWINT) | (1<<TWEN); //сброс бита TWINT в регистре TWCR для передачи адреса
while (!(TWCR & (1<<TWINT))); //ждём установки флага TWINT. это означает успешную передачу, и получение ответа о успешном принятииACK/NACK.
// передаём регистр к которому обращаемся=================
TWDR = 0x0a ; // передаём адрес регистра куда будут записыватсья настройки
TWCR = (1<<TWINT) | (1<<TWEN); //сброс бита TWINT в регистре TWCR для передачи адреса
while (!(TWCR & (1<<TWINT))); //ждём установки флага TWINT. это означает успешную передачу, и получение ответа о успешном принятииACK/NACK.
// передача старта для чтение из регистров=======
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // передача состояния СТАРТ
while (!(TWCR & (1<<TWINT))); // ждём установки флага TWINT.означает что условие СТАРТ было передано
// передаём адрес чипа и бит чтения========
TWDR = (RDA5807_adrr<<1)|1 ; // чтение данных по адресу 0х10 //передача адреса чипа и бита записи данных ;
TWCR = (1<<TWINT) | (1<<TWEN); //сброс бита TWINT в регистре TWCR для передачи адреса
while (!(TWCR & (1<<TWINT))); //ждём установки флага TWINT. это означает успешную передачу, и получение ответа о успешном принятииACK/NACK.
// ======приём регистр 0Х0А байты 0AH и 0AL
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
lcd_gotoxy(0,1); // столбец, строка
display_data(TWDR) ; // выводим значение старшего байта на дисплей
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
lcd_puts(" "); // делаем 3 пробела между старшим и младшим байтом
display_data(TWDR) ; // выводим значение младшего байта на дисплей
// ======приём регистр 0Х0В байты 0ВH и 0ВL
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
// H=TWDR; // приём старшего байта
lcd_gotoxy(0,2); // столбец, строка
display_data(TWDR) ; // выводим значение на дисплей
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
//L=TWDR; // приём младшего байта
lcd_puts(" "); // делаем 3 пробела между старшим и младшим байтом
display_data(TWDR) ; // выводим значение на дисплей
// ======приём регистр 0Х0C байты 0CH и 0CL
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
// H=TWDR; // приём старшего байта
lcd_gotoxy(0,3); // столбец, строка
display_data(TWDR) ; // выводим значение на дисплей
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
//L=TWDR; // приём младшего байта
lcd_puts(" "); // делаем 3 пробела между старшим и младшим байтом
display_data(TWDR) ; // выводим значение на дисплей
// ======приём регистр 0Х0D байты 0DH и 0DL
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
// H=TWDR; // приём старшего байта
lcd_gotoxy(0,4); // столбец, строка
display_data(TWDR) ; // выводим значение на дисплей
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
//L=TWDR; // приём младшего байта
lcd_puts(" "); // делаем 3 пробела между старшим и младшим байтом
display_data(TWDR) ; // выводим значение на дисплей
// ======приём регистр 0Х0E байты 0EH и 0EL
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
// H=TWDR; // приём старшего байта
lcd_gotoxy(0,5); // столбец, строка
display_data(TWDR) ; // выводим значение на дисплей
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
//L=TWDR; // приём младшего байта
lcd_puts(" "); // делаем 3 пробела между старшим и младшим байтом
display_data(TWDR) ; // выводим значение на дисплей
// ======приём регистр 0Х0F байты 0FH и 0FL
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
// H=TWDR; // приём старшего байта
lcd_gotoxy(0,6); // столбец, строка
display_data(TWDR) ; // выводим значение на дисплей
TWCR = (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
//L=TWDR; // приём младшего байта
lcd_puts(" "); // делаем 3 пробела между старшим и младшим байтом
display_data(TWDR) ; // выводим значение на дисплей
//формируем состояние СТОП
TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
- Вложения
-
- 20160131_222012.jpg
- (171.34 КБ) 755 скачиваний
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Расчет частоты приема для RDA5807M
1) Дикая мешанина чтения из шины и вывода на дисплей. Отделите мух от котлет - сначала спокойно вычитайте данные целиком, а потом уже выводите.
2) Не вижу упоминаний бита подтверждения (TWEA) при приёме, а также чтения статуса регисторв I²C.
Можете подсмотреть работу с шиной у меня, например. Там же в проекте, кстати, и RDA5807 есть, без автосканирования, правда.
2) Не вижу упоминаний бита подтверждения (TWEA) при приёме, а также чтения статуса регисторв I²C.
Можете подсмотреть работу с шиной у меня, например. Там же в проекте, кстати, и RDA5807 есть, без автосканирования, правда.
Re: Расчет частоты приема для RDA5807M
коды статуса именно этого куска кода
8 -успешный старт
24-успешная передача SLA-W
40-успешная передача байта
16-успешный повторный старт
64-успешная передача SLA-R
88-принятие байта без подтверждения ведомому, принимается старший байт равный 0х46
88-принятие байта без подтверждения ведомому, принимаем младший байт равный 0хFF
Мешанина потому что вывожу на дисплей сразу и данные и код статус
8 -успешный старт
24-успешная передача SLA-W
40-успешная передача байта
16-успешный повторный старт
64-успешная передача SLA-R
88-принятие байта без подтверждения ведомому, принимается старший байт равный 0х46
88-принятие байта без подтверждения ведомому, принимаем младший байт равный 0хFF
Мешанина потому что вывожу на дисплей сразу и данные и код статус
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Расчет частоты приема для RDA5807M
Вы не подтверждаете (ACK) приём байтов, поэтому все очередные (кроме первого) тюнер и не выдаёт.
Re: Расчет частоты приема для RDA5807M
Сделал отправку АСК после приёма старшего байта данных, вроде стал нормально считываться младший байт, проверяю.
Re: Расчет частоты приема для RDA5807M
Да, всё верно, нормально считывать стал. Спасибо.
Ещё такой вопросик. не замечаете такой особенности что из-за уровня сигнала плавает громкость звука, например при уровне 21 звук тихий, при 39 громкость резко возрастает, это особенность микросхемы или в настройках что-то не включил?
Ещё такой вопросик. не замечаете такой особенности что из-за уровня сигнала плавает громкость звука, например при уровне 21 звук тихий, при 39 громкость резко возрастает, это особенность микросхемы или в настройках что-то не включил?
Re: Расчет частоты приема для RDA5807M
Сделал регулировку громкости, вывел частоту принимаемой станции. И подтверждаю слова сказанные здесь ранее, записанная частота в регистре 0х03 является начальной точкой при автосканировании, сейчас код причешу и начну биться с перестроением приёмника на заданную частоту.
Re: Расчет частоты приема для RDA5807M
Наконец пришли модули RDA5807m, начал проверять и возникла одна трудность модуль вроде как настраивается динамик шипит но уверенного приема нет, только если до коснуться до антенны рукой, хотя приемник на tda7000 ловит эту же радиостанцию на эту же антенну очень хорошо. Вот последовательность ввода данных в RDA5807M 0xD2,0x8D,0x32,0x90,0x02,0x00,0x08,0x8F,0x00 может здесь что не так. пример взял отсюда http://cxem.net/tuner/tuner84.php , частота станции 107.2.
Re: Расчет частоты приема для RDA5807M
Разобрался оказался сломанным провод идущий от модуля к антенне, попробовал записывать данные частоты отдельно в 3 регистр, все работает, теперь управление громкостью и авто скан.
Re: Расчет частоты приема для RDA5807M
Здравствуйте!
Пожалуйста подскажите, как выполняется прямой ввод частоты в данную микросхему. Я так понимаю нужно записать частоту в регистр 03. Но после записи частота не устанавливается.
Что еще нужно сделать, что-бы микросхема перешла на указанную в регистре частоту?
Пожалуйста подскажите, как выполняется прямой ввод частоты в данную микросхему. Я так понимаю нужно записать частоту в регистр 03. Но после записи частота не устанавливается.
Что еще нужно сделать, что-бы микросхема перешла на указанную в регистре частоту?
Re: Расчет частоты приема для RDA5807M
Halex на этой странице дал ссылку на китайский datasheet, вобшем для обращения напрямую к регистрам задаешь адрес 22/23 запись/чтения, дальше адрес регистра 03 ну и данные 3H и 3L.
Re: Расчет частоты приема для RDA5807M
Наверное я не совсем правильно выразился, что имеется в виду. В настоящий момент мне удалось запустить приемник, организовать автосканирование станций, вывод информации на дисплей (частота, мощность сигнала, RDS). Следующая задача - запоминание станции, что-бы при включении приемника он автоматом настраивался на ту станцию, которая была до отключения. Данные частоты я сохраняю, при включении внимаю их из ПЗУ и отправляю в приемник. Но он не хочет принимать эту частоту.
В связи с этим вопрос, что еще нужно сделать, что-бы частота установилась (возможно установить в единицу некий бит регистра).
P.S. Даташит читал.
В связи с этим вопрос, что еще нужно сделать, что-бы частота установилась (возможно установить в единицу некий бит регистра).
P.S. Даташит читал.