5 июня 2015

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

Компьютерное железоDIY или Сделай самЗвукАвтомобильные гаджеты
Из песочницы


Сигнал 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:


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



То же самое, но уже на другой магнитоле и в видео-формате:
Теги:i2cавтоэлектроникареверс-инжинирингTDA7563atmegaавтозвук
Хабы: Компьютерное железо DIY или Сделай сам Звук Автомобильные гаджеты
+14
15,8k 46
Комментарии 8
Лучшие публикации за сутки