Расчет частоты приема для RDA5807M

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
111284
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб апр 03, 2010 17:24:43

Re: Расчет частоты приема для RDA5807M

Сообщение 111284 »

Спасибо, буду пробовать. Может что получится :)) .
Аватара пользователя
Halex
Грызет канифоль
Сообщения: 281
Зарегистрирован: Пт ноя 15, 2013 20:58:23

Re: Расчет частоты приема для RDA5807M

Сообщение Halex »

WiseLord писал(а):Адресовать конкретный регистр нельзя...
(продолжу фразу), если пользоваться адресацией 0x20/0x21 (писать/читать) и (!!!) МОЖНО, если пользоваться адресацией 0x22/0x23.
1. Ссыль на форум изиэлектроникс: сообщение от AlexPM двенадцатое сверху.
2. Скриншот из приложения к руководству по программированию RDA5807FP на китайском языке. Нужное выделил жёлтым, надеюсь и без перевода понятно. Полностью руководство здесь. Приложение 1 расположено на предпоследней странице.
Изображение
111284
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб апр 03, 2010 17:24:43

Re: Расчет частоты приема для RDA5807M

Сообщение 111284 »

Спасибо, как говориться стоит попробовать. Но для начала я думаю надо просто сделать авто поиск. И чтоб модуль что нибудь нашел и воспроизвел, ну а затем уже все остальные навороты как уровень сигнала и названия радиостанций.
Аватара пользователя
Halex
Грызет канифоль
Сообщения: 281
Зарегистрирован: Пт ноя 15, 2013 20:58:23

Re: Расчет частоты приема для RDA5807M

Сообщение Halex »

111284 писал(а):Но для начала я думаю надо просто сделать авто поиск. И чтоб модуль что нибудь нашел и воспроизвел...
Таки не пойму, и потому упомню банальное: "Вам шашечки - или ехать?". Зачем Вам автопоиск сразу? Вам что, совсем неизвестны частоты радиостанций в вашем регионе? Выберите наиболее мощную, которая уверенно принимается и фиксированно зашлите её в RDA. Когда мне пришла мелкая кучка радиомодулей RDA5807M с AliExpress и надо было их быстро проверить, я просто воспользовался готовым кодом (там и исходники есть) отсюда. Правда, там сам автор слегка накосячил, потому исправленный вариант от него ищите в коментах после моего замечания.
Кстати, на том коде я и проверил то, что описал чуть выше. В частности, реализовал регулировку громкости в самой RDA не переписыванием полностью всех регистров, а записью только конкретного. Потому смело и утверждаю, что это работает.
111284
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб апр 03, 2010 17:24:43

Re: Расчет частоты приема для RDA5807M

Сообщение 111284 »

Хочется все токи сделать свае, да и работаю в основном с PIC контроллерами на Ассемблере :) , да и как мне показалось авто поиск это самое простое решение.
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: Расчет частоты приема для RDA5807M

Сообщение Albert_V »

Вам уже правильно сказали, что автопоиск это не самое простое.
Начните с того, что на мобильнике включите радио и посмотрите какие станции у вас принимаются с "ломовым" уровнем.
Просчитайте значение, которое надо записать в регистр с адресом 3h для настройки на желаемую станцию.
На первой странице этой темы я уже говорил как просчитать значение и выкладывал pdf на RDA5807M.
Там, кроме этого регистра, придётся ещё в несколько регистров прописать осмысленные данные.
Аватара пользователя
Halex
Грызет канифоль
Сообщения: 281
Зарегистрирован: Пт ноя 15, 2013 20:58:23

Re: Расчет частоты приема для RDA5807M

Сообщение Halex »

111284 писал(а):Хочется все токи сделать свае, да и работаю в основном с PIC контроллерами на Ассемблере...

Как правило, своё - это хорошо допиленное чужое. Если пишете на Asm, да ещё "с нуля", то в первую очередь подлежит проверке I2C. Даже и чужой I2C тоже не мешает проверить. Обычно косяки начинаются уже там. Потому по алгоритмам записи/чтения регистров RDA5807M лучше для начала убедиться, что то, что "доктор прописал" действительно попало куда надо. А уж потом начинать терзать всё остальное, в т.ч. и автопоиск. Вменяемое описание регистров на русском есть на Сatcat Electronics.
111284
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб апр 03, 2010 17:24:43

Re: Расчет частоты приема для RDA5807M

Сообщение 111284 »

Ясно, думал что все наоборот. :(
dimaxa
Родился
Сообщения: 7
Зарегистрирован: Вс янв 31, 2016 21:03:04
Откуда: Балаково

Re: Расчет частоты приема для RDA5807M

Сообщение dimaxa »

Благодаря этой ветке получилось в режиме автосканирования оживить данную микруху, но возникла такая проблема. При попытке считывания адресов с 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);
Вложения
20160131_222012.jpg
(171.34 КБ) 755 скачиваний
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Расчет частоты приема для RDA5807M

Сообщение WiseLord »

1) Дикая мешанина чтения из шины и вывода на дисплей. Отделите мух от котлет - сначала спокойно вычитайте данные целиком, а потом уже выводите.

