Приветствую, Владимир! Заказывал партию таких модулей для Ампконтрола (5 шт.), три осталось. Хочу бате сделать приемник. Не мог бы ты поправить программу под такой дисплей? https://ru.aliexpress.com/item/2-4-2-4- ... ff3511082b
МК его не особо потянет - где-то 5 кадров в секунду. Хотя с этим дисплеем я знаком - он у меня в проекте велокомпьютера задействован.
В принципе, тут большой скорости обновления экрана не нужно. Но я пока отвлекаться на это не хочу - в свободное время занят больше портированием ampcontrol на stm32.
Да, я в курсе. Слежу за ходом работ на форуме. Хотя скорее всего переделывать уже не буду. Но все же ,если захочется отвлечься, буду очень благодарен) Спасибо за твой труд
Здравствуйте, собираю тоже приемник на RDA5807, в общем то все работает, единственное RDS адекватно только при хорошем уровне сигнала. Как я понял нужна коррекция ошибок, в общем научился раскладывать полученные 4 блока данных на 26 бит, инет помог, а что дальше делать х...его знает. Очень буду признателен за помощь.
То есть, микросхема аппаратно приняла 4 блока по 26 бит (16 + 10) данных, произвела коррекцию ошибок, разложила результат в виде 4 блоков по 16 бит данных по регистрам и выставила флажок готовности RDS.
А Вы зачем-то взяли эти 4 блока готовых данных, как-то слепили из них 26 бит слово, и что-то пытаетесь из полученного битового мусора сделать.
Зачем? Просто обрабатывайте уже готовые данные. Извлекайте из этого набора в 4*16бит, например, 2 символа текста, ждите следующего, и т.д. Рано или поздно нужное слово из 8 байт будет сформировано.
Смотрите исходники. Там того кода RDS на 50 строк.
Я в общемто так и делал, но блин RDS корректно читается при уровне сигнала за 60, название станций просто выводить не интересно, а вот уже вывод RT сообщений или индикация времени куда лучше, да судя по описанию на RDA5807, может только определить наличие ошибок в первых двух блоках. Может я ошибаюсь поправьте.
В RDA5807 нет доступа к полным данным RDS. Я говорю о тех 26 битах на блок, кои 16 бит данных + 10 бит коррекции.
RDA5807 сама делает коррекцию, помещает готовый результат в регистр (всего их 4 получается для 104 бит всей посылки) и отдельно сообщает об уровне обнаруженных ошибок в отдельных (всего лишь двух) блоках. Ничего с этим поделать больше нельзя.
Выхода MPX у RDA5807 тоже нет, так что внешний декодер подцепить тоже не получится.
Ещё я игрался с Si4703 - там регистры похожие, но там есть эти регистры с уровнем ошибки для всех четырёх блоков. Но тоже - всё проделывает сам контроллер тюнера, пользователь об изначальных 26 битах не знает ничего.
Может быть немного не в тему, но всё равно спрошу.
У меня непонятки по поводу общения с RDA5807M. По даташиту она поддерживает только последовательный доступ. Запись идёт нормально, а вот с чтением затык - читает только старший байт регистра 0xA, то есть первый байт из последовательности. Вместо остальных выводятся нули - проверено цифровым осциллографом.
Попробовал недокументированный random доступ - почти та же канитель. Из любого запрашиваемого регистра читается только старший байт, идущий первым, а далее только нули:
- МК выставляет старт
- МК выдаёт адрес (0x11 для рандомного доступа) и бит R/W = 0
- 5807М выдаёт АСК (понимает значится)
- МК засылает адрес регистра
- 5807М выдаёт АСК
- МК выдаёт стоп
- МК выдаёт старт
- МК засылает адрес и R/W = 1
- МК читает старший байт (здесь всё ОК)
- МК выдаёт АСК
- МК читает младший байт (а здесь почему-то нули!)
- МК выдаёт неАСК
- МК выдаёт стоп
Использую ATTINY13A + AVR300 в качестве софтового и2ц.
100% проблема с некорректным ACK со стороны МК.
В случае с последовательным чтением (читать лучше именно так - банально быстрее выходит, а вот писать можно и порегистрово):
- МК выставляет старт
- МК выдаёт адрес (0x20 | 0x01)
- 5807М выдаёт АСК (0)
Такую последовательность удобно делать периодически (скажем, два раза в секунду), вычитывая в какой-нибудь массив. И уже из этого массива в любой момент можно забирать нужные данные (уровень сигнала, индикацию стереоприёма, RDS данные и т.п.).
[uquote="WiseLord",url="/forum/viewtopic.php?p=3465204#p3465204"]100% проблема с некорректным ACK со стороны МК.[/uquote]
На осциллограмме отчетливо видно, как после вычитки первых восьми бит данных (старший байт 0xA) 5807М отпускает линию данных, готовясь принять АСК, а МК тут же её прибивает к земле (видно единичную "иголку"). И дальше МК отпускает линию и принимает байт нулей. После этого байта 5807М уже не отпускает линию данных, никаких иголок не видно.
Я сначала и сделал последовательную вычитку в полном соответствии с описанным Вами алгоритмом, только укоротил до двух регистров, поскольку мне не требуется RDS. Ладно, буду ковырять дальше.
Нашел! Это баг в AVR300, из-за него МК после постановки первого АСК не отпускал линию данных для приёма последующих байт. То есть таки да, проблема с некорректным АСК со стороны МК. Теперь всё заработало, спасибо за наводку.
Почему-то во многих примерах на просторах интернета при инициализации 5807М проставляется флаг SOFTMUTE_EN. Из китайского даташита непонятно его назначение. Хочу сказать что он очень сильно уменьшает громкость приёма, поэтому наверное имеет смысл его не устанавливать.
Непонятно что такое SOFTBLEND_EN
А ещё устанавливают биты LNA_PORT_SEL, даже в модификации с буквой М, хотя прямо в даташите их нет.
LNA_PORT_SEL можно не устанавливать, если не трогать соответствующий регистр вообще. Если же что-то в него пишется, он обязательно должен быть установлен в определённое значение, иначе играть не будет (внутренне будет выбран другой "пустой" вход вместо FM.
LNA_PORT_SEL нельзя не тронуть - оно в регистре 0x5, где и биты регулировки громкости. Сейчас нули в LNA_PORT_SEL, приём есть, может быть из-за близости передающего центра (просачивается через паразитные ёмкости с антенны). Хотя чувствительность вообще никакая, заявленными микровольтами и не пахнет
Шум на фоне приёма, в паузах.