Выручайте RDA5807M

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Максим B, 20 июл 2016.

  1. Максим B

    Максим B Гуру

    Всем привет. Есть данный модуль RDA5807M (радио). Подключал все как по схеме - в наушниках тишина. Это уже 2-й такой модуль. Что я не так делаю? http://www.seeedstudio.com/wiki/images/8/88/RDA5807M_datasheet_v1.1.pdf . Коды брал разные - и только тишина. Может у кого-нибудь заработал данный модуль????
     
  2. ANV

    ANV Гуру

    Какая схема? Какой код?
     
  3. Максим B

    Максим B Гуру

    Схема проста: подключаю все к arduino nano (A4, A5) SDA, SCL - данные по i2c получаю. http://www.5v.ru/img-module/em5807m.jpg вот ка к на картинке. Подаю 3,3V. Антена внешняя - кусок провода 10 см. Наушники 80Ом пробовал, 32 Ома опробовал без конденсаторов - в них тишина.

    Код (Text):

    #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);
    }
     
    У людей такой работает, у меня нет. И библиотеку качал http://go.mysku.ru/?r=https://github.com/mathertel/Radio/archive/master.zip&key=ms
     
    Последнее редактирование: 20 июл 2016
  4. Максим B

    Максим B Гуру

    Код (Text):

    // 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

    double f_ini=106.2;             // Стартовая частота настройки приемника. (Изменяем на нужную).

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

    void loop()                     // Основной цикл программы
    {
      // Здесь можем написать нашу самую лучшую программу, которая будет работать так как нам нужно.
    }
     

    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.
    }
     
    Такой тоже не работает. У нас есть радио на 103,7 - менял
     
  5. ANV

    ANV Гуру

    1. По даташиту i2c должно быть на 3.3 вольта. Преобразователи уровня есть?
    2. Как понимаете что по i2c обмен нормальный? ID чипа из регистра читается?
    3. Конденсаторы для наушников не просто так ставят. Верните их :)
     
  6. ANV

    ANV Гуру

    4. Во всех примерах адрес микросхемы 0x60, а в даташите 0x10
     
  7. Максим B

    Максим B Гуру

    1. Нет нету преобразователей - напрямую с ардуино нано.
    2. i2c сканер
    3. Кондеры верну
     
  8. ANV

    ANV Гуру

    1. Лучше ими озаботиться
    2. Какой адрес видит сканер?
     
  9. Максим B

    Максим B Гуру

    I2C Scanner
    Scanning...
    I2C device found at address 0x10 !
    I2C device found at address 0x11 !
    I2C device found at address 0x60 !
    done
     
  10. массы все подключены?
     
    9xA59kK нравится это.
  11. 9xA59kK

    9xA59kK Гик

    Схему и фото выложи.
     
  12. Максим B

    Максим B Гуру

    Вечером все выложу. Массы - вроде все по схемам подключено??? На правом канале 0,40V, на левом 0,10V
     
  13. Максим B

    Максим B Гуру

    20160726_234258[1].jpg 20160726_234305[1].jpg 20160726_234313[1].jpg 20160726_234320[1].jpg 20160726_234328[1].jpg
     
  14. Максим B

    Максим B Гуру

    Ноги все звоняться, т.е. все контакты доходят до проводов и ардуины.
     
  15. 9xA59kK

    9xA59kK Гик

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

    ps\ В архиве, что ты ссылку давал , есть пример TestRDA5807M в нем частота фиксированная (автор для проверки примера сделал) 89.30 Мгерц , тебе надо изменить частоту, на какое нибудь свое эфирное радио.
    Код (C++):
    #define FIX_BAND     RADIO_BAND_FM   ///< The band that will be tuned by this sketch is FM.
    #define FIX_STATION  8930            ///<фиксированная частота радиостанции 89.30 MHz.
    #define FIX_VOLUME   4               ///< Уровень громкости  4.
     
    Последнее редактирование: 28 июл 2016
  16. 9xA59kK

    9xA59kK Гик

    Преобразователь уровней собери из пары сопротивлений (делитель напряжение) на каждый канал. В инете примеров куча.
     
    Максим B нравится это.
  17. 9xA59kK

    9xA59kK Гик

    Посмотрел даташит и немного картинок по подключению, на картинках у некоторых различается подключение. Поэтому бери даташит и сверяй ноги микросхемы с выводами на плате, а ту каритинку что ты выше выложил еще проверять надо. Еще по даташиту у этого модуля ТРИ земли. Вот по твоей картинке на 8 выводе должна быть вторая GND. На 2 левый канал, а на 3 правый(проверил по даташиту) - у тебя подписано наоборот.
     
    Последнее редактирование: 28 июл 2016
    Максим B нравится это.
  18. 9xA59kK

    9xA59kK Гик

    Лазил по даташиту и только сейчас заметил. ГДЕ у тебя подтяжка шины I2C??? По даташиту должны стоять 10 кОм на SDA и 10кОм на SCL, притянуты к +3.3V , без подтяжки возможно вообще работать не будет. На эту шину, для нормальной работы, всегда требуется подтяжка. Иногда в готовых устройствах уже установлены необходимые резисторы. На твоем модуле я подобных не заметил.
     
    Последнее редактирование: 28 июл 2016
    Максим B нравится это.
  19. Максим B

    Максим B Гуру

    Ха, вот спасибо - а ведь реально даташит отличается от картинки ((( Буду проверять.
    1. I2C сканер брал отсюда http://playground.arduino.cc/Main/I2cScanner. Выдает 3 адреса
    2. По i2c разве нужна подтяжка, если в serial идут данные или я что-то путаю и тем более в arduino уже установлены резисторы на портах???
    3. Вопрос: если на порту arduino 3,3V , тогда для чего делать делитель для 3,3V??? Или надо подавать 5V и гасить до 3,3 ??? Просто новичок в этом деле.
    4. В данном модуле нет подавления шумов??? Всегда должен быть шум или нет ?
     
  20. 9xA59kK

    9xA59kK Гик

    1.Выкини сканер, найди другой. Либо подключи шину как положено, а потом снова просканируй.
    2.Где ты увидел у себя на плате ардуино на каком то порту подтяжку, посмотри еще раз.
    3. Почитай в википедии как работает шина I2C, если у тебя ардуино работает от 3.3V, то преобразователь уровней не нужен.(возможно этот радиомодуль будет и так работать без преобразователя, но гарантий нету это на твой страх и риск, я не пробовал)
    4. Смотреть и-нет и даташит.
     
    Последнее редактирование: 28 июл 2016