Сигнал 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 байт, чтобы при заполнении буфера обращаться к нему побайтово, а при разборе команды иметь удобный доступ к битам:
{
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):
{
if ((TWI_Buff.IBs.IB2.StandbyOff) && (TWI_Buff.IBs.IB1.UnmuteFrontChannels))
REMOTE_ON();
else
REMOTE_OFF();
}
__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:
Магнитола собрана. Заветный синий проводок
Автор: ElectricFromUfa