Уже долгий час пытаюсь подружить Ардуинку с TDA7313 по шине I2C через библиотеку Wire. Сначала я долго не мог "инициализировать" микросхему. так как в дата шите по ней адресс указан как Chip address: 10001000 но с таким адресом связи нет с тєдєашкой. Нашел в интернете библиотеку в которой адрес был указан Код (C++): Wire.beginTransmission(0x44); // 01000100 подставил в свой код - заработала микросхема, звук пошел. Почему этот адресс, если в даташите другой? теперь пытаюсь разобраться с регулятором громкости. если посмотреть на таблицу по битам на регулировку громкости то, мне кажется, что ее можно регулировать значением от 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 бит для корректной регулировки уровня звука? и почему адресс не соответствует даташитовскому?
Посмотрев либы по ссылкам, понял что все так и делал. Немного поразмыслив, подцепил два светодиода для визуального отображения передаются ли данные, засвечивал их по результатам возврата функции Код (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; } проверяем после передачи байта данных на ошибки передачи - если их не было выходим из цикла, если были - отправляем повторно данные. ВСЕ ЗАРАБОТАЛО!!! всем спасибо.