rda5807m+PAM8403

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Всем привет. В общем использую arduino nano v3 (A4,A5 - sda,scl)+ rda5807m+pam8403+динамик 8 Ом от ПК подключен к  PAM напрямую. По i2c модуль FM откликается  по адресу 0x60. Использовал разные скетчи- сутиация  не  меняется , т. е.  в  динамике  один  треск и шум. Антену использую - кусок провода 

mkvmaks
Offline
Зарегистрирован: 07.07.2013
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

И что? Вам нужна какая-то помощь или Вы просто довели это до нашего сведения?

А если убрать усилитель? Приёмник болтает на наушники?

А вообще, если хотите помощи, то, давайте сюда схему подключения и скетч. Иначе, разговор в пользу бедных. У меня, например, этот радио-модуль отлично работает. Усилитель у меня, правда, другой, но это не суть.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет, так не пойдёт, тут ни хрена не видно. Давайте схему и скетч.

Кстати, надеюсь, Вы его (приёмник) от 3,3 вольта кормите?

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Да, хочу помощи ). На  наушники не  пробовал, напрямую  на  8  Ом  не  заработал. 

Вот  1 из кодов котрый пользовал: 

#define  RDA5807_adrr 0x60       
#define RDA5807_SDA A4
#define RDA5807_SCL A5


#define  ARDUINO_PORT(a)        ((a<8)?PORTD:(a<14?PORTB:PORTC))
#define  ARDUINO_PIN(a)           ((a<8)?PIND:(a<14?PINB:PINC))
#define  ARDUINO_DDR(a)          ((a<8)?DDRD:(a<14?DDRB:DDRC))
#define  ARDUINO_PIN_NUM(a)  ((a<8)?a:(a<14?(a-8):(a-14)))


#define SDA_OUT_HAL(sda)     void  SDA_OUT  (void){bitSet(ARDUINO_DDR(sda), ARDUINO_PIN_NUM(sda));}    
#define SDA_IN_HAL(sda)      void  SDA_IN   (void){bitClear(ARDUINO_DDR(sda), ARDUINO_PIN_NUM(sda));} 
#define SDA_HIGHT_HAL(sda)   void  SDA_HIGHT(void){bitSet(ARDUINO_PORT(sda), ARDUINO_PIN_NUM(sda));} 
#define SDA_LOW_HAL(sda)     void  SDA_LOW  (void){bitClear(ARDUINO_PORT(sda), ARDUINO_PIN_NUM(sda));} 
#define SCL_HIGHT_HAL(scl)   void  SCL_HIGHT(void){bitSet(ARDUINO_PORT(scl), ARDUINO_PIN_NUM(scl));asm volatile ("nop");}
#define SCL_LOW_HAL(scl)     void  SCL_LOW  (void){bitClear(ARDUINO_PORT(scl), ARDUINO_PIN_NUM(scl));asm volatile ("nop");asm volatile ("nop");}
#define SCL_OUT_HAL(scl)     void  SCL_OUT  (void){bitSet(ARDUINO_DDR(scl), ARDUINO_PIN_NUM(scl));}
#define WITE_HIGHT_SDA_HAL(sda)  void WITE_HIGHT_SDA (void){loop_until_bit_is_clear(ARDUINO_PIN(sda), ARDUINO_PIN_NUM(sda));}

#define _i2c(scl,sda)  \
  SDA_OUT_HAL(sda)   \
  SDA_IN_HAL(sda)    \
  SDA_HIGHT_HAL(sda) \
  SDA_LOW_HAL(sda)   \
  SCL_HIGHT_HAL(scl) \
  SCL_LOW_HAL(scl)   \
  SCL_OUT_HAL(scl)   \
  WITE_HIGHT_SDA_HAL(sda) 
  
_i2c(RDA5807_SCL, RDA5807_SDA);

