Arduino - управление tda7313 и аналогами по I2S

Тема в разделе "Arduino & Shields", создана пользователем Vitalii, 15 фев 2016.

  1. Vitalii

    Vitalii Нуб

    Уже долгий час пытаюсь подружить Ардуинку с TDA7313 по шине I2C через библиотеку Wire.
    Сначала я долго не мог "инициализировать" микросхему. так как в дата шите по ней адресс указан как
    Chip address: 10001000
    но с таким адресом связи нет с тєдєашкой. Нашел в интернете библиотеку в которой адрес был указан
    Код (C++):
    Wire.beginTransmission(0x44); // 01000100
    подставил в свой код - заработала микросхема, звук пошел. Почему этот адресс, если в даташите другой?
    теперь пытаюсь разобраться с регулятором громкости.
    Volume Data.JPG
    если посмотреть на таблицу по битам на регулировку громкости то, мне кажется, что ее можно регулировать значением от 0 до 63 - в десятичной системе исчисления. значение 63 соответствует битам 00111111 - и минимальной громкости в -78,75 db, Соответственно 0 - максимальная громкость.
    написал простой кусок кода, где валкодером инкрементирую значение переменной, которую потом передаю в функцию.
    при повороте энкодера по часовой стрелке
    Код (C++):
    volByte--;
    if(volByte < 0)
    {
      volByte=0;
    }
    sendByte(volByte);
    против часовой:
    Код (C++):
    volByte++;
    if(volByte > 63)
    {
      volByte=63;
    }
    sendByte(volByte);
    функция sendByte():
    Код (C++):
    void sendByte(byte data)
    {
      Wire.beginTransmission(0x44); // TDA7313 addr 01000100
      Wire.write(data);
      Wire.endTransmission();
    }
    и вот тут начинается что то не понятное. при вращении энкодера по часовой - звук прибавляется, причем прибавляется постоянно, далее при вращении начинает регулироваться балланс, потом еще чтото... и тоже самое при вращении в противоположную сторону. В общем работа полностью не корректная.
    подскажите как же правильно передать эти 8 бит для корректной регулировки уровня звука? и почему адресс не соответствует даташитовскому?
     
  2. KamAdm

    KamAdm Нерд

    Последнее редактирование: 22 фев 2016
    Vitalii нравится это.
  3. Vitalii

    Vitalii Нуб

    Посмотрев либы по ссылкам, понял что все так и делал. Немного поразмыслив, подцепил два светодиода для визуального отображения передаются ли данные, засвечивал их по результатам возврата функции
    Код (C++):
    result = Wire.endTransmission();
    которая возвращает:
    Возвращаемые значения
    byte, байт данных, характеризующий статус передачи:
    • 0: передача успешна
    • 1: объем данных слишком велик для буфера передачи
    • 2: получен NACK при передаче адреса
    • 3: получен NACK при передаче данных
    • 4: другая ошибка
    постоянно дергался светодиод на результат 2.
    в и тоге функцию передачи данных переписал следующим образом:
    Код (C++):
    void sendByte(byte data)
    {
      while(true){
        Wire.beginTransmission(0x44); // TDA7313 7bit addr 01000100
        Wire.write(data);
        result = Wire.endTransmission();
        if(result == 0) break;
      }
      result = 10;
    }
    проверяем после передачи байта данных на ошибки передачи - если их не было выходим из цикла, если были - отправляем повторно данные.
    ВСЕ ЗАРАБОТАЛО!!! всем спасибо.
     
    KamAdm нравится это.
  4. KamAdm

    KamAdm Нерд