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

в 8:42, , рубрики: diy или сделай сам, I2C, Автомобильные гаджеты, автоэлектроника, реверс-инжиниринг

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

Сигнал 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 отладочных светодиода (необязательных). Микроконтроллер выковырян из ненужного устройства, поэтому долго над выбором мк я не думал.

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

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

Всё достаточно просто. Нам всего лишь нужно реализовать 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.

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

Командные байты я описал в виде структур бит, которые поместил в объединение вместе с массивом из 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();
}

Обработчик прерываний от 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 из автомагнитолы с управляемым по i2c усилителем - 5

Собираем

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

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

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

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

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

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

Выводим сигнал remote из автомагнитолы с управляемым по i2c усилителем - 8
Магнитола собрана. Заветный синий проводок

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

Автор: ElectricFromUfa

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js