Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
20.11.2008, 06:12
|
|
Прописка
Регистрация: 27.12.2005
Сообщений: 134
Сказал спасибо: 6
Сказали Спасибо 15 раз(а) в 7 сообщении(ях)
|
Управление TEA6320 по I2C, CodeVision AVR
Управляю регулятором громкости TEA6320 при помощи меги16, в даташите описана последовательность:
1-2-3-4-3-5-3-6, где
1. S = START condition.
2. SLAVE ADDRESS (MAD) = 1000 0000.
3. A = acknowledge, generated by the slave.
4. SUBADDRESS (в моем случае 0000 0000)
5. DATA (в моем случае 0011 1111)
6. P = STOP condition.
Пишу вот как:
(шина висит на 2 и 3 бите порта D, оба подтянуты резисторами 1к к VCC)
#asm
.equ __i2c_port=0x12 ;PORTD
.equ __sda_bit=2
.equ __scl_bit=3
#endasm
#include ‹i2c.h›
//===//
i2c_init();
//===//
i2c_start();
i2c_write(0b10000000);
i2c_read(1);
i2c_write(0b00000000);
i2c_read(1);
i2c_write(0b00111111);
i2c_read(1);
i2c_stop();
Странно, что нигде не задается частота шины.
Код не работает, в чем может быть ошибка, подскажите пожалуйста. Может быть, у кого-то есть примеры работы? все что гуглится - это в основном память и микросхемы, для которых код и так отлично генерируется КодВижном.
|
|
|
|
20.11.2008, 15:55
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
|
C CVAVR не работал, но с I2C - много раз. Первое что бросается в глаза в вашем коде - это операции чтения после записи. Вроде как прием подверждающих сигналов ACK/NACK является частью функции i2c_write, поэтому чтение не нужно (по крайней мере так было везде, где я использовал I2C функции). Да, перепроверьте адрес чипа (0b10000000), как-то он подозрительно прост
i2c_start();
i2c_write(0b10000000);
i2c_write(0b00000000);
i2c_write(0b00111111);
i2c_stop();
|
|
|
|
20.11.2008, 16:03
|
|
Прописка
Регистрация: 27.12.2005
Сообщений: 134
Сказал спасибо: 6
Сказали Спасибо 15 раз(а) в 7 сообщении(ях)
|
Перепроверил, так и есть посмотрел табличку - повезло чипу этому с адресом.
|
|
|
|
20.11.2008, 16:26
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
|
Вот еще, вспомнил, не забудьте подергать селекторы входов и фэйдеры, а то может просто работать, но в тихую
Посмотрел даташит. Хороший чип. Пологая характеристика у регулятора низких, довольно низкий уровень шумов и все это при демократичной цене. Наверное следующее "сердце" домашнего усилилителя буду делать на нем.
|
|
|
|
20.11.2008, 16:41
|
|
Прописка
Регистрация: 27.12.2005
Сообщений: 134
Сказал спасибо: 6
Сказали Спасибо 15 раз(а) в 7 сообщении(ях)
|
Попробую конечно, как домой прийду - еще бы как-то отслеживать, передаются ли на чип команды по I2C или нет без осциллографа. Для начала программно проверю успех i2c_write(), но вот есть сомнения по поводу резисторов - не переборщил ли с подтяжкой (1кОм).
|
|
|
|
20.11.2008, 20:22
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 886
Сказал спасибо: 119
Сказали Спасибо 1,110 раз(а) в 177 сообщении(ях)
|
Подтяжка 1 кОм - вполне нормально. Если устройств на шине мало и провода не длинные, то можно увеличить до 4.7 кОм в целях экономии энергии
|
|
|
|
21.11.2008, 15:24
|
|
Прохожий
Регистрация: 04.12.2007
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Подключал часы реального времени DS3231 с интерфейсом I2C к микроконтроллеру ATmega16. Код писал в CodeVision, пользовался программным I2C, вот кусок кода:
#asm
.equ __i2c_port=0x18 ;PORTB
.equ __sda_bit=6
.equ __scl_bit=7
#endasm
#include ‹i2c.h›
//-----------------------------//
i2c_init();
//----------------------------//
void write_data(char adr, char data)
{ //функция записи
i2c_start(); //формируем состояние СТАРТ на шине
i2c_write(0xD0); //пишем адрес устройства(часов) + состояние “запись”
i2c_write(adr); //пишем адрес регистра внутри устройства(часов)
i2c_write(data); //пишем данные в выбранный регистр
i2c_stop(); //формируем состояние СТОП на шине
}
unsigned char read (char adr) //функция чтения
{
unsigned char data;
i2c_start(); //формируем состояние СТАРТ на шине
i2c_write(0xD0); //пишем адрес устройства(часов)
i2c_write(adr); //пишем адрес регистра внутри устройства(часов)
i2c_start(); //формируем состояние ПОВСТАРТ на шине
i2c_write(0xD1); //пишем адрес устройства(часов) + состояние “чтение”
data = i2c_read(0); //считываем данные из выбранного регистра
return data;
}
Получилось довольно удобно , а главное работоспособно.
По поводу резисторов подтяжки, использовал по 200 кОм, работа с микротоками, экономим батарейки.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
mRTOS - кооперативная ОС для AVR. Порт CodeVision.
|
LVII |
Микроконтроллеры, АЦП, память и т.д |
5 |
29.11.2008 14:44 |
Меню AVR Codevision
|
theonebug |
Микроконтроллеры, АЦП, память и т.д |
2 |
09.06.2008 21:48 |
Proteus пример TWI (I2C) для двух AVR
|
EXIS |
Микроконтроллеры, АЦП, память и т.д |
0 |
14.05.2008 21:43 |
Знатоки AVR и I2C нужна помощь
|
Vlad68 |
Микроконтроллеры, АЦП, память и т.д |
0 |
23.05.2007 17:51 |
Как работать с AT89C5131 в CodeVision AVR?
|
lom771 |
Микроконтроллеры, АЦП, память и т.д |
2 |
29.08.2006 16:51 |
Часовой пояс GMT +4, время: 19:12.
|
|