void _i2cWriteByte(byte v)           
{                                            
    SDA_OUT();                       
    for (byte i=8;i;i--)  { if (v & 0x80)   SDA_HIGHT();  else  SDA_LOW();SCL_HIGHT();  v <<=1; SCL_LOW(); }                
  SDA_IN();SDA_HIGHT(); SCL_HIGHT(); WITE_HIGHT_SDA(); SCL_LOW();        
}
   enum                                                                                 
    {
       OPERATION_SEND_START,
       OPERATION_SEND_STOP,
       OPERATION_SEND_ACK,
       OPERATION_INIT
    } I2C_OPERATION;                                                                                            


   void _i2cBusOperation(byte OperationID)        
    {                                                                                                
       switch (OperationID)                                                              
       {                                                                                            
          case  OPERATION_SEND_START:                   
             SDA_OUT(); SDA_HIGHT();SCL_HIGHT();SDA_LOW();SCL_LOW(); _i2cWriteByte(RDA5807_adrr<<1);break;                                
          case  OPERATION_SEND_STOP:                    
             SDA_OUT();    SDA_LOW();    SCL_HIGHT();    SDA_HIGHT();    SDA_IN(); break; 
          case  OPERATION_SEND_ACK:                      
             SDA_OUT();    SCL_LOW();    SDA_LOW();    SCL_HIGHT();    SCL_LOW();    SDA_IN();  break; 
          case  OPERATION_INIT:  SCL_OUT();break;  
       }  
    }



double f_ini=95.6; 

void setFrequency(double fmhz)  // Функция загрузки частоты настройки в модуль EM5807M.
{
  int  frequencyB = 4 * (fmhz * 1000000 + 225000) / 32768;
  char frequencyH = frequencyB >> 8;     // Старший байт.
  char frequencyL = frequencyB & 0XFF;   // Накладываем маску 0xFF на младший байт.
  
   _i2cBusOperation(OPERATION_SEND_START);
   _i2cWriteByte(frequencyH);
   _i2cWriteByte(frequencyL);
   _i2cWriteByte(0xB8);
   _i2cWriteByte(0x10);
   _i2cWriteByte(0x00);
   _i2cBusOperation(OPERATION_SEND_STOP);
} 

// the setup routine runs once when you press reset:
void setup() 
{
  SCL_OUT();
  setFrequency(f_ini); 
   pinMode(13, OUTPUT);
}

byte vol=0;
void loop()
{
  digitalWrite(13,HIGH);
   vol++;
  delay(300);
  digitalWrite(13,LOW);
  delay(2000);
f_ini=f_ini+0.1;
setFrequency(f_ini);
}

 

 

 

Питаю  все от USB

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mkvmaks пишет:

На  наушники не  пробовал,

Попробуйте

mkvmaks пишет:

напрямую  на  8  Ом  не  заработал. 

Жив ещё? Не удивлюсь, если нет - такую мощность из него потянуть!

mkvmaks пишет:

Питаю  все от USB

Да, хоть от ЛЭП - схему подключения в студию.

 

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Схему  нарисовал  прям  как  на  данный момент на  столе  собрано https://cloud.mail.ru/public/6B6G/5C9ceuAkj

mkvmaks
Offline
Зарегистрирован: 07.07.2013

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет, наушники можно подключать прямо к L/R выходам и земле. У наушников сопротивление гораздо больше 8 ом, а динамиком Вы приёмник здорово нагрузили.

mkvmaks
Offline
Зарегистрирован: 07.07.2013

А как быть  с  динамиком  большим??? С наушниками  сейчас попробую что-нибудь  придумать

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так, давайте всё же сначала пробовать только приёмник (чтобы не множить скорбь мира). Усилитель потом прицепите.

Для начала, возьмите вот такой простейший скетч, а то Ваш уж больно заумный.

#include <Wire.h>
#include <RDA5807M.h>

RDA5807M radio;

void setup(void) {
  Serial.begin(115200);
  Serial.print("Init result:");
  Serial.println(radio.init());
  radio.setMono(true);
  radio.setBandFrequency(RADIO_BAND_FMWORLD, 10600);
  radio.setMute(false);
  radio.setVolume(15);
}

void loop(void) {}

Библиотека здесь используется - https://github.com/mathertel/Radio

В строке 11 10600 - частота в МГц умноженная на сто (т.е. имеется в виду 106,0 у меня). Подставьте ту, которая у Вас хорошо принимается.

В сериал должно напечататься 1, если модуль нормально инициализировался и 0, если нет.

Попробуйте.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mkvmaks пишет:

А как быть  с  динамиком  большим??? С наушниками  сейчас попробую что-нибудь  придумать

Так динамик подключается к усилителю, а не к самому модулю!

Но давайте пока без услилтеля - убедимся. что радио работает. Потом будете услилитель подключать.

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Выдает надпись: Init result:   без результата

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Странно, а вот так:

#include <Wire.h>
#include <RDA5807M.h>

RDA5807M radio;

void setup(void) {
  Serial.begin(115200);
  radio.debugEnable(true);
  Serial.print("Init result:");
  Serial.println((int) radio.init());
  radio.setMono(true);
  radio.setBandFrequency(RADIO_BAND_FMWORLD, 10600);
  radio.setMute(false);
  radio.setVolume(15);
}

