Страница 1 из 1
I2C + аудиопроцессор R2A15900SP
Добавлено: Пт авг 03, 2012 16:55:46
Johnson
Здравствуйте, уважаемые коты!
Пытаюсь завести
аудиопроцессор, но он ни как не хочет оживляться...
В ссылке выше ДШ на него, инициализировать пытаюсь так:
Спойлер
Код: Выделить всё
#include <i2c.h>
#include <delay.h>
// I2C Bus functions
#asm
.equ __i2c_port=0x15 ;PORTC
.equ __sda_bit=1
.equ __scl_bit=0
#endasm
// Some code
i2c_init();
delay_ms(1000);
i2c_start();
i2c_write(0b10000011);
i2c_write(0);
i2c_write(0b00000000);
i2c_start();
i2c_write(0b10000011);
i2c_write(1);
i2c_write(0b00000000);
i2c_start();
i2c_write(0b10000011);
i2c_write(2);
i2c_write(0b00111111);
i2c_start();
i2c_write(0b10000011);
i2c_write(3);
i2c_write(0b00000000);
i2c_start();
i2c_write(0b10000011);
i2c_write(4);
i2c_write(0b00000000);
Не могли бы вы более опытным глазом поглядеть на ДШ и ткнуть меня носом, где я ошибся?
PS: сразу вопрос... SubAddress нужно обязательно инкрементировать, или можно указывать произвольный?
Re: I2C + аудиопроцессор R2A15900SP
Добавлено: Пт авг 03, 2012 18:19:43
Ser60
При беглом взгляде на код:
1. Адресный байт (slave address) должен быть всегда 0b10000010
2. Subaddress инкрементирется сам при посылке нескольких байтов
3. Формировть start сигнал нужно лишь 1 раз перед посылкой группы байтов при инкрементаци subaddress. Если хотите каждый раз посылать и subaddress, формируйте stop сигнал.
4. Пишите комментарии чего хотите добиться. В настоящем коде выставляется нулевая громкость в левом и правом каналах (по адресам 0 и 1). Вам это действительно надо для оживления?
Re: I2C + аудиопроцессор R2A15900SP
Добавлено: Пт авг 03, 2012 18:55:06
Johnson
Ser60 писал(а):При беглом взгляде на код:
1. Адресный байт (slave address) должен быть всегда 0b10000010
2. Subaddress инкрементирется сам при посылке нескольких байтов
3. Формировть start сигнал нужно лишь 1 раз перед посылкой группы байтов при инкрементаци subaddress. Если хотите каждый раз посылать и subaddress, формируйте stop сигнал.
4. Пишите комментарии чего хотите добиться. В настоящем коде выставляется нулевая громкость в левом и правом каналах (по адресам 0 и 1). Вам это действительно надо для оживления?
1. Подумал, что RW должен быть установлен в 1...
2. Эм... Если инкрементируется сам - то что посылать в сабадресе? Там же диаграмма явно показывает, что он должен быть...
3. Получается, что так: "старт - сабадрес - дата - дата - дата - дата - дата - стоп"?
4. На сколько я понял, там при нулях идет уровень громкости 0дБ (максимальная громкость), а при увеличении идет подавление громкости (вплоть до -89дБ)... Или я не прав? Нужно мне всего-лишь инициализировать её, и включить первых вход. Дальше методом проб и ошибок разберусь...
Re: I2C + аудиопроцессор R2A15900SP
Добавлено: Пт авг 03, 2012 19:04:54
Johnson
Спасибо большое!
Разобрался!

Вот минимальный код, который "завел" микруху:
Код: Выделить всё
i2c_init();
delay_ms(1000);
i2c_start();
// Slave address
i2c_write(0b10000010);
// SubAddress
i2c_write(0x00);
// Volume
i2c_write(0b00100010);
i2c_write(0b00100010);
// Input selector
i2c_write(0b00111111);
// Bass
i2c_write(0b00000000);
// Treble
i2c_write(0b00000000);
i2c_stop();
Re: I2C + аудиопроцессор R2A15900SP
Добавлено: Пт авг 03, 2012 21:35:24
Johnson
Теперь вот только не могу понять...
Написал код, регулирует громкость:
Код: Выделить всё
void R2A_set_volume(){
unsigned char vol_H = (89-Volume)/10 , vol_L = (89-Volume)%10;
i2c_start();
i2c_write(0b10000010);
i2c_write(0x00);
i2c_write((vol_H << 4) | vol_L);
i2c_write((vol_H << 4) | vol_L);
i2c_stop();
LCD_draw_volume();
}
Но, есть косяк.
разница в уровне звука между 49 и 50 заметно выше, чем между 50 и 51...
И так со всеми переходами между десяток.
прибавляешь, к примеру, от 40 до 49 - растет звук плавно. Однако, после увеличения с 49 до 50 - резкий скачек уровня громкости, а дальше в пределах десятки опять нормально растет.
Проблемы в самом звуке быть не может: источником взял тактовую частоту дисплея 2кГц. На слух очень заметные перепады, особенно если прибавляешь резко (вообще "лесенка" получается"...
Думал, что опять натупил с логикой, вывел в отдельные знакоместа выражения:
(89-Volume)/10 и (89-Volume)%10
Показывают как положено, познаково модуль от затухания...
Re: I2C + аудиопроцессор R2A15900SP
Добавлено: Пт авг 03, 2012 22:59:13
Ser60
В коде вроде все красиво. Может в самой микре косяк. Именно, степень затухания десятков децибел не точно согласована с таковой для единиц. Я-бы попробовал подать ей коды с младшим нибблом от 9 ро 15. Знаю, что не по ДШ, но попробовать-то можно. Если не поможет, попробуйте скомпенсировать плавность увеличения громкости программно, или посмотрите в сторону аналогичных процессоров серии TDA.
Re: I2C + аудиопроцессор R2A15900SP
Добавлено: Сб авг 04, 2012 05:22:02
Johnson
Про младший ниббл до 15 - идея не плохая, не подумал...
Про несогласованность - в акустике эта микруха работает нормально, без перепадов, правда, там предел регулировки до 60ед... скорее всего программно компенсировали.
Re: I2C + аудиопроцессор R2A15900SP
Добавлено: Сб авг 04, 2012 08:56:49
Johnson
Про разрядность уровня громкости - не получилось.
Когда любой из нибблов выставляешь больше 9 - звук пропадает.