Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подключение к i2c магнитолы
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
athlon64
Приветствую всех
Делаю устройство на 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
Цитата(athlon64 @ May 23 2015, 11:22) *
КЗ между SDA, SCL и GND атмеги нет.

отключите от магнитолы атмегу и запитайте ее с контролем на светиках, что мега запустилась. потом измерьте уровни напряжения на контактах i2c меги, временно подключив подтяжки шины
возьмите вторую мегу или что-то другое в качестве мастера и проверьте - работает ли ваш слейв..
athlon64
В общем выяснилось, что была ошибка в обработчике прерывания от 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();
}

Обработчик:
CODE
#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); // Сброс флага прерывания.
}
Xenia
Цитата(athlon64 @ May 23 2015, 15:48) *
Теперь другая проблема - атмега не фиксирует обращений по i2c-адресу TDA7563 (0x6C). Пока разбираюсь..


Попробуйте адрес 0x36, а то среди адресов I2C постоянная путаница - одни считают с младшим битом, а другие без него. Я постоянно накалываюсь - в даташите один адрес написан, а в действиельности его надо либо умножить на два, либо поделить.
Т.е. попробуйте здесь:
TWAR = 0x6C << 1;
не делать сдвига влево.
athlon64
Цитата(Xenia @ May 23 2015, 18:56) *
Попробуйте адрес 0x36, а то среди адресов I2C постоянная путаница - одни считают с младшим битом, а другие без него. Я постоянно накалываюсь - в даташите один адрес написан, а в действиельности его надо либо умножить на два, либо поделить.
Т.е. попробуйте здесь:
TWAR = 0x6C << 1;
не делать сдвига влево.

Спасибо за совет, это я попробовал сразу же sm.gif тоже накалывался, и не раз
но в даташите на атмегу и TDA всё однозначно написано, нужно именно TWAR = 0x6C << 1;
athlon64
В общем в итоге имею вот что.
После включения питания магнитолы (и атмеги) сразу попадаю в обработчик TWI с TWSR=0x00, переинициализирую TWI. Больше в обработчик не попадаю.
Тем временем шина в магнитоле работает, TDA7563 включается.

Напоминаю, что атмега и TDA7563 сидят на одной шине с одинаковыми i2c-slave адресами. Возможно с этим связана проблема, хотя, с моей точки зрения, так делать можно и если выдавать мастеру в данных только байты = 0xFF, то всё должно работать. Или я не прав?

Ещё завтра попробую поднять частоту атмеги до 8МГц, сейчас 1МГц
athlon64
После поднятия частоты атмеги всё заработало!

Рекомендацию эту нашёл в документе "AVR311: Using the TWI module as I2C slave" - частота работы avr должна быть хотя бы в 16 раз выше частоты работы twi.
pavel-pervomaysk
Что-то не похоже на правду.

Пример для TDA7564 (практически одно и то же для всей серии TDA756x... (27pin))

CODE
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
Цитата(pavel-pervomaysk @ Jun 3 2015, 20:12) *
Что-то не похоже на правду.
...

Что именно не похоже?
При частоте 100 КГц частоты атмеги в 1 МГц уже недостаточно, не говоря уже о 400 КГц
pavel-pervomaysk
Я о том, что УНЧ будет работать не только четко при 100кГц на i2c.
Если код написан верно, то и на 1 МГц тактовой все будет работать.
Мастером то есть микроконтроллер, а не УНЧ.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.