RSS
people

Mazda MP3 Player — Продолжение 4

Итак, в предыдущей серии мы выяснили, что от нас хочет наша магнитола, теперь неплохо было бы ей сообщить о том, что мы ее поняли!

И сделаем мы это с помощью аппаратного таймера, который будет отсылать команды побитно:

  1. /*
  2.  *   Transmitt timer interrupt
  3.  */
  4. SIGNAL(MBUS_TX_SIG_INT)
  5. {
  6.   switch ( MBTProcess.bTxState )
  7.   {
  8.     case MBTS_START:
  9.       if ( MBTProcess.bSending )
  10.       {
  11.         if ( MBTProcess.bCurBit < MBTProcess.bBitsCount )
  12.         {
  13.           if ( MBTProcess.bBitsArray[ MBTProcess.bCurBit / 8 ] & ( 1 << ( 7 - ( MBTProcess.bCurBit % 8 ) ) ) )
  14.           {
  15.             MBUS_TX_TCCR = MBUS_TX_PRESCALE_256;
  16.             MBUS_TX_TCNT = MBUS_TX_TCNT_LOW_ONE;
  17.             MBTProcess.bTxState = MBTS_LOW_1;
  18.           }
  19.           else
  20.           {
  21.             MBUS_TX_TCCR = MBUS_TX_PRESCALE_256;
  22.             MBUS_TX_TCNT = MBUS_TX_TCNT_LOW_ZERRO;
  23.             MBTProcess.bTxState = MBTS_LOW_0;
  24.           }
  25.           MBUS_TX_PIN_LOW();
  26.           MBTProcess.bCurBit++;
  27.         }
  28.         else
  29.         {
  30.           MBUS_TX_PIN_HIGH();
  31.           MBUS_SEND_OFF();
  32.           MBTProcess.bTxState   = MBTS_START;
  33.           MBTProcess.bSending   = 0;
  34.           MBTProcess.bCurBit    = 0;
  35.           MBTProcess.bBitsCount = 0;
  36.           TIMSK                &= ~MBUS_TX_INT_EN;
  37.           MBUS_TX_TCCR          = 0; // MBUS_TX_PRESCALE_1;
  38.           MBUS_TX_TCNT          = 0xFF;
  39.           SWTLoad(SWT_MBUS_ANSWER_TIMER, SWT_MBUS_ANSWER_BETWEEN_PACKETS_TIMER_VAL);
  40.         }
  41.       }
  42.     break;
  43.     case MBTS_LOW_0:
  44.       MBUS_TX_TCCR = MBUS_TX_PRESCALE_256;
  45.       MBUS_TX_TCNT = MBUS_TX_TCNT_HIGH_ZERRO;
  46.       MBUS_TX_PIN_HIGH();
  47.       MBTProcess.bTxState = MBTS_START;
  48.     break;
  49.     case MBTS_LOW_1:
  50.       MBUS_TX_TCCR = MBUS_TX_PRESCALE_256;
  51.       MBUS_TX_TCNT = MBUS_TX_TCNT_HIGH_ONE;
  52.       MBUS_TX_PIN_HIGH();
  53.       MBTProcess.bTxState = MBTS_START;
  54.     break;
  55.     default:
  56.     case MBTS_END:
  57.       MBTProcess.bTxState = MBTS_START;
  58.     break;
  59.   }
  60. }

Тут уже немного побольше телодвижений, чем при приеме данных. Опять же весь процесс посылания состоит из нескольких состояний:

case MBTS_START: —  Ну тут все ясно — бит начался. Опять же проверяем, а надо ли слать, а то может и не стоит вовсе. Так же проверяем, не все ли мы уже послали. А далее смотрим, что за бит — 0 или 1. В зависимости от этого устанавливаем счетчик прерывания таким образом, что бы попасть сюда снова через точно выверенное время, которое зависит от того, что шлем в данный момент — 0 или 1. Если 0, то время, через которое мы снова будем тут — примерно 0.5 милисекунд, если 1, то — примерно 1.8 милисекунд. Общее же время бита — 3 милисекунды. Так же определяем, в какое состояние мы пойдем в следующий раз, чтобы правильно выставить оставшееся время, в течение которого пин должен быть в 1, перед посылкой следующено бита.

Время посчитали и ставим пин в 0.

case MBTS_LOW_0: и case MBTS_LOW_1: —  состояния, в которые мы попадаем, когда время, в течение которого пин находится в 0, вышло. Тут мы настраиваем наш таймер на оставшееся от всего бита время, когда пин будет находится в 1, и ставим пин в 1. А следующим состоянием будет опять MBTS_START.

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

Но естественно, сам таймер посылки у нас стартовать не будет, потому как надо знать, когда слать. Для этого служит функция MBus_SendPacket (), в которой, если есть что слать, запускается таймер:

  1. /*
  2.  *  Start transmitt process
  3.  */
  4. void MBus_SendPacket(void)
  5. {
  6.   if ( MBTProcess.bBitsCount )
  7.   {
  8.     #ifdef MBUS_SEND_DEBUG
  9.       u08 i;
  10.       u08 bNibbles;
  11.       bNibbles = MBTProcess.bBitsCount / 4 + ((MBTProcess.bBitsCount % 4) == 0 ? 0 : 1);
  12.       DEBUG_OUTP( PSTR("MBus S: |") );
  13.       for ( i = 0; i < bNibbles; i++ )
  14.       {
  15.         DEBUG_OUTP(PSTR("%X"), ((MBTProcess.bBitsArray[i / 2] >> (4 - (4 * (i%2))) ) & 0x0F) );
  16.       }
  17.       DEBUG_OUTP( PSTR("|n") );
  18.     #endif
  19.     MBTProcess.bSending = 1;
  20.     MBUS_SEND_ON();
  21.     MBTProcess.bTxState = MBTS_START;
  22.     MBTProcess.bCurBit  = 0;
  23.     MBUS_TX_TCCR  = MBUS_TX_PRESCALE_1;
  24.     MBUS_TX_TCNT  = 0xFF;
  25.     TIMSK |= MBUS_TX_INT_EN;
  26.     /*
  27.     while ( MBTProcess.bSending == 1 )
  28.     {
  29.       wdt_reset();
  30.     }
  31.     */
  32.   }
  33. }

Тут мы, определив, что нам есть, что сказать, выставляем флаг того, что мы все таки говорим, переключаем наш пин на «выход», настриваем параметры системы посылки и включаем таймер посылок, который практически тут же страбатывает, так как счетчик его мы утстановили на максимально возможное значение.

Все! Ответ ушел.

Один момент хотел бы уделить макросу переключения пина на «выход» и обратно на «вход»:

  1. // switch ports to sending mode on or off
  2. #define MBUS_SEND_ON()    sbi(MBUS_DIR, MBUS_RX_PIN); EIMSK &= ~(1 << MBUS_RX_INT);
  3. #define MBUS_SEND_OFF()   cbi(MBUS_DIR, MBUS_RX_PIN); EIMSK |=  (1 << MBUS_RX_INT); EIFR |= (1 << MBUS_RX_INT);

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

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

Вот собственно и весь процесс общения с внешним миром посредством шины M-Bus.

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

До скорого!

