Ср апр 15, 2015 13:41:26
WiseLord писал(а):У RDA5807FP эти биты задействуют FMIN вход
У RDA5807M такого входа нет - число ножек микросхемы много меньше - но меня терзают смутные сомнения, что в обеих микросхемах используется один и тот же кристалл.
Так что - либо инициализируем и этот бит, отсылая все байты, либо отсылаем не всё - тогда это значение будет дефолтным.
Я изначально в своём коде отсылал только 4 байта, и всё работало замечательно. А когда решил добавить в библиотеки функции управления громкостью, что вынудило отсылать большее колчество данных по шине, столкнулся с тем, что эти биты, описанные в даташите на RDA5807FP, влияют на работоспособность и RDA5807M, хотя там они не описаны.
Ср апр 15, 2015 14:05:15
Ср апр 15, 2015 14:37:11
WiseLord писал(а):За выбора шага отвечают биты 0b000000xx регистра 03L
За выбор диапазона отвечают биты 0b0000xx00 регистра 03L
Так что лучшее, что можно от этого получить - это выбрать последний диапазон с минимальным шагом и настроиться на 73,75 МГц.
Очевидно, что на этом диапазоне можно получить максимально возможную частоту при CNAN = 0b1111111111 = 1023 => 25 * 1023 + 65000 = 90 575 кГц, то есть, с минимальным шагом 25кГц можно перекрыть диапазон шириной 1023 * 25 = 25 575 кГц.
...
Так что, в принципе, можно это программно учесть, и получить один широкий диапазон 50 000 .. 112 575 с минимальным шагом 25 кГц. Это теоретический максимум, которого можно добиться от этой микросхемы. С бОльшим шагом можно и большие частоты попробовать захватить.
Ср апр 15, 2015 14:47:54
Ср апр 15, 2015 15:13:00
Ср апр 15, 2015 15:54:43
WiseLord писал(а):То есть, для настройки на частоту, например, 99 123 МГц на диапазоне 87 000 .. 108 000 нужно записать в эти байты значение 99123 - 87000 = 12123, что соответствует 0010 1111 / 0101 1011
Чт апр 16, 2015 22:48:29
Пт апр 17, 2015 05:27:14
Чт сен 17, 2015 22:26:22
Пт сен 18, 2015 04:09:01
Пт сен 18, 2015 16:29:32
Пт сен 18, 2015 16:58:10
Пт сен 18, 2015 17:56:03
Пт сен 18, 2015 19:05:04
Пт сен 18, 2015 19:42:40
Пт сен 18, 2015 21:03:39
Вс сен 20, 2015 17:14:25
WiseLord писал(а):Алгоритм, по идее, не слишком сложный. Нижесказанное ссылается на описание битов, взятое из даташита.
Шлём по шине пачку данных:
Регистр 0 (02H):
RDA5807_DHIZ = 1 - включаем аудиовыход
RDA5807_DMUTE = 0 - отключаем режим MUTE
RDA5807_SEEKUP = 1 - поиск вверх по диапазону
RDA5807_SEEK = 1 - старт поиска
Регистр 1 (02L):
RDA5807_SKMODE = 1 - останавливаем поиск по достижении конца диапазона
RDA5807_ENABLE = 1 - включен радиомодуль
Регистр 2 (03H) - стартовая частота
Регистр 3 (03L):
Биты 7-6 - стартовая частота
RDA5807_DIRECT_MODE = 0 - режим прямого ввода частоты отключен
RDA5807_TUNE = 1 - смена частоты (RDA5807_TUNE = 0 удобно при смене только громкости)
Биты 3-2 - нужный диапазон (например, RDA5807_BAND_US_EUROPE)
Биты 1-0 - нужный шаг перестройки (например, RDA5807_SPACE_50)
Регистр 6 - (05H):
Биты 3-1 - уровень приёма (RDA5807_SEEKTH), при котором автопоиск останавливается.
Остальные биты и регистры - по необходимости.
После посылки указанного пакета тюнер начнёт автопоиск и остановится, если найдёт достаточную по уровню сигнала станцию или достигнет конца выбранного диапазона. В это время в цикле можно читать регистры, и на основании следующих данных принимать решение что делать:
Регистр 0 (0AH):
RDA5807_STC = 1 - поиск завершён
RDA5807_SF = 1 - ошибка при поиске
Биты 1-0 - текущая частота
Регистр 1 (0AL) - текущая частота
Регистр 2 (0BH):
RDA5807_RSSI (Биты 7-1) - уровень сигнала
RDA5807_FM_TRUE = 1 - на текущей частоте есть сигнал станции.
В автоматическом режиме, читая эти данные, контроллер может понять что делать - сохранить текущую частоту в память или пропустить сохранение, после чего, если конец диапазона ещё не достигнут, продолжить сканирование, начиная уже с этой частоты, если же достигнут - остановиться.
В полуавтоматическом режиме, когда решение принимает не контроллер, а человек, всё становится чуть проще - достаточно читать только текущую частоту. То есть, когда автопоиск остановился, мы либо сохраняем станцию, либо нет, после чего вычитываем текущую частоту и запускаем кнопкой новый алгоритм поиска, уже начиная с неё.
В любом случае, читать текущую найденную частоту по шине I²C необходимо, чтобы продолжить поиск. Одной записью тут не обойтись.
В своих проектах я режим автопоиска не использовал, так как эксперименты показали, что работает он не очень хорошо - пропускает некоторые станции и, наоборот, сохраняет частоты с шумами. Хотя, может быть, мне просто не повезло с условиями приёма, и в других случаях всё будет хорошо - не знаю.
Вс сен 20, 2015 17:34:59
Чт янв 14, 2016 13:53:05
Чт янв 14, 2016 14:37:05
There is no visible register address in I²C interface transfers.
The I²C interface has a fixed start register address (0x02h for write transfer and 0x0Ah for read transfer), and internal incremental address counter.