void loop(void) {}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Должна стать поболтливее, попробуйте.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Оопc!

Вы писали, что "По i2c модуль FM откликается  по адресу 0x60". Вы в этом точно уверены? У RDA5807М должно быть 0x11

Если так, то зайдите в файл RDA5807M.cpp библиотеки и там найдите строку 78. Она вот такая

#define I2C_INDX  0x11

Поправьте как надо и снова запустите мой последний скетч. Как запустите, скопируйте сюда всё, что скажет.

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Еще раз просканил i2c 

 

I2C Scanner

Scanning...
I2C device found at address 0x10  !
 
mkvmaks
Offline
Зарегистрирован: 07.07.2013

Если  ставлю 11   - вывод такой:

Init result:init()

radio found.
-saveRegisters()
 
mkvmaks
Offline
Зарегистрирован: 07.07.2013

Вот еще  раз просканил i2c

I2C Scanner
Scanning...
I2C device found at address 0x10  !
I2C device found at address 0x11  !
I2C device found at address 0x60  !
done
 
Scanning...
 
 
 
// int RDA5807_adrs=0x10; // I2C-Address RDA Chip for sequential Access // int RDA5807_adrr=0x11; // I2C-Address RDA Chip for random Access // int RDA5807_adrt=0x60; // I2C-Address RDA Chip for TEA5767like Access
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mkvmaks пишет:

Если  ставлю 11   - вывод такой:

Init result:init()

radio found.
-saveRegisters()
 

Так, значит модуль находится.

Потом она попадает в RDA5807M::_saveRegisters() и оттуда не выходит.

Функция эта находится в том же файле начиная со сторки 303. Она маленькая.

void RDA5807M::_saveRegisters()
{
  DEBUG_FUNC0("-saveRegisters");
  Wire.beginTransmission(I2C_SEQ);
  for (int i = 2; i <= 6; i++)
  _write16(registers[i]);
  Wire.endTransmission();
} // _saveRegisters

Попробуйте добавить в неё свою отладочную печать (потом уберёте), например, так:

void RDA5807M::_saveRegisters()
{
  DEBUG_FUNC0("-saveRegisters");
  Wire.beginTransmission(I2C_SEQ);
  Serial.println("POSLE beginTransmission");
  for (int i = 2; i <= 6; i++) {
  		_write16(registers[i]);
  		 Serial.print("I=");
  		 Serial.println(i);
  }
  Serial.println("POSLE for");
  Wire.endTransmission();
  Serial.println("PERED vyhodom");
} // _saveRegisters

Таким образом мы поймём в каком именно месте она сдыхает.

Кстати. у Вас на схеме модуль питается от 3,3В - точно так? Это важно.

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Да 3.3

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Хм, вот  что выдал 

Init result:init()
1
-_saveRegister(0x2, 0x2000)
setFrequency(10370)
-_saveRegister(0x2, 0xE009)
-_saveRegister(0x3, 0x4558)
-_saveRegister(0x5, 0x0)
-_saveRegister(0x2, 0xE009)
-_saveRegister(0x5, 0xF)

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не понял, а что

radio found.
-saveRegisters()
 
Теперь не выдаёт?
 
И те печати, что мы вставили, тоже не выдаёт?
Вы ничего не перепутали?
 
Точно?
 
И ещё, наушиники подключены? Не играет? Вы частоту 103,7 ставите. На ней у Вас что-то есть?
mkvmaks
Offline
Зарегистрирован: 07.07.2013

103,7 это радио у  нас - в библиотеке все вернуто обратно, т.е. 11 а код добавил  и  да перестал  выдавать . Причем в  serial выстреливает раз, через раз. 

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Напряжение на выходе для  научшника 0,07В

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Просто Ваше сообщение из 21 поста выглядит с одной стороны как будто всё в порядке и Вы должны слышать радио.

А с другой непонятно куда делись наши печати.

Кстати, Вы подключаете наушники? В к выходу L (или R - пофиг, я там в скетче моно поставил) а другой провод к земле? И звука нет? Провода не перепутали? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mkvmaks пишет:

Напряжение на выходе для  научшника 0,07В

Маловато. У меня до полутора доходит.

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Да,  как-то все  глюячновато  выглядит. Вижу, что  моно- да  подключаю к L,R  и провод на  GND  - напрямую  на  наушники

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, не знаю, так зочно, наверное не смогу помочь, простите.

