Сигнал REMOTE (напряжение 12В, которое служит для включения внешних усилителей когда включена магнитола) из современных штатных магнитол вывести не так просто. Если раньше можно было использовать ножку ST-BY микросхемы-усилителя, то теперь разработчики магнитол не используют эту ножку, потому что появились микросхемы-усилители с цифровым управлением.

Можно поискать на плате дорожки, на которых появляется напряжение тогда, когда включается магнитола, но в большинстве случаев они не подходят. Можно подключиться к питанию подсветки дисплея, вот только в этом случае усилитель может включаться незапланированно — до включения встроенного усилителя (что сопровождается щелчками в тракте) или при регулировке климата или при работе парктроника.

Попробую описать другой вариант выхода из положения на примере штатной магнитолы Swing на Skoda Octavia A7

Изучаем устройство


Оконечный усилитель — TDA7563, на него аналоговый сигнал приходит с DSP SAF7741HV.

TDA7563, как выяснилось, очень любят разработчики штатных магнитол из-за того, что микросхема имеет цифровое управление и диагностику по шине i2c, а i2c применяется в магнитолах уже очень давно. Микросхема усилителя при включении магнитолы по команде основного процессора производит тест динамиков, результат теста отдаёт по i2c — определяется обрыв/КЗ, что позволяет блоку магнитолы выдавать эти ошибки по CAN диагностическому оборудованию. В спящий режим микросхема усилителя переводится тоже командами по i2c (нога ST-BY усилителя не используется), что сильно усложняет получение сигнала REMOTE.

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

Состояние включенности габаритов и включенности зажигания магнитола получает по CAN. Обмен с кнопками руля — по CAN до блока шлюза диагностических шин, далее — по LIN до контроллера кнопок в руле.

Идея


Идея в том, чтобы на внутреннюю шину магнитолы i2c посадить ещё одно устройство на базе простого и дешёвого микроконтроллера, которое будет прикидываться микросхемой усилителя и слушать все команды, которые летят в неё от процессора магнитолы. Причём i2c позволяют нашему «шпиону» оставаться незаметным для процессора магнитолы. Встроенный усилитель будет функционировать как и прежде, а сигнал REMOTE будет формироваться микроконтроллером ровно тогда, когда магнитола будет включать свой встроенный усилитель. Данный способ подойдет для всех магнитол, в которых применена микросхема TDA7563 или совместимые с ней по протоколу обмена.

Само устройство было собрано в выходные на плате, на которой кроме микроконтроллера расположились только 3 резистора и 2 отладочных светодиода (необязательных). Микроконтроллер выковырян из ненужного устройства, поэтому долго над выбором мк я не думал.




Отлаживаем ПО контроллера


Всё достаточно просто. Нам всего лишь нужно реализовать i2c-slave с адресом как у TDA7563 (0x6C) и ждать обращений на запись. Далее нужно принять 2 Instruction byte от процессора магнитолы и их проанализировать. Интересующие биты — Standby Off в байте IB2, Unmute Rear Channels и Unmute Front Channels в байте IB1. Вообще выяснилось, что магнитола сначала выставляет бит Standby Off и с небольшой задержкой — биты Unmute Front Channels и Unmute Rear Channels.



Командные байты я описал в виде структур бит, которые поместил в объединение вместе с массивом из 2 байт, чтобы при заполнении буфера обращаться к нему побайтово, а при разборе команды иметь удобный доступ к битам:

Описание буфера приёма команд
typedef struct
{
unsigned char CD_10 :1;
unsigned char UnmuteRearChannels :1;
unsigned char UnmuteFrontChannels :1;
unsigned char RearChannelGain12db :1;
unsigned char FrontChannelGain12db :1;
unsigned char OffsetDetectionEnable :1;
unsigned char DiagnosticEnable :1;
unsigned char NotUsed1 :1;
} tIB1;

typedef struct
{
unsigned char HighEfficiencyMode_Left :1;
unsigned char HighEfficiencyMode_Right :1;
unsigned char CurrentDetectionDiagnosticEnable:1;
unsigned char LineDriverModeDiagnostic :1;
unsigned char StandbyOff :1;
unsigned char FastMuting :1;
unsigned char NotUsed1 :1;
unsigned char NotUsed2 :1;
} tIB2;

typedef union
{
struct
{
tIB1 IB1;
tIB2 IB2;
} IBs;
char Bytes[2];
} tTWI_Buff;


А так выглядит проверка команды (я проверяю биты Standby Off и Unmute Front Channels):

Код
void CheckTWIbuff(void)
{
if ((TWI_Buff.IBs.IB2.StandbyOff) && (TWI_Buff.IBs.IB1.UnmuteFrontChannels))
REMOTE_ON();
else
REMOTE_OFF();
}


