|
Подключение к i2c магнитолы, вопрос |
|
|
|
May 23 2015, 08:22
|

Частый гость
 
Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882

|
Приветствую всех Делаю устройство на 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 атмеги нет.
--------------------
Руслан
|
|
|
|
|
 |
Ответов
(1 - 9)
|
May 23 2015, 08:40
|
Знающий
   
Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050

|
Цитата(athlon64 @ May 23 2015, 11:22)  КЗ между SDA, SCL и GND атмеги нет. отключите от магнитолы атмегу и запитайте ее с контролем на светиках, что мега запустилась. потом измерьте уровни напряжения на контактах i2c меги, временно подключив подтяжки шины возьмите вторую мегу или что-то другое в качестве мастера и проверьте - работает ли ваш слейв..
|
|
|
|
|
May 23 2015, 12:48
|

Частый гость
 
Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882

|
В общем выяснилось, что была ошибка в обработчике прерывания от 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); // Сброс флага прерывания. }
Сообщение отредактировал IgorKossak - May 23 2015, 19:49
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
--------------------
Руслан
|
|
|
|
|
May 23 2015, 12:56
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(athlon64 @ May 23 2015, 15:48)  Теперь другая проблема - атмега не фиксирует обращений по i2c-адресу TDA7563 (0x6C). Пока разбираюсь.. Попробуйте адрес 0x36, а то среди адресов I2C постоянная путаница - одни считают с младшим битом, а другие без него. Я постоянно накалываюсь - в даташите один адрес написан, а в действиельности его надо либо умножить на два, либо поделить. Т.е. попробуйте здесь: TWAR = 0x6C << 1; не делать сдвига влево.
|
|
|
|
|
May 23 2015, 13:06
|

Частый гость
 
Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882

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

Местный
  
Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716

|
Что-то не похоже на правду. Пример для 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кГц не всеми.
|
|
|
|
|
Jun 3 2015, 14:18
|

Частый гость
 
Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882

|
Цитата(pavel-pervomaysk @ Jun 3 2015, 20:12)  Что-то не похоже на правду. ... Что именно не похоже? При частоте 100 КГц частоты атмеги в 1 МГц уже недостаточно, не говоря уже о 400 КГц
Сообщение отредактировал IgorKossak - Jun 3 2015, 17:51
Причина редактирования: избыточное цитирование
--------------------
Руслан
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|