Самое странное, что не печатает наших отладочных печатей. Дичь какая-то.

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Может дело  в  наушниках - подключаю которые 32 ома 

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Сейчас вернул все обратно как было изначально 

 

Init result:init()
1
-_saveRegister(0x2, 0x2000)
setFrequency(10370)
-_saveRegister(0x2, 0xE009)

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вшт, смотрите. После init она вернула 1 - значит вроде всё нормально инициализировалось.

Но куда делись наши печати????

Ладно, мне надо уходить. Завтра ещё подумаем.

Отпишитесь что у Вас сегодня вечером ещё получится, я завтра почитаю.

mkvmaks
Offline
Зарегистрирован: 07.07.2013

ок

maksmkv
Offline
Зарегистрирован: 07.04.2013

Звука так  и  не  добился  напрямую через наушники (((

Русл@н
Offline
Зарегистрирован: 14.04.2016

Доброго времени суток сегодня получил

Залил код из этой темы и радио прекрасно заработало.

#include <Wire.h>
#include <RDA5807M.h>

RDA5807M radio;

void setup(void) {
&nbsp; Serial.begin(115200);
&nbsp; radio.debugEnable(true);
&nbsp; Serial.print("Init result:");
&nbsp; Serial.println((int) radio.init());
&nbsp; radio.setMono(true);
&nbsp; radio.setBandFrequency(RADIO_BAND_FMWORLD, 10600);
&nbsp; radio.setMute(false);
&nbsp; radio.setVolume(15);
}

void loop(void) {}


Теперь вот думаю как дисплей по I2С прикрутить и кнопки, в стандартном примере есть вывод на дисплей. И еще заметил одну особенность или непонятку для меня:

заливаю скетч радио в ардуину, она перезагружается, начинает петь радио. Далее заливаю скетч из меню примеров с тестом дисплея, радио поет и дисплей оживает)) Вот почему предыдущий скетч не стирается?

Поможете понять что и как делать?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

И что с дисплеем? Удалось прикрутить?

Русл@н
Offline
Зарегистрирован: 14.04.2016

Со временем проблема, но все будет!

Logik
Offline
Зарегистрирован: 05.08.2014

ua6em пишет:

И что с дисплеем? Удалось прикрутить?

А чего сомниватся. Там особых проблем вроде не должно быть.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Русл@н пишет:

Доброго времени суток сегодня получил

Залил код из этой темы и радио прекрасно заработало.

Если у Вас та же быблиотека, что и у меня, то не всё там прекрасно. Попробуйте такую последовательность. Поиск станции (seekUp или seekDown), она найдёт, будет играть. После этого попробуйте установить частоту на другую станцию. На моей версии библиотеки такой фокус не проходит. После поиска установка частоты не работает.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Logik пишет:

ua6em пишет:

И что с дисплеем? Удалось прикрутить?

А чего сомниватся. Там особых проблем вроде не должно быть.

да здесь пробегал код лучшего радио всех времён и народов, но дисплей от нокиа а у меня TFT 3.2

Logik
Offline
Зарегистрирован: 05.08.2014

Нипонял, это будет радио или телевизор?  ;)

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

Дополню про это странное радио. 

Выше писалт что оно находится сразу на 3-х адресах шины. И это так.

Адрес 0х10 - записуем сразу во все регистры настройки

          0х10 - записуем в один регистры настройки

           0x60 -  странный режим, напоминает первый, но доступны не все регистры

Отсюда чехарда в понимании и реализациях. Вполне рабочая либа здесь - https://github.com/mathertel/Radio/tree/master/src

Всю не проверял, но по её мотвам делал себе прогу чтоб радио просто послушать, управляя из ардуиновского монитора. Вот она (работа с адреса 0x60 закоментирована, но вобщем тоже работала). Без либ и излишеств. 

// Programm: fm_radio_module_em5807m_rev100.ino
// Language: Arduinio C++
// Hardware: Arduino Nano 3.0 + EM5807M module with RDA5807M Chip.
// Version:  1.00
// Autor:    www.5v.ru
// Link:     www.5v.ru/start/em5807m-arduino-nano-30.htm

#include <Wire.h>               // I2C-Library

void setup()                    // Инициализация.
{
  Serial.begin(9600);
  Wire.begin();                 // Инициализация двухпроводной шины I2C.
//  setFrequency_(95.6);          // Вызываем фукнкцию загрузки частоты настройки в модуль EM5807M.
  RDA5807M_init() ;
  setFrequency(9560);
  }

