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

Связь Atmega32 И Tda7310


imba

Рекомендуемые сообщения

Здравствуйте уважаемые форумчане!

Решил связать аудио процессор TDA7310 (управление громкостью, басом, тембром и т.д.) с atMega32 (выступает в роли мозгов). Согласно даташиту TDA7310 управляется либо по шине I2C (была выбрана она), либо по шине S-bus.

Проблема заключается в том, что не производится управление и как мне кажется тут два варианта:

1.Ошибки схеме

2.Ошибки в алгоритме

1.Начну со схемы:

Подключение производилось согласно даташиту с небольшими изменениями:

post-172732-0-33533600-1435915452_thumb.jpg

SDA и SCL подключаются к соответствующим выводам atMega32(далее МК) + через подтягивающие резисторы номиналом 4.7кОм на шину питания МК. Возникли сомнения по поводу разного напряжения питания, TDA7310 - 9В, МК - 5В. Но логические уровни "подходят":

Логический "0" (max) - TDA7310 (1В) atMega32 (0,7В)

Логическая "1" (от) - TDA7310 (3В) atMega32 (4,2В)

2.Алгоритм:

Формат сообщений изображен на рисунке ниже.

post-172732-0-79328300-1435914273.jpg

В соответствии с форматом, использую вот такую функцию:

void I2C_SendPocket (unsigned char value,unsigned char adres_rw)

{

I2C_StartCondition(); // генерируем условие СТАРТ

I2C_SendByte(adres_rw); //оправляем адрес устройства+бит запись

I2C_SendByte(value);//отправляем байт данных

I2C_StopCondition();//генерируем условие СТОП

}

Адрес TDA7310: 10001000

Данные (value): увеличивающаяся на 1 переменная, т.е. 00000001...00011111

Прикрепляю документацию на TDA7310 и проект в AVRStudio (в нем еще ЖКИ и энкодер)

Я новичок и еще не особо разбираюсь во всех премудростях, может кто-то что-то порекомендует, укажет на ошибки. Заранее благодарен )

TDA7310.pdf

MK-TDA7310.rar

Изменено пользователем imba
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Из той картинки, что ты показал, не ясно, насколько правильно подключена шина I2C. В частности, ей обязательно нужно подтягивание через резисторы к VCC, на обоих выводах (SDA, SCL). Резисторы - примерно 4,7 кОм. Во-вторых, правильные ли передаешь команды, правильно ли устанавливаешь адреса.

PS/ аа, сорри, вижу в тексте, есть подтяжка.. по поводу разного питания - ничего страшного, для шины I2C это не важно. Главное, чтобы напряж. "1" не было выше, чем допустимое напряжение на входе МК. То есть, подтягивать надо к +5V

тааак.. далее... че там дальше

Изменено пользователем HaVaNagiLa
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1. Начнём с

не производится управление
Откуда такая информация ?

2. "АСК" TDA-шка присылает ? Т.е. она вообще видит, что ей что-то шлют ?

1.Был подключен источник сигнала (плеер) и динамик. Музыка играла, но громкость не менялась при прокрутке вала энкодера, т.е. управление не производилось

2.В случае если не подключать схему с TDA7310 к микроконтроллеру, т.е. оставить в воздухе линии SDA и SCL, то при вращении вала энкодера (посылки команды на изменение громкости), происходит зависание, т.к. микроконтроллер ждет ACK от TDA7310. Если все подключить, то никакого зависания не наблюдается (т.е. ACK все же приходит) и я думаю что обмен все таки идет, но команды не воспринимаются

PS: команда на изменение громкости посылается при очередной прокрутке вала энкодера

Изменено пользователем imba
Ссылка на комментарий
Поделиться на другие сайты

А если без энкодера ? Может проблема в его обработке.

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

ЗЫ: И зависание программы в случае отсутствие АСК-а - дело негожее. Пересмотрите это в будущем.

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

А если без энкодера ? Может проблема в его обработке.

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

ЗЫ: И зависание программы в случае отсутствие АСК-а - дело негожее. Пересмотрите это в будущем.

Пробовал еще кнопкой. На счет энкодера сомнений нет, т.к. при его вращении изменяется число на ЖКИ, т.е. обработка происходит

На счет "зависание программы в случае отсутствие АСК-а - дело негожее. Пересмотрите это в будущем." полностью согласен )

Изменено пользователем imba
Ссылка на комментарий
Поделиться на другие сайты

Кстати, 10001000 - это ещё не совсем адрес. Там существует бит "A" (100010A0), судя по всему, для внешней адресации микросхемы. Это Вы учли ?

Ага, на картинке вывод ADDR подтянут внутри к земле, т.е. логический "0" должен быть вместо A. Если данный вывод соединить с VCC - логический "1".

В моем случае "0"

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

Остаётся только с "Audio Switch" поэксперементировать. В программе не вижу переключений канала. Ибо "слышно звук" - это ещё не значит, что выбран нужный канал.

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

Остаётся только с "Audio Switch" поэксперементировать. В программе не вижу переключений канала. Ибо "слышно звук" - это ещё не значит, что выбран нужный канал.

В данном случае используется прямое подключение к входам R и L, т.е. коммутационная часть схемы не используется, кроме того TDA7310 позволяет обойти ее подключив источник звука к выводам 14 и 29.

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

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

Мало того, громкость ещё регулируется двумя командами - грубая (10 dB) и плавная (1.25 dB),

ЗЫ: Ошибся, всё правильно. Первые 2 нуля - управление громкостью. Остальные биты - уровень. По этому можно просто посылать уровень с двумя нулями в старших битах.

Изменено пользователем Alex
Ссылка на комментарий
Поделиться на другие сайты

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

Мало того, громкость ещё регулируется двумя командами - грубая (10 dB) и плавная (1.25 dB),

Ага, в случае управления громкостью как таковых битов команды нет, вернее они равны 00, далее 3 бита для грубой регулировки и далее 3 для мягкой. Т.е. посылая команды от 00000001 до 00111111 будет перебираться все значения регулирования, ну по крайне мере хоть какое-то изменение громкости будет

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

Мне кажется проблема в возможности использования как шины i2c, так и s-bus. Может я что-то не правильно понял...хотя временные диаграммы преведены для обоих случаев

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

Напишите софтовый I2C, не долго. По крайней мере уйдёте от подозрений на неправильную работу аппаратного.

Думаю не в моих силах )

Возможно тут ошибка, вот пример кода передачи байта по i2c

void I2C_SendByte(unsigned char c)

{

TWDR = c;//загрузка значения в регистр данных

TWCR = (1<<TWINT)|(1<<TWEN);//начаало передачи байта данных

while (!(TWCR & (1<<TWINT)));//ожидание установки бита TWIN (это и есть ожидание ACK?)

}

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

Я в AVR, к сожалению, не шарю. Может кто подтянется из АВР-щиков, подскажет.

Думаю не в моих силах )
Да полно ка... Обычный ногодрыг. Смотрите по диаграммам что должно происходить.
Ссылка на комментарий
Поделиться на другие сайты

ЗЫ: И зависание программы в случае отсутствие АСК-а - дело негожее. Пересмотрите это в будущем.

Категорически дельный совет! Нельзя зависать, если нет ответа. Если ответа не поступает, нужно формировать ситуацию "обрыв связи", либо "занятость периферии". Но никак не зависать.

Для работы I2С, вход SEN (страрт-стоп режима SBUS) должен быть подключен к VCC через резистор. И не забыть, что I2C работает на частоте не выше 100 кГц!

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

Вот я писал для подобной микросхемы. Правда для PIC, но суть одна и та же.

#define I2C_SCL_LAT LATBbits.LATB1
#define I2C_SCL_TRIS TRISBbits.TRISB1
#define I2C_DAT_LAT LATBbits.LATB2
#define I2C_DAT_TRIS TRISBbits.TRISB2
#define I2C_DAT_PIN PORTBbits.RB2
#define I2C_SCL(v) I2C_SCL_TRIS=v
#define I2C_DAT(v) I2C_DAT_TRIS=v
#define I2C_Delay() Delay10TCYx(8)


/*************************************************************************************************/
void PT232x_I2C_Init(void){
I2C_SCL_LAT=0;
I2C_DAT_LAT=0;
I2C_SCL_TRIS=1;
I2C_DAT_TRIS=1;
}
/*************************************************************************************************/
void I2C_start(void){
I2C_DAT(0);
I2C_Delay();
I2C_SCL(0);
I2C_Delay();
}
/*************************************************************************************************/
void I2C_stop(void){
I2C_Delay();
I2C_SCL(1);
I2C_Delay();
I2C_DAT(1);
I2C_Delay();
}
/*************************************************************************************************/
unsigned char I2C_send(unsigned char {  // Возвращает ACK
unsigned char i, ret;
for(i=0;i<8;i++){
if(b&0x80)	 I2C_DAT(1);
else		 I2C_DAT(0);
b<<=1;
I2C_Delay();
I2C_SCL(1);
I2C_Delay();
I2C_SCL(0);
}
I2C_DAT(1);
I2C_Delay();
I2C_SCL(1);
I2C_Delay();
if(I2C_DAT_PIN)	 ret=1;
else			 ret=0;
I2C_SCL(0);
return ret;
}
/*************************************************************************************************/

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

Еще такой вопрос:

есть еще один аудио процессор (m62419fp) но уже только с i2c (из старой автомагнитолы вытащил). Напряжение питания там порядка 9В и логические уровни соответственно выше чем у МК. Например логическая "1" - VCC, т.е. 9В. Так хотелось бы узнать, каким образом можно подключить ее к МК чтобы его не спалить? )

ЗЫ: И зависание программы в случае отсутствие АСК-а - дело негожее. Пересмотрите это в будущем.

Категорически дельный совет! Нельзя зависать, если нет ответа. Если ответа не поступает, нужно формировать ситуацию "обрыв связи", либо "занятость периферии". Но никак не зависать.

Для работы I2С, вход SEN (страрт-стоп режима SBUS) должен быть подключен к VCC через резистор. И не забыть, что I2C работает на частоте не выше 100 кГц!

Спасибо за советы, сейчас попробую и отпишусь )

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

while (!(TWCR & (1<<TWINT)));//ожидание установки бита TWIN (это и есть ожидание ACK?)

Нет. Это ожидание флага прерывания от модуля TWI. АСК принимается на аппаратном уровне и на остановку интерфейса не влияет. После выполнения того или иного действия с шиной, нужно проверять код статуса в регистре TWSR, чтобы понять состояние процесса обмена.

В вашем случае, нужно:

- настроить модуль в режим "ведущий передатчик";

- сформировать состояние START (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN));

- далее ждете выполнения, т.е. флаг TWINT;

- потом шлете адрес устройства, которому предназначается посылка, 7бит - адрес, 1бит - 0/1(запись/чтение) и данные (TWCR=(1<<TWINT)|(1<<TWEN));

- не забывайте формировать состояние STOP в конце посылок (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)).

На каждом этапе, ждете флаг TWINT. Это гарантирует выполнение предыдущей команды и отсутствие коллизий со стороны ведущего. Для полной гарантии необходимо проверять код статуса (TWSR). Его значение зависит от правильности работы интерфейса, текущего действия и результата его выполнения.

Почитайте Евстифеева, у него все четко расписано о работе TWI и методах работы по этой шине.

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

Еще такой вопрос:

есть еще один аудио процессор (m62419fp) но уже только с i2c (из старой автомагнитолы вытащил). Напряжение питания там порядка 9В и логические уровни соответственно выше чем у МК. Например логическая "1" - VCC, т.е. 9В. Так хотелось бы узнать, каким образом можно подключить ее к МК чтобы его не спалить? )