22 комментария к “Mazda MP3 Player — Продолжение 4”

  1. nofaith.oneid.ru/ пишет:

    Алексей, здравствуйте!

    Есть несколько вопросов по плееру и штатному ГУ Мазды.

    1. Возможно ли вместо VS1001 использовать VS1033, чтобы получить поддержку Wave-файлов и spdif выход с плеера? Потребуется ли изменение прошивки, или достаточно будет запустить VS1033 в режиме совместимости?

    2. Способно ли штатное ГУ управлять по шине M-Bus какими либо еще устройствами, кроме чейнджера. Интересует подключение к ней процессора Sony. Т.е. я хочу попробовать вывести из ГУ оптику, и отправить ее на внешний DSP. Сама настройка процессора (кроссовер, эквалайзер, временная коррекция) происходит с компьютера. Встает проблема управления процессором: нужно его включить, иметь возможность выбрать источник сигнала (оптика\аналог) и регулировать громкость.

    Спасибо! С уважением, Евгений.

  2. MasterAlexei пишет:

    Прошу прощения за поздний ответ - я тут работу менял, да отпуск на носу - так что на сайт мало захожу сейчас.

    — И так — про vaw файлы — В принципе — можно и заменить, Только проблемой встанет то, что нынешняя прошивка до того загружена задачами, что процессор будет просто не в состоянии быстро предоставит данные из vaw файла декодеру. Представьте себе, он должен будет за тот же промежуток времени прокачать в 10-11 раз больше данных. И все это по SPI интерфейсу, а их еще и считать надо ведь с диска. На данный момент прошивка еле справляется с mp3 файлами с битрейтом в 160 кБ/с. Так что тут надо не только прошивку менять, но и сам микроконтроллер, чтобы пошустрее был. Арм там какой нибудь.

    — Судя по протоколу, штатное ГУ управляет только CD-чейнджерами. Т.е. вам надо будет писать свое ПО таким образом, чтобы ГУ думало, что оно управляет CD чейнджером. А подключить уже можно будет что угодно.

  3. Евгений пишет:

    Спасибо!

    С плеером понятно. А насчет второго я наверное не полностью описал, что хочу сделать.

    Суть в том, что нужно «подружить» штатное ГУ с DSP-процессором, чтобы оно полностью им управляло: включить/выключить, выбрать источник сигнала, изменить громкость. Как я понимаю, управляющие сигналы можно получить на чейнджерном выходе, по CAN-шине, либо уже внутри головы по I2C, после чего конвертировать их в протокол процессора (в моем случае Unilink). Буду признателен, если подскажите, куда копать.

  4. MasterAlexei пишет:

    Ну тут я только про сигналы на чейнджерном выходе знаю. А про то, что в ГУ внутри делается — я даже и не ведаю.

    Насколько я понимаю, через CAN головой управлять не получится. А сама голова через CAN шлет только инфу для дисплея (я пока до туда не добрался, но в планах уже сделал пометку). А вот команды от кнопок все появляются именно на чейнджерном входе. Т.е. вам скорее всего придется сделать этакий переходник между MBus и Unilink'ом.

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

    Алексей.

  5. Евгений пишет:

    Спасибо за ответ!

    «Небольшой пультик» не совсем то, вернее совсем не то. Идея в том чтобы управление было именно с головы.

    Если я правильно понимаю, то на чейнджерном выходе присутствуют сигналы о нажатых клавишах? А они там присутствуют постоянно при наличии устройства, или только при активации внешнего входа на ГУ? Вопрос принципиальный, иначе нужно либо использовать CAN-шину, либо лезть внутрь. По сути связь должна быть односторонняя, сам процессор обратно ГУ ничего сообщать не должен. Так что вполне подходит и вариант брать информацию с CAN.

    Собственно задача сводится к тому чтобы сделать переходник MBus->Unilink или CAN->Unilink. Где от ГУ требуется сообщать устройству об изменении уровня громкости и о текущем активном режиме(радио, CD).

    Реально для этой цели использовать MBus?

    Проблема в том что я «уперся» в качество звучания штатного ГУ, а установка вместо штатного или дополнительного ГУ не выход по многим причинам.

    Евгений.

  6. MasterAlexei пишет:

    Здравствуйте, Евгений.

    По поводу звука в автомагнитоле — был замечательный топик на одном из форумов про это от форумчанина Halin. Но почему-то я не могу его найти, и некоторые топики закрыли для незарегистрированных пользователей, но что-то мне подсказывает, что это вот этот m3club.ru/forum/index.php?showtopic=22686

    Если не лень, зарегистрируйтесь там и поглядите, пожалуйса.

    Вот еще пара ссылок для наводки на эту тему:

    www.pccar.ru/showthread.php?t=5700

    www.ma3da.ru/forum/viewto...&highlight=halin

    www.ma3da.ru/forum/viewto...&highlight=halin

    В общем — рекомендую поискать на этих форумах сообщения форумчан Slider и Halin. Они много чего интересного понаделали там ;-)

    По нашей теме:

    Нажатие отдельных кнопок по MBus не отловить, так как там идут уже конкретные команды — типа — «проиграть такую-то дорожку», или «включить режим случайного проигрывания». Причем, в зависимости от режима некоторые кнопки вообще не имеют никаких функций. Я описывал уже в своих статьях случай с переключением дорожек — иногда работало, а иногда нет.

    И, соответственно, идут эти команды только тогда, когда устройство присутствует и успешно определилось головой.

    Кнопки громкости обрабатываются головой и дальше нее не идут. Т.е. на шине MBus вообще нет никакой реакции при нажатии кнопок на руле. Так что, тут либо саму голову расковыриывать, либо ловить все в CAN шине. Я пока что еще не разбирался в CAN, но если вы что нибудь найдете в этом направлении — не сочтите за труд, поделитесь со мной, и я здесь это все обнародую в рамках очередного проекта и естественно с указанием источника, т.е. вас.

    Просто есть у меня одна задумка про дисплей, но я пока что не нашел удобоваримой информации о том, какая инфа и в каком виде ходит по CAN шине между головой и дисплеем. Я пробовал связаться со Slider'ом, но видимо он сменил свой адрес Емаил.

    Заранее спасибо.

  7. bit4bit пишет:

    Привет. Очень нужна помощь. Машина Mazda6 2005 г.р. Недавно попробывал по статье mazda-axela.ru/index.php?..8&Itemid=766 сделать себе самопальный AUX. Собрал девайс, зашил, подключил к головному устройству, после пары нажатий на кнопку СД, магнитола замолчала. Кнопки ФМ1, ФМ2, АМ переключают на режим, дисплей показывает каналы и т.д., но в динамиках молчание, ни треска, ни шелеста. После отключения самопала кнопка СД вообще не реагирует. Подключаешь самопал — кнопка пищит при первом нажатии, но все также молчит. Попробовал голову без чейнджера — все. Может я в какой то режим голову перевел? Или отключил как то звук в системе? Если есть какие нибудь идеи то буду признателен. Если что мой ящик — 4vip@inbox.ru

  8. MasterAlexei пишет:

    Вот даже не знаю, чего сказать, так как если по той статье делать, то вроде как все должно работать.

    Единственно один момент — в описании ног разъема CD чейнджера, пины 8 и 16 местами перепутаны.

    Тут вот более правильный вариант:

    www.fun-electronic.net/la... -player-nachalo/

    третья картинка с низу.

    Если подключать по схеме из той статьи, то питание возьмется с сигнала включения зажигания. А я не знаю, какую нагрузку этот пин отдает.

  9. bit4bit пишет:

    Спасибо. Попробую по этой схеме. А каким образом проверить можно что ГУ увидело чейнджер (кроме как в самой работе). Нет ли сброса на заводские предустановки самой головы?

  10. MasterAlexei пишет:

    Про сброс — надо искать на форумах по мазде, например тут mazda6.ru/m/ я находил много полезного.

    Проверить что ГУ увидело чейнджер — разве что на дисплее будет написано — EX:XX где XX номер диска. Ну и звук если подать на вход, то голова должна его отрабатывать, т.е. играть должна именно то, что подается на вход и, соответственно, регулировать громкость сего.

    Кстати — еще момент — на моей по крайней мере так — чейнджер ищется при каждом включении зажигания!

    Например на соньковском ГУ — он ищется один раз при подаче общего питания. А тут вот при каждом. И если оно в очередной раз не нашло чейнджер, то проигрываются обычные CD и радио и вход отключается, ну и звук вроде как не должен пропадать у нее.

  11. bit4bit пишет:

    Т.е. ищет? Надо какие то дополнительные манипуляции совершить? А питание с головы я снимал уже не раз, пока все эти напайки перепайки осуществлял консоль приходилось снимать. Но до этого снимал — ничего не пропадало. По последнему предложению не понял «И если оно в очередной раз не нашло чейнджер, то проигрываются обычные CD и радио и вход отключается,». Вход — имеешь ввиду AUX, а обычные СД — это что? У себя в комплекте не видел. Два блока всего голова и сверху чейнджер, который мне все диски выплюнул уже по моей просьбе)))

  12. bit4bit пишет:

    А магнитола прошивается как нибудь сама?

  13. MasterAlexei пишет:

    Ищет по шине MBus. По Вашей ссылке же в схеме есть микроконтроллер, который как раз обрабатывает все запросы ГУ, и притворяется чейнджером, чтобы ГУ включило вход. Можете почитать мои статьи на эту тему, их там не так много, всего 5 штук, вроде как было.

    «В очередной раз не нашло» значит, что при очередном включении зажигания, точнее, не зажигания, а когда ключ зажигания поворачивается на одно деление (0 кажется это, точно не помню), ГУ опрашивает MBus на наличие устройств на ней. И вот, иногда мой плеер не успевает в этот момент ответить, и ГУ его не находит и думает, что его нет вовсе. И вход AUX не включается.

    Обычные CD — имел ввиду встроенный в ГУ проигрыватель CD. У всех по разному, есть и встроенный чейнджер, как у Вас и у меня а есть одиночный CD проигрыватель.

    Магнитола то может и прошивается, но я про это не в курсе.

  14. bit4bit пишет:

    Статьи читал, спасибо за выложенные труды. По ответам вопросов нет) Буду эксперементировать.

  15. bit4bit пишет:

    Не подскажите сколько должно быть на ноге ACC в разъеме вольт? У меня 5 показывает. По схеме внутренней вроде бы 12 должно быть.

  16. MasterAlexei пишет:

    Вообще то 12 вольт. У меня, по крайней мере — 12 вольт. Я еще ставил специально LM2775-05 для понижения питания. И все сигналы MBus тоже 12 вольт, если я правильно помню. По крайней мере в схеме стоит делитель :) на MBus линии. Но про сигнальные линии, я бы уточнил.

  17. bit4bit пишет:

    Спасибо. 12 Вольт и должно быть)). Транзистор сгорел на схеме, заменили, радио ожило. Попробовали подключить AUX, играет, но очень тихо. Вроде сопротивления большие стоят. Уфффффф. Ощущение как в казино, вроде пора остановится, а не хочется.

  18. MasterAlexei пишет:

    :) О. Поздравляю, что все заработало!

  19. bit4bit пишет:

    Спасибо. Только интересно, когда в режим AUX входит на дисплее надпись «RSES» высвечивается. Что это значит? Попробовали сопротивления на 56к убрать с селектора, звук погромче стал, но с шипением.

  20. MasterAlexei пишет:

    Про RSES гугль вот такое рассказывает: mazda-cx.ru/oldforum/view...php?f=17&t=3

    Пункт 7.

    Т.е. скорее всего, когда ваш «эмулятор» представляется ГУ, то он, видимо неправильный код посылает, и ГУ распознает его не как обычный CD чейнджер.

    Чего то не пойму, про какие сопротивления вы говорите. Я никаких не ставил между аудио выходом MP3 декодера и входом ГУ. Только конденсаторы-электролиты. Т.е. обычная стандартная схема включения VLSI VS1011.

  21. bit4bit пишет:

    По RSES примерно понял. Спасибо. А по сопротивлениям, схема такая разъем AUX — С — R — Селектор. Это на всех R+ L+ R- L- такая схема сопротивление на 56 к и 50V2.2 кондюр. Попробовали в обход сделать, но все равно звук тихий и с шипением. По схеме нашли вроде как дифференциальный вход. AUX кстати активировать пришлось — на один из штекеров 5 В подали тогда только RSES появился.

  22. n1bs пишет:

    Добрый день, господа!

    Появилась необходимость раскурить MBus Mazda3, точнее очень заинтересовали пины TEXT DATA & TEXT CLOCK. Может кто уже использовал их, или знает как использовать ? :) а то гугл меня скоро забанит уже. Цель — научить магнитоллу выводить ан штатный дисплей названия треков, которые принимает блютуз гарнитура, контролируемая через КАН шину.

    Кстати если еще актуально — есть наработки в управлении штатной головой, точнее текстом на экране, прям через ОБД2 разъем.

Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.