Новичок
|
Здравствуйте!
Есть желание собрать устройство, про которое я уже писал ранее. В планах это такой аудиоресивер: -Радио будет встроенным (тюнер от автомагнитолы) и управляться микроконтроллером (синтезатор частоты, например, LM7001J); -3 стерео входа, 1 псевдоквадро выход (TDA7313/PT2313L); -Входа можно будет выбирать программно, т.е. управлять тем же МК; -Для всех режимов будет использоваться один дисплей; -MP3 тоже будет встроенным (чтение с USB устройств и SD карт), управление через тот же МК (декодер vs1011); -В режиме MP3 на экране отображается название проигрываемого файла(желательно), прошедшее время с начала песни и её длительность; -В режиме радио отображается текущая частота (по возможности - горит индикатор станции на настроенной частоте); -В режиме линейного входа на дисплее надпись LINE IN; -Во всех режимах регулируются громкость, баланс, низкие и высокие частоты. Изучаю язык C++, но пока умею только выводить символы и слова на LCD, и моргать светодиодами, про управление микросхем по I2C шине ничего не понял... (CodeVisionAVR) Буду очень благодарен за любую помощь, кроме ссылок на учебники (Прочитал соответствующие темы Шпака и Лебедева). Надеюсь на Вашу помощь! |
||
Оценка
|
Новичок
|
Цитата:
Библиотека для TDA7313 есть, но для CodeVisionAVR ли она? И как посылать команды тдашке? Цитата:
/************************************************** ***
Это библиотека для работы с шиной i2c и микросхемой TDA7313. Линией синхронизации SCL назначен PORTB.0 Линией передачи данных SDA назначен PORTB.1 Настройки данной библиотеки: В строке 1 надо указать где линия SDA В строках 2-5 указать соответствующие номера битов и порт В строках 6-9 в принципе можно ничего не трогать, но если сильно хочется... А порт смотри внимательно!!!!!!!! В строке 10 указывается в мкс длительность импульсов, т.о. регулирутся скорость обмена данными Если не трогали строки 6-9, то 12-15 тоже не надо колыхать если конечно не изменится порт ************************************************** ***/ #include <DELAY.h> //#define SDA PORTC.7 /*1*/ #define CLR_B6 &=~(1<<6) /*Очистка бита 0*/ /*2*/ #define CLR_B7 &=~(1<<7) /*Очистка бита 1*/ /*3*/ #define SET_B6 |=(1<<6) /*Установка бита 0*/ /*4*/ #define SET_B7 |=(1<<7) /*Установка бита 1*/ /*5*/ #define SCL_ZERO DDRC SET_B6 /*Установка 0 на SCL путем переключения данной линии на выход*/ /*6*/ #define SCL_ONE DDRC CLR_B6 /*Установка 1 на SCL путем переключения данной линии на вход*/ /*7*/ #define SDA_ZERO DDRC SET_B7 /*Установка 0 на SDA путем переключения данной линии на выход*/ /*8*/ #define SDA_ONE DDRC CLR_B7 /*Установка 1 на SDA путем переключения данной линии на вход*/ /*9*/ #define PAUSE delay_us(15) /*Необходимая пауза. Для 100 килобит в сек не менее 4,7 мкс*/ /*10*/ void i2_start(void) { /*Функция инициализации и старта шины i2c*/ DDRC CLR_B6; /*Сделали входом PORTC.6 */ /*12*/ DDRC CLR_B7; /*Сделали входом PORTC.7 */ /*13*/ PORTC CLR_B6; /*Убрали внутреннюю подтяжку с PORTB.0 на SCL теперь 1 за счет внешней подтяжки*/ /*14*/ PORTC CLR_B7; /*Убрали внутреннюю подтяжку с PORTB.1 на SDA теперь 1 за счет внешней подтяжки */ /*15*/ PAUSE; SDA_ZERO; /*При единицах на SDA SCL, делаем 0 на SDA, тем самым стартуем */ PAUSE; SCL_ZERO; /*Даём 0 на SCL, подготовив тем самым интерфейс к передаче байта */ PAUSE; } void i2_stop (void) { SDA_ZERO; PAUSE; SCL_ONE; PAUSE; SDA_ONE; PAUSE; } unsigned char i2_write (unsigned char bw) { /*Функция передачи байта по шине*/ unsigned char check=0; unsigned char k, m; /*Вспомогательные переменные*/ for (k=0 ; k<8 ; k++) { /*Цикл отправки байта по битам, начиная с самого старшего, как в спецификации на шину*/ m = 1& (bw >> (7-k)); /*Операция логического И между числом 1 и очередным битом, для выявления его значения*/ if (m==0) {SDA_ZERO;} /*Если очередной бит равен 0 то линию SDA делаем выходом, и т.о. на ней становится 0 ибо в PORTх вписан0 в i2_start */ else {SDA_ONE;}; /*Если очередной бит равен 1 то линию SDA делаем входом, и т.о. на ней становится 1 т.к. есть внешний подтяг. резистор */ PAUSE; /*Технологическая пауза*/ SCL_ONE; /*Даем синхроимпульс*/ PAUSE; /*Ждем пока приемник определит значение бита на SDA пока на SCL единица */ SCL_ZERO; /*Убираем 1 с линии синхронизации, подготавливая приемник к приему очередного бита*/ PAUSE; }; /*для for, чтобы не запутаться*/ /*Посылка девятого бита подтверждения*/ SDA_ONE; PAUSE; SCL_ONE; PAUSE; if (PINC.7==1) {check=1;} else {check=0;}; SCL_ZERO; PAUSE; return check; } void tda7313_write(unsigned char command) { /*Функция инициализации и отправки данных на TDA7313*/ i2_start(); /*Даем сигнал старта шины*/ if(i2_write(0x88)) {goto m7;}; /*Вводим адрес тдашки и если она не дала бит подтверждения приема то на метку 1*/ i2_write(command); /*передаем данные в микруху */ m7: i2_stop(); /*останавливаем обмен по шине*/ } |
||
Оценка
|
Обратная связь РадиоЛоцман Вверх |