Чтобы шпион не мешал чтению состояния из TDA7563, при операциях чтения из слейва будем выдавать байты = 0xFF, чтобы TDA мог в нужные моменты притягивать линию SDA к земле и шпион ему не мешал это делать.
Обработчик прерываний от i2c
#pragma vector=TWI_vect
__interrupt void TWI_ISR()
{
switch (TWSR & 0xF8)
{
//=== Передача данных
case 0xa8: // Принят свой адрес, выдана квитанция, будет выдача Data.
case 0xb8: // Выдан байт Data, получен ACK.
case 0xc0: // Выдан байт Data, получен NACK.
TWDR = 0xFF;
break;
//=== Прием данных
case 0x60: // Принят свой адрес, выдана квитанция, будет прием Data.
TWI_Buff_Idx = 0;
LED_Flash(5000);
break;
case 0x80: // Принят байт Data, выдана квитанция.
case 0x88: // Принят байт Data, не выдана квитанция.
TWI_Buff.Bytes[TWI_Buff_Idx++] = TWDR;
break;
case 0xa0: // При приеме в своем адресе был принят STOP или RESTART.
CheckTWIbuff();
break;
case 0xF8:
case 0x00:
Init_Twi();
break;
default:
break;
}

TWCR |= (1 << TWINT); // Сброс флага прерывания.
}

Весь проект можно скачать отсюда. В принципе код легко переделывается под любые мс усилителей с управлением по i2c. (встречал TDF8546, например).

Контроллер у меня спит 99% времени в режиме Power-down. Просыпается при обращении к его i2c-адресу (используется аппаратный TWI), принимает команду, анализирует её, при необходимости выдаёт 1 на вывод REMOTE_3.3, моргает вторым отладочным светодиодом (D2) и снова засыпает.

Процесс отладки:



Собираем


Когда прошивка отлажена можно приступать к сборке магнитолы.

Плату я приклеил к экрану тюнера:



Т.к. на плате у меня не было предусмотрено место для транзисторов, формирующих из REMOTE_3.3 контроллера напряжение 12В, просто взял управляемый логическим уровнем 78R12. Также добавил интегральный предохранитель N10 на 0,4А.



К i2c-шине магнитолы подключился на ногах TDA7563:


Магнитола собрана. Заветный синий проводок

Комментарии (8)


  1. alexcom
    05.06.2015 12:36

    Мне кажется, или даташит врёт: на 2 ногу в микросхему TDA7563 приходит сигнал ST-BY/MUTE…


    1. Alexeyslav
      05.06.2015 15:47

      Приходит, но во многих конструкциях не используется т.к. есть способ воздействовать на этот режим по шине I2C.


    1. ElectricFromUfa Автор
      05.06.2015 16:53

      Вы правы, и это первое что я проверил. Эта ножка для управления не задействована, все управление по i2c


  1. imwode
    05.06.2015 19:16

    Выводим сигнал remote из автомагнитолы с управляемым по i2c усилителем

    Зачем?
    Нам всего лишь нужно реализовать i2c-slave с адресом как у TDA7563 (0x6C) и ждать обращений на запись

    Зачем делать с таким же адресом? Можно просто шину слушать, не вмешиваясь в обмен магнитолы с усилителем.


    1. ElectricFromUfa Автор
      05.06.2015 19:46
      +2

      Зачем?

      Чтобы внешние усилители держать включенными только вместе с магнитолой. Для тех, кого не устраивает управление усилителями от ACC/зажигания.

      Зачем делать с таким же адресом? Можно просто шину слушать, не вмешиваясь в обмен магнитолы с усилителем.

      Чтобы просыпаться только тогда, когда идёт обращение к усилителю, а не на каждый чих на шине.


      1. imwode
        05.06.2015 21:28

        Хм, похоже, я поторопился с прослушкой шины
        www.microchip.com/forums/m388315.aspx

        Используя MSSP модуль в ПИКе (или похожий в другом МК) нельзя пассивно читать данные из шины. То есть надо либо софтовый сниффер делать, либо вот так как автор…


        1. ElectricFromUfa Автор
          05.06.2015 22:06

          ну есть несколько нюансов в моей реализации, о которых мне известно:
          — можно слушать только операции записи от мастера к слейву, операции чтения из слейва перехватить не получится (в моей задаче и не нужно)
          — шпион выдаёт аппаратно ACK на каждый байт, который мастер пишет в слейв. Если TDA отвалится от шины (выйдет из строя) процессор магнитолы будет считать что TDA отвечает на шине, но шлёт 0xFF. Как на это среагирует мастер — знает только разработчик магнитолы))
          — слейв (в данном случае TDA) имеет право задерживать выдачу ACK если сильно занят. В итоге возможна ситуация, когда мастер продолжит обмен по ACKу шпиона, хотя реальный слейв не готов принимать следующий байт. Уверен, что TDA не использует эту возможность.

          Для моей задачи все эти пункты не критичны.


          1. imwode
            05.06.2015 23:13

            Если усилок держит шину, аккнуть ее не получится. В этом-то смысле все ОК.

            Акки/Накки-то ты сам в софте генеришь. В этом смысле проблемы нет, можно сидеть на шине с адресом усилка, но действий не производить никакиъ — меня в этом плане волнует больше, не отморозится ли модуль в МК, если не передернуть правильным образом нужные регистры.