void loop()                     // Основной цикл программы
{
  static signed char vol=1;
  
  if (Serial.available())
  {
   switch(byte r=Serial.read()) 
   {
    case 'N': 
    case 'n': 
    case 'Т': 
    case 'т': 
       seekUp(true,true); break;
    case 'P': 
    case 'p': 
    case 'З': 
    case 'з': 
       seekUp(false,true); break;
    case '+': setVolume(vol=min(15,vol+1));break;
    case '-': setVolume(vol=max(0,vol-1));break;
   } 
  }
}
  




void setFrequency_(double fmhz)  // Функция загрузки частоты настройки в модуль EM5807M.
{
  int  frequencyB = 4 * (fmhz * 1000000 + 225000) / 32768;
  char frequencyH = frequencyB >> 8;     // Старший байт.
  char frequencyL = frequencyB & 0XFF;   // Накладываем маску 0xFF на младший байт.
  Wire.beginTransmission(0x60);          // Адрес чипа RDA5807M
  Wire.write(frequencyH);                // Старший байт.
  Wire.write(frequencyL);                // Младший байт.
  Wire.write(0xB8);                      // 1011 1000     =Стерео
  Wire.write(0x10);                      // 0001 0000
  Wire.write((byte)0x00);                // 
  Wire.endTransmission();                // формируем I2C-Stop.
} 



// I2C-Address RDA Chip for sequential  Access
#define I2C_SEQ  0x10

// I2C-Address RDA Chip for Index  Access
#define I2C_INDX  0x11

// this chip only supports FM mode
#define FREQ_STEPS 10

#define RADIO_REG_CHIPID  0x00
#define RADIO_REG_CTRL    0x02
#define RADIO_REG_CHAN    0x03

#define RADIO_REG_CHAN_SPACE     0x0003
#define RADIO_REG_CHAN_SPACE_100 0x0000
#define RADIO_REG_CHAN_BAND      0x000C
#define RADIO_REG_CHAN_BAND_FMWORLD 0x0008
#define RADIO_REG_CHAN_TUNE   0x0010
//      RADIO_REG_CHAN_TEST   0x0020
#define RADIO_REG_CHAN_NR     0x7FC0

#define RADIO_REG_R4    0x04
#define RADIO_REG_VOL     0x05

#define RADIO_REG_CTRL_OUTPUT 0x8000
#define RADIO_REG_CTRL_UNMUTE 0x4000
#define RADIO_REG_CTRL_MONO   0x2000
#define RADIO_REG_CTRL_BASS   0x1000
#define RADIO_REG_CTRL_SEEKUP 0x0200
#define RADIO_REG_CTRL_SEEK   0x0100
#define RADIO_REG_CTRL_RDS    0x0008
#define RADIO_REG_CTRL_NEW    0x0004
#define RADIO_REG_CTRL_RESET  0x0002
#define RADIO_REG_CTRL_ENABLE 0x0001

unsigned short registers[10];

#define _freqLow 7600 // 8700 
#define _freqHigh 10800

bool RDA5807M_init() 
{
 bool result = false; // no chip found yet.

  Wire.begin();
  Wire.beginTransmission(I2C_INDX);
  result = Wire.endTransmission();
  if (result == 0) {
    result = true;

    // initialize all registers
    registers[RADIO_REG_CHIPID] = 0x5804;  
    registers[1] = 0x0000;  // 01 not used
    registers[RADIO_REG_CTRL] = (RADIO_REG_CTRL_RESET | RADIO_REG_CTRL_ENABLE);
#if (_freqLow!=8700)
   registers[RADIO_REG_CHAN] =RADIO_REG_CHAN_BAND_FMWORLD;
#endif
    registers[RADIO_REG_R4] = 0x0800;// RADIO_REG_R4_EM50;//  0x1800;  // 04 DE ? SOFTMUTE
    registers[RADIO_REG_VOL] = 0x9081; 
    // reset the chip
  Wire.beginTransmission(I2C_SEQ);
  for (int i = 2; i <= 6; i++)
  _write16(registers[i]);
  Wire.endTransmission();


    registers[RADIO_REG_CTRL] = RADIO_REG_CTRL_ENABLE;
    _saveRegister(RADIO_REG_CTRL);
  }  // if
  return(result);
} 



// Save one register back to the chip
void _saveRegister(byte regNr)
{
  Wire.beginTransmission(I2C_INDX);
  Wire.write(regNr);
  _write16(registers[regNr]);
  Wire.endTransmission();
} 