Если заметил в документе, то у микросхемы два вывода питания - VCC (21 ножка) и VDD (41 ножка). Конкретно в этом данном случае VCC = 9 В - это питание аналоговой части схемы, а VDD = 5 В - питание цифровой, интерфейсной части. И напряжения лог "1" интерфейса указаны относительно питания VDD. Поэтому, ничего не сгорит при подсоединении к МК.

Вообще, с обозначениями VCC, VDD есть известная путаница. Исторически, Vcc - это положительное (+) питание устройств (микросхем) на биполярных транзисторах (с - collector), а Vdd - положительное питание устройств (микросхем) с полевыми транзисторами (d - drain). МК на выходах имеют полевые транзисторы, поэтому, по идее, выводы питания МК нужно обозначать VDD, но... но обозначаются как VCC. Ну и ладно. Главное, запомнить эти особенности, а если есть сомнения, посмотреть в даташите диапазоны этих напряжений.

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

while (!(TWCR & (1<<TWINT)));//ожидание установки бита TWIN (это и есть ожидание ACK?)

Нет. Это ожидание флага прерывания от модуля TWI. АСК принимается на аппаратном уровне и на остановку интерфейса не влияет. После выполнения того или иного действия с шиной, нужно проверять код статуса в регистре TWSR, чтобы понять состояние процесса обмена.

В вашем случае, нужно:

- настроить модуль в режим "ведущий передатчик";

- сформировать состояние START (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN));

- далее ждете выполнения, т.е. флаг TWINT;

- потом шлете адрес устройства, которому предназначается посылка, 7бит - адрес, 1бит - 0/1(запись/чтение) и данные (TWCR=(1<<TWINT)|(1<<TWEN));

- не забывайте формировать состояние STOP в конце посылок (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)).

На каждом этапе, ждете флаг TWINT. Это гарантирует выполнение предыдущей команды и отсутствие коллизий со стороны ведущего. Для полной гарантии необходимо проверять код статуса (TWSR). Его значение зависит от правильности работы интерфейса, текущего действия и результата его выполнения.

Почитайте Евстифеева, у него все четко расписано о работе TWI и методах работы по этой шине.

ага, именно такой алгоритм, думаю проблема в схеме все таки

Еще такой вопрос:

есть еще один аудио процессор (m62419fp) но уже только с i2c (из старой автомагнитолы вытащил). Напряжение питания там порядка 9В и логические уровни соответственно выше чем у МК. Например логическая "1" - VCC, т.е. 9В. Так хотелось бы узнать, каким образом можно подключить ее к МК чтобы его не спалить? )

Если заметил в документе, то у микросхемы два вывода питания - VCC (21 ножка) и VDD (41 ножка). Конкретно в этом данном случае VCC = 9 В - это питание аналоговой части схемы, а VDD = 5 В - питание цифровой, интерфейсной части. И напряжения лог "1" интерфейса указаны относительно питания VDD. Поэтому, ничего не сгорит при подсоединении к МК.

Вообще, с обозначениями VCC, VDD есть известная путаница. Исторически, Vcc - это положительное (+) питание устройств (микросхем) на биполярных транзисторах (с - collector), а Vdd - положительное питание устройств (микросхем) с полевыми транзисторами (d - drain). МК на выходах имеют полевые транзисторы, поэтому, по идее, выводы питания МК нужно обозначать VDD, но... но обозначаются как VCC. Ну и ладно. Главное, запомнить эти особенности, а если есть сомнения, посмотреть в даташите диапазоны этих напряжений.

Спасибо, не знал. По документации Vdd от 4В до 6В, что при 5В даст согласование логических уровней МК и аудио процессора )

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

Почитал еще раз даташит. Оказывается, я его не правильно понял.

If SDA and SEN inputs are short-circuited together, then the TDA7310 appears as a standard I2 CBUS slave.

Это означает, что SDA и SEN должны быть замкнуты между собой, чтобы интерфейс работал в режиме I2C.

А во фразе

According to I2 CBUS specification the S-BUS lines are connected to a positive supply voltage via pull-up resistor

имелось ввиду, что целиком интерфейс S-BUS, каждая его линия должна быть подтянута к + питания через резисторы.

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...