реклама на сайте
подробности

 
 
> Подключение к i2c магнитолы, вопрос
athlon64
сообщение May 23 2015, 08:22
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 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 атмеги нет.


--------------------
Руслан
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
Jury093
сообщение May 23 2015, 08:40
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050



Цитата(athlon64 @ May 23 2015, 11:22) *
КЗ между SDA, SCL и GND атмеги нет.

отключите от магнитолы атмегу и запитайте ее с контролем на светиках, что мега запустилась. потом измерьте уровни напряжения на контактах i2c меги, временно подключив подтяжки шины
возьмите вторую мегу или что-то другое в качестве мастера и проверьте - работает ли ваш слейв..
Go to the top of the page
 
+Quote Post
athlon64
сообщение May 23 2015, 12:48
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 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] - для короткого!!!


--------------------
Руслан
Go to the top of the page
 
+Quote Post
Xenia
сообщение May 23 2015, 12:56
Сообщение #4


Гуру
******

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



Цитата(athlon64 @ May 23 2015, 15:48) *
Теперь другая проблема - атмега не фиксирует обращений по i2c-адресу TDA7563 (0x6C). Пока разбираюсь..


Попробуйте адрес 0x36, а то среди адресов I2C постоянная путаница - одни считают с младшим битом, а другие без него. Я постоянно накалываюсь - в даташите один адрес написан, а в действиельности его надо либо умножить на два, либо поделить.
Т.е. попробуйте здесь:
TWAR = 0x6C << 1;
не делать сдвига влево.
Go to the top of the page
 
+Quote Post
athlon64
сообщение May 23 2015, 13:06
Сообщение #5


Частый гость
**

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



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

Спасибо за совет, это я попробовал сразу же sm.gif тоже накалывался, и не раз
но в даташите на атмегу и TDA всё однозначно написано, нужно именно TWAR = 0x6C << 1;


--------------------
Руслан
Go to the top of the page
 
+Quote Post
athlon64
сообщение May 23 2015, 16:45
Сообщение #6


Частый гость
**

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



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

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

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


--------------------
Руслан
Go to the top of the page
 
+Quote Post
athlon64
сообщение May 24 2015, 05:04
Сообщение #7


Частый гость
**

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



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

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


--------------------
Руслан
Go to the top of the page
 
+Quote Post
pavel-pervomaysk
сообщение Jun 3 2015, 14:12
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 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кГц не всеми.
Go to the top of the page
 
+Quote Post
athlon64
сообщение Jun 3 2015, 14:18
Сообщение #9


Частый гость
**

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



Цитата(pavel-pervomaysk @ Jun 3 2015, 20:12) *
Что-то не похоже на правду.
...

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

Сообщение отредактировал IgorKossak - Jun 3 2015, 17:51
Причина редактирования: избыточное цитирование


--------------------
Руслан
Go to the top of the page
 
+Quote Post
pavel-pervomaysk
сообщение Jun 3 2015, 17:31
Сообщение #10


Местный
***

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



Я о том, что УНЧ будет работать не только четко при 100кГц на i2c.
Если код написан верно, то и на 1 МГц тактовой все будет работать.
Мастером то есть микроконтроллер, а не УНЧ.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 23:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01433 секунд с 7
ELECTRONIX ©2004-2016