athlon64 0 23 мая, 2015 Опубликовано 23 мая, 2015 · Жалоба Приветствую всех Делаю устройство на atmega8, которое подключается к шине i2c автомагнитолы и являясь i2c-слейвом, перехватывает команды включения/выключения встроенного усилителя на TDA7563. i2c в магнитоле 3,3-вольтовая. Так вот, атмегу запрограммировал, она исправна, тактируется от внутреннего генератора 1МГц. Использую аппаратный TWI, i2c адрес установил как у TDA, но столкнулся в внезапной проблемой. Подключаю свою плату к SDA, SCL и GND магнитолы и шина магнитолы перестаёт работать, т.к. уровень на SDA, SCL держится в районе нуля. Сама атмега не запитана (пробовал и запитывать), т.е. VCC в воздухе. При отключении GND магнитолы от атмеги, работа шины восстанавливается, а на GND атмеги напряжение ~3В. Плата атмеги простейшая, стабилизатора нет (планирую питаться от 3,3В магнитолы, есть только 2 отладочных LED и всё. КЗ между SDA, SCL и GND атмеги нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jury093 2 23 мая, 2015 Опубликовано 23 мая, 2015 · Жалоба КЗ между SDA, SCL и GND атмеги нет. отключите от магнитолы атмегу и запитайте ее с контролем на светиках, что мега запустилась. потом измерьте уровни напряжения на контактах i2c меги, временно подключив подтяжки шины возьмите вторую мегу или что-то другое в качестве мастера и проверьте - работает ли ваш слейв.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
athlon64 0 23 мая, 2015 Опубликовано 23 мая, 2015 (изменено) · Жалоба В общем выяснилось, что была ошибка в обработчике прерывания от TWI, неправильно разбирался регистр TWSR, из-за чего автомат TWI оказывался в непонятном состоянии. Для магнитолы это выглядело как 0 на SDA и включаться она отказывалась. Теперь другая проблема - атмега не фиксирует обращений по i2c-адресу TDA7563 (0x6C). Пока разбираюсь.. На случай если кому то будет интересно глянуть: Инициализация TWI: void Init_Twi(void) { __disable_interrupt(); TWAR = 0x6C << 1; TWCR |= (1 << TWEN) | (1 << TWIE) | (1 << TWEA); __enable_interrupt(); } Обработчик: #pragma vector=TWI_vect __interrupt void TWI_ISR() { LED_Flash(5); switch (TWSR & 0xF8) { //=== Передача данных case 0xa8: // Принят свой адрес, будет выдача Data. case 0xb8: // Выдан байт Data, получен ACK. case 0xc0: // Выдан байт Data, получен NACK. TWDR = 0xFF; break; //=== Прием данных case 0x60: // Принят свой адрес, будет прием Data. TWI_Buff_Idx = 0; break; case 0x80: // Принят байт Data, выдан ACK. case 0x88: // Принят байт Data, выдан NACK. Tst[TWI_Buff_Idx] = TWDR; TWI_Buff_Idx++; break; case 0xa0: // При приеме в своем адресе был принят STOP или RESTART. CheckTWIbuff(); break; default: break; } TWCR |= (1 << TWINT); // Сброс флага прерывания. } Изменено 23 мая, 2015 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 35 23 мая, 2015 Опубликовано 23 мая, 2015 · Жалоба Теперь другая проблема - атмега не фиксирует обращений по i2c-адресу TDA7563 (0x6C). Пока разбираюсь.. Попробуйте адрес 0x36, а то среди адресов I2C постоянная путаница - одни считают с младшим битом, а другие без него. Я постоянно накалываюсь - в даташите один адрес написан, а в действиельности его надо либо умножить на два, либо поделить. Т.е. попробуйте здесь: TWAR = 0x6C << 1; не делать сдвига влево. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
athlon64 0 23 мая, 2015 Опубликовано 23 мая, 2015 · Жалоба Попробуйте адрес 0x36, а то среди адресов I2C постоянная путаница - одни считают с младшим битом, а другие без него. Я постоянно накалываюсь - в даташите один адрес написан, а в действиельности его надо либо умножить на два, либо поделить. Т.е. попробуйте здесь: TWAR = 0x6C << 1; не делать сдвига влево. Спасибо за совет, это я попробовал сразу же :) тоже накалывался, и не раз но в даташите на атмегу и TDA всё однозначно написано, нужно именно TWAR = 0x6C << 1; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
athlon64 0 23 мая, 2015 Опубликовано 23 мая, 2015 · Жалоба В общем в итоге имею вот что. После включения питания магнитолы (и атмеги) сразу попадаю в обработчик TWI с TWSR=0x00, переинициализирую TWI. Больше в обработчик не попадаю. Тем временем шина в магнитоле работает, TDA7563 включается. Напоминаю, что атмега и TDA7563 сидят на одной шине с одинаковыми i2c-slave адресами. Возможно с этим связана проблема, хотя, с моей точки зрения, так делать можно и если выдавать мастеру в данных только байты = 0xFF, то всё должно работать. Или я не прав? Ещё завтра попробую поднять частоту атмеги до 8МГц, сейчас 1МГц Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
athlon64 0 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба После поднятия частоты атмеги всё заработало! Рекомендацию эту нашёл в документе "AVR311: Using the TWI module as I2C slave" - частота работы avr должна быть хотя бы в 16 раз выше частоты работы twi. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pavel-pervomaysk 0 3 июня, 2015 Опубликовано 3 июня, 2015 · Жалоба Что-то не похоже на правду. Пример для TDA7564 (практически одно и то же для всей серии TDA756x... (27pin)) S D8 46 13 P (Turn ON) S D9 00 00 C0 00 P (Check status) S D8 40 13 P (ST-BY mode) S D9 00 00 C0 00 P (Check status) Частоты 1-50 кГц поддерживается всеми устройствами. А вот 100-400кГц не всеми. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
athlon64 0 3 июня, 2015 Опубликовано 3 июня, 2015 (изменено) · Жалоба Что-то не похоже на правду. ... Что именно не похоже? При частоте 100 КГц частоты атмеги в 1 МГц уже недостаточно, не говоря уже о 400 КГц Изменено 3 июня, 2015 пользователем IgorKossak избыточное цитирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pavel-pervomaysk 0 3 июня, 2015 Опубликовано 3 июня, 2015 · Жалоба Я о том, что УНЧ будет работать не только четко при 100кГц на i2c. Если код написан верно, то и на 1 МГц тактовой все будет работать. Мастером то есть микроконтроллер, а не УНЧ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться