Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

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

Чт янв 14, 2016 20:08:39

Спасибо, буду пробовать. Может что получится :)) .

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

Чт янв 14, 2016 20:23:30

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

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

Пт янв 15, 2016 07:11:11

Спасибо, как говориться стоит попробовать. Но для начала я думаю надо просто сделать авто поиск. И чтоб модуль что нибудь нашел и воспроизвел, ну а затем уже все остальные навороты как уровень сигнала и названия радиостанций.

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

Пт янв 15, 2016 09:00:40

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

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

Пт янв 15, 2016 10:18:03

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

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

Пт янв 15, 2016 10:34:48

Вам уже правильно сказали, что автопоиск это не самое простое.
Начните с того, что на мобильнике включите радио и посмотрите какие станции у вас принимаются с "ломовым" уровнем.
Просчитайте значение, которое надо записать в регистр с адресом 3h для настройки на желаемую станцию.
На первой странице этой темы я уже говорил как просчитать значение и выкладывал pdf на RDA5807M.
Там, кроме этого регистра, придётся ещё в несколько регистров прописать осмысленные данные.

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

Пт янв 15, 2016 11:23:26

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

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

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

Пт янв 15, 2016 11:25:09

Ясно, думал что все наоборот. :(

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

Вс янв 31, 2016 21:18:51

Благодаря этой ветке получилось в режиме автосканирования оживить данную микруху, но возникла такая проблема. При попытке считывания адресов с 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 KiB) Скачиваний: 719

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

Пн фев 01, 2016 06:15:44

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

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

Можете подсмотреть работу с шиной у меня, например. Там же в проекте, кстати, и RDA5807 есть, без автосканирования, правда.

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

Пн фев 01, 2016 08:45:31

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

Мешанина потому что вывожу на дисплей сразу и данные и код статус

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

Пн фев 01, 2016 09:19:59

Вы не подтверждаете (ACK) приём байтов, поэтому все очередные (кроме первого) тюнер и не выдаёт.

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

Пн фев 01, 2016 09:47:27

Сделал отправку АСК после приёма старшего байта данных, вроде стал нормально считываться младший байт, проверяю.

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

Пн фев 01, 2016 09:50:05

Да, всё верно, нормально считывать стал. Спасибо.
Ещё такой вопросик. не замечаете такой особенности что из-за уровня сигнала плавает громкость звука, например при уровне 21 звук тихий, при 39 громкость резко возрастает, это особенность микросхемы или в настройках что-то не включил?

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

Пн фев 01, 2016 13:03:28

Сделал регулировку громкости, вывел частоту принимаемой станции. И подтверждаю слова сказанные здесь ранее, записанная частота в регистре 0х03 является начальной точкой при автосканировании, сейчас код причешу и начну биться с перестроением приёмника на заданную частоту.

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

Сб фев 20, 2016 10:27:37

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

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

Сб фев 20, 2016 18:01:59

Разобрался оказался сломанным провод идущий от модуля к антенне, попробовал записывать данные частоты отдельно в 3 регистр, все работает, теперь управление громкостью и авто скан.

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

Пн фев 22, 2016 22:50:35

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

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

Что еще нужно сделать, что-бы микросхема перешла на указанную в регистре частоту?

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

Вт фев 23, 2016 11:54:22

Halex на этой странице дал ссылку на китайский datasheet, вобшем для обращения напрямую к регистрам задаешь адрес 22/23 запись/чтения, дальше адрес регистра 03 ну и данные 3H и 3L.

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

Вт фев 23, 2016 18:07:05

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

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

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