Перейти к содержанию
    

Подключение к i2c магнитолы

Приветствую всех

Делаю устройство на 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 атмеги нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

КЗ между SDA, SCL и GND атмеги нет.

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

возьмите вторую мегу или что-то другое в качестве мастера и проверьте - работает ли ваш слейв..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем выяснилось, что была ошибка в обработчике прерывания от 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);		// Сброс флага прерывания.
}

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Теперь другая проблема - атмега не фиксирует обращений по i2c-адресу TDA7563 (0x6C). Пока разбираюсь..

 

Попробуйте адрес 0x36, а то среди адресов I2C постоянная путаница - одни считают с младшим битом, а другие без него. Я постоянно накалываюсь - в даташите один адрес написан, а в действиельности его надо либо умножить на два, либо поделить.

Т.е. попробуйте здесь:

TWAR = 0x6C << 1;

не делать сдвига влево.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте адрес 0x36, а то среди адресов I2C постоянная путаница - одни считают с младшим битом, а другие без него. Я постоянно накалываюсь - в даташите один адрес написан, а в действиельности его надо либо умножить на два, либо поделить.

Т.е. попробуйте здесь:

TWAR = 0x6C << 1;

не делать сдвига влево.

Спасибо за совет, это я попробовал сразу же :) тоже накалывался, и не раз

но в даташите на атмегу и TDA всё однозначно написано, нужно именно TWAR = 0x6C << 1;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем в итоге имею вот что.

После включения питания магнитолы (и атмеги) сразу попадаю в обработчик TWI с TWSR=0x00, переинициализирую TWI. Больше в обработчик не попадаю.

Тем временем шина в магнитоле работает, TDA7563 включается.

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После поднятия частоты атмеги всё заработало!

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то не похоже на правду.

 

Пример для 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кГц не всеми.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то не похоже на правду.

...

Что именно не похоже?

При частоте 100 КГц частоты атмеги в 1 МГц уже недостаточно, не говоря уже о 400 КГц

Изменено пользователем IgorKossak
избыточное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я о том, что УНЧ будет работать не только четко при 100кГц на i2c.

Если код написан верно, то и на 1 МГц тактовой все будет работать.

Мастером то есть микроконтроллер, а не УНЧ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...