// write a register value using 2 bytes into the Wire.
void _write16(uint16_t val)
{
  Wire.write(val >> 8); Wire.write(val & 0xFF);
} 


void setFrequency(uint16_t newF) {
  uint16_t newChannel;
  uint16_t regChannel = registers[RADIO_REG_CHAN] & (RADIO_REG_CHAN_SPACE | RADIO_REG_CHAN_BAND);

  if (newF < _freqLow) newF = _freqLow;
  if (newF > _freqHigh) newF = _freqHigh;
  newChannel = (newF - _freqLow) / 10;

  regChannel += RADIO_REG_CHAN_TUNE; // enable tuning
  regChannel |= newChannel << 6;
  
  // enable output and unmute
  registers[RADIO_REG_CTRL] |= RADIO_REG_CTRL_OUTPUT | RADIO_REG_CTRL_UNMUTE | RADIO_REG_CTRL_RDS | RADIO_REG_CTRL_ENABLE; //  | RADIO_REG_CTRL_NEW
  _saveRegister(RADIO_REG_CTRL);

  registers[RADIO_REG_CHAN] = regChannel;
  _saveRegister(RADIO_REG_CHAN);

} 

void setVolume(byte vol)
{
 registers[RADIO_REG_VOL] = 0x9080 | (vol & 0x0f);
  _saveRegister(RADIO_REG_VOL);
}
  
void seekUp(bool Up, bool toNextSender) {
  // start seek mode
  if(Up)
    registers[RADIO_REG_CTRL] |= RADIO_REG_CTRL_SEEKUP;
  else
    registers[RADIO_REG_CTRL] &= (~RADIO_REG_CTRL_SEEKUP);
    
  registers[RADIO_REG_CTRL] |= RADIO_REG_CTRL_SEEK;
  _saveRegister(RADIO_REG_CTRL);

  if (! toNextSender) {
    // stop scanning right now
    registers[RADIO_REG_CTRL] &= (~RADIO_REG_CTRL_SEEK);
    _saveRegister(RADIO_REG_CTRL);
  } 
} 

 

  

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Logik пишет:

           0x60 -  странный режим, напоминает первый, но доступны не все регистры

Это режим совместимости с TEA5767

Могу дать полный даташит этого "странного радио" без секретных битов (как в некоторых даташитах). Там все три режима описаны. Только предупреждаю - он на китайском.

Logik
Offline
Зарегистрирован: 05.08.2014

Спасибо, ненадо. Режимов 0х10 и 0х11 хватает. Я не настолько радиоман, чтоб все собирать ;)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Logik пишет:

           0x60 -  странный режим, напоминает первый, но доступны не все регистры

Это режим совместимости с TEA5767

Могу дать полный даташит этого "странного радио" без секретных битов (как в некоторых даташитах). Там все три режима описаны. Только предупреждаю - он на китайском.


 

С китайского может Павел Свиридов перевести, он его бегло читает ))) если того стоит, попрошу

TFT - хочу на кухню девайс, несколько в одном, датчики всего + метеостанция + радио +wifi AP+client и всё это на Wemos D1 (esp8266)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
Logik
Offline
Зарегистрирован: 05.08.2014

В той либке что я ссылку кинул, прямо в коде, в модуле RDA5807.cpp для целей отладки в конце тоже висит некая функция с кодом приемника с RDS. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Logik пишет:

Вполне рабочая либа здесь - https://github.com/mathertel/Radio/tree/master/src

Та самая, в которой после поиска не работает установка частоты. Нужно добавить сброс бита SEEK в функцию setFrequency? Ну, или прямо в seekUp/seekDown после отгрузки регистра.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

если того стоит, попрошу

Если для меня, то не надо - с трудом, но прочитать могу.

Logik
Offline
Зарегистрирован: 05.08.2014

ЕвгенийП пишет:

Logik пишет:

Вполне рабочая либа здесь - https://github.com/mathertel/Radio/tree/master/src

Та самая, в которой после поиска не работает установка частоты. Нужно добавить сброс бита SEEK в функцию setFrequency? Ну, или прямо в seekUp/seekDown после отгрузки регистра.

Проблема не всегда есть, если устанавливаемая частота отличается (а как правило так) от требуемой а сикает в нужную сторону, то только к лучшему - частоту точней ставит.

Если проблема есть seekUp/seekDown надо вызывать с false, останавливать режим поиска. Хотя в общем логика в сбросе SEEK при установке частоты есть. В общем не критично.