2) Не вижу упоминаний бита подтверждения (TWEA) при приёме, а также чтения статуса регисторв I²C.

Можете подсмотреть работу с шиной у меня, например. Там же в проекте, кстати, и RDA5807 есть, без автосканирования, правда.
dimaxa
Родился
Сообщения: 7
Зарегистрирован: Вс янв 31, 2016 21:03:04
Откуда: Балаково

Re: Расчет частоты приема для RDA5807M

Сообщение dimaxa »

коды статуса именно этого куска кода
8 -успешный старт
24-успешная передача SLA-W
40-успешная передача байта
16-успешный повторный старт
64-успешная передача SLA-R
88-принятие байта без подтверждения ведомому, принимается старший байт равный 0х46
88-принятие байта без подтверждения ведомому, принимаем младший байт равный 0хFF

Мешанина потому что вывожу на дисплей сразу и данные и код статус
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Расчет частоты приема для RDA5807M

Сообщение WiseLord »

Вы не подтверждаете (ACK) приём байтов, поэтому все очередные (кроме первого) тюнер и не выдаёт.
dimaxa
Родился
Сообщения: 7
Зарегистрирован: Вс янв 31, 2016 21:03:04
Откуда: Балаково

Re: Расчет частоты приема для RDA5807M

Сообщение dimaxa »

Сделал отправку АСК после приёма старшего байта данных, вроде стал нормально считываться младший байт, проверяю.
dimaxa
Родился
Сообщения: 7
Зарегистрирован: Вс янв 31, 2016 21:03:04
Откуда: Балаково

Re: Расчет частоты приема для RDA5807M

Сообщение dimaxa »

Да, всё верно, нормально считывать стал. Спасибо.
Ещё такой вопросик. не замечаете такой особенности что из-за уровня сигнала плавает громкость звука, например при уровне 21 звук тихий, при 39 громкость резко возрастает, это особенность микросхемы или в настройках что-то не включил?
dimaxa
Родился
Сообщения: 7
Зарегистрирован: Вс янв 31, 2016 21:03:04
Откуда: Балаково

Re: Расчет частоты приема для RDA5807M

Сообщение dimaxa »

Сделал регулировку громкости, вывел частоту принимаемой станции. И подтверждаю слова сказанные здесь ранее, записанная частота в регистре 0х03 является начальной точкой при автосканировании, сейчас код причешу и начну биться с перестроением приёмника на заданную частоту.
111284
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб апр 03, 2010 17:24:43

Re: Расчет частоты приема для RDA5807M

Сообщение 111284 »

Наконец пришли модули RDA5807m, начал проверять и возникла одна трудность модуль вроде как настраивается динамик шипит но уверенного приема нет, только если до коснуться до антенны рукой, хотя приемник на tda7000 ловит эту же радиостанцию на эту же антенну очень хорошо. Вот последовательность ввода данных в RDA5807M 0xD2,0x8D,0x32,0x90,0x02,0x00,0x08,0x8F,0x00 может здесь что не так. пример взял отсюда http://cxem.net/tuner/tuner84.php , частота станции 107.2.
111284
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб апр 03, 2010 17:24:43

Re: Расчет частоты приема для RDA5807M

Сообщение 111284 »

Разобрался оказался сломанным провод идущий от модуля к антенне, попробовал записывать данные частоты отдельно в 3 регистр, все работает, теперь управление громкостью и авто скан.
RU4PAA
Родился
Сообщения: 4
Зарегистрирован: Пн фев 22, 2016 22:27:52

Re: Расчет частоты приема для RDA5807M

Сообщение RU4PAA »

Здравствуйте!

Пожалуйста подскажите, как выполняется прямой ввод частоты в данную микросхему. Я так понимаю нужно записать частоту в регистр 03. Но после записи частота не устанавливается.

Что еще нужно сделать, что-бы микросхема перешла на указанную в регистре частоту?
111284
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб апр 03, 2010 17:24:43

Re: Расчет частоты приема для RDA5807M

Сообщение 111284 »

Halex на этой странице дал ссылку на китайский datasheet, вобшем для обращения напрямую к регистрам задаешь адрес 22/23 запись/чтения, дальше адрес регистра 03 ну и данные 3H и 3L.
RU4PAA
Родился
Сообщения: 4
Зарегистрирован: Пн фев 22, 2016 22:27:52

Re: Расчет частоты приема для RDA5807M

Сообщение RU4PAA »

Наверное я не совсем правильно выразился, что имеется в виду. В настоящий момент мне удалось запустить приемник, организовать автосканирование станций, вывод информации на дисплей (частота, мощность сигнала, RDS). Следующая задача - запоминание станции, что-бы при включении приемника он автоматом настраивался на ту станцию, которая была до отключения. Данные частоты я сохраняю, при включении внимаю их из ПЗУ и отправляю в приемник. Но он не хочет принимать эту частоту.

В связи с этим вопрос, что еще нужно сделать, что-бы частота установилась (возможно установить в единицу некий бит регистра).

P.S. Даташит читал.
Ответить

Вернуться в «Периферия»