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

 
 
 
Reply to this topicStart new topic
> atmega32 и vs1011.
Pentium02
сообщение Apr 1 2010, 01:58
Сообщение #1





Группа: Участник
Сообщений: 4
Регистрация: 5-07-09
Пользователь №: 50 937



Здравствуйте всем. Подключил vs1011 к atmega32 согласно даташиту, только помимо vs1011 на spi висит ещё и SD карта.
CS карты на PB4, CS vd1011 на PB3. Не особо понимаю зачем нужен BSYNC (висит на PB0), с английским не очень хорошо, читаю даташит как могу.
Кварца на 24.576 не нашёл, поставил на 24.000. Компилятор gcc-avr.

Код
void mmc_select()
{
    PORTB &= ~(1<<PB4);
}

void mmc_dselect()
{
    PORTB |= (1<<PB4);
}

void vs1011_select()
{
    PORTB &= ~(1<<PB3);
}

void vs1011_dselect()
{
    PORTB |= (1<<PB3);
}

void spi_write_byte(BYTE dat)
{
    SPDR=(dat);
    loop_until_bit_is_set(SPSR,SPIF);
}

void VS1011_data(BYTE data)
{
    spi_write_byte(data);
}

void VS1011_write(unsigned short adress, unsigned int data1)
{
    vs1011_select();
    loop_until_bit_is_set(PINB, PB1); //DREQ висит на PB1
    spi_write_byte(0x02);
    spi_write_byte(adress);
    spi_write_byte(data1 >> 8);
    spi_write_byte(data1);
    vs1011_dselect();
}

void VS1011_SetClock (unsigned int clock_khz, char doubler)
{
    clock_khz /= 2;
    if (doubler) clock_khz |= 0x8000;
    VS1011_write(0x03, clock_khz);
    _delay_us(2);
}

void VS1011_HardReset()
{
    PORTB &= ~(1 << PB2); //на PB2 висит xreset
    _delay_ms(1000);
    PORTB |= (1 << PB2);
    _delay_ms(10);
    return;
}
void VS1011_SoftReset()
{
    VS1011_write(0x00, 0x0204);
    _delay_ms(10);
}

void VS1011_init()
{
    VS1011_HardReset();
        VS1011_SetClock(24000, 0);
    VS1011_SoftReset();
}

void init()
{
    PORTB |= (1 << PB4);
    PORTB &= ~(1 << PB7);
    PORTB |=  (1 << PB5);
    PORTB &= ~(1 << PB6);
    DDRB |= (1 << PB7 );
    DDRB &= ~(1 << PB6);
    DDRB |= (1 << PB5); //
    DDRB |= (1 << PB4); //SD card CS
    DDRB |= (1 << PB3); //vs1011 xCS
    DDRB |= (1 << PB2); // xRESET
    DDRB &= ~(1 << PB1); //DREQ
    DDRB |= (1 << PB0);  // BSYNC
    PORTB &= ~(1 << PB0);
    SPCR = (1<<SPE)|(1<<MSTR);
    SPSR=0x00;
}

int main()
{
................
init();
VS1011_init();
................
    pf_open("/1.mp3");
    int cnt = 1;
    while (cnt != 0)
    {
        mmc_select();
        char buff[32];
        pf_read(buff, sizeof(buff), &cnt);
        mmc_dselect();
        vs1011_select();
        for (int i = 0; i < 32; i++)
        {
                    VS1011_data(buff[i]);
                }
        loop_until_bit_is_set(PINB, PB1);
        vs1011_dselect();
    }
................
};

Читаю 32 байта из файла в буфер, отсылаю vs1011, жду сигнала с DREQ (висит на PB1).
всё что я слышу в наушниках, это треск.
Микроконтроллеры начал изучать недавно. Чтение файла с карты происходит нормально, дело очевидно в работе с vs1011, никак не могу разобраться :-( прошу вашей помощи.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Apr 1 2010, 08:09
Сообщение #2


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(Pentium02 @ Apr 1 2010, 05:58) *
Не особо понимаю зачем нужен BSYNC (висит на PB0), с английским не очень хорошо, читаю даташит как могу.

BSYNC это сигнал для синхронизации байт данных. Без его использования интерфейс в compatibility mode работать не будет.
В этом режиме используются пины декодера:
DCLK, SDATA, BSYNC - для записи данных для декодирования;
SCK, SI, SO - для записи\чтения комманд.

Вы же пытаетесь записать и данные и команды по одним и тем же пинам через SPI.

Проще выбрать режим интерфейса VS1002 Native Mode (New Mode) установив в регистре SCI_MODE биты SM_SDINEW и SM_SDISHARE.

Изучите внимательнее режимы интерфейса в даташите.

Цитата(Pentium02 @ Apr 1 2010, 05:58) *
Читаю 32 байта из файла в буфер, отсылаю vs1011, жду сигнала с DREQ (висит на PB1).

Лучше сначала дождитесь готовности декодера - ждите высокого уровня на DREQ, а уже потом передавайте данные.
Go to the top of the page
 
+Quote Post
Pentium02
сообщение Apr 5 2010, 20:55
Сообщение #3





Группа: Участник
Сообщений: 4
Регистрация: 5-07-09
Пользователь №: 50 937



В общем теперь такая проблема, декодирование происходит с задержками примерно в четверть секунды (может и меньше, я так, на глаз) между фрагментами по 32 байта
Код
void mmc_spi_init()
{
    SPCR = (1<<SPE) | (1<<MSTR) | (0<<SPR1) | (0<<SPR0) | (1<<CPOL) | (1<<CPHA) | (0<<DORD) | (1<<SPI2X);
    SPSR=0x00;
}

void vs1011_spi_init()
{
    SPCR = (1<<SPE) | (1<<MSTR) | (0<<SPR1) |  (0<<SPR0) | (0<<CPOL) | (0<<CPHA) | (0<<DORD) | (0<<SPI2X);
    SPSR=0x00;
}

......
    if (pf_open("/1.mp3") == FR_OK)
    {
        int cnt = 1;
        uart_puts("Playing.\r\n");
        char buf[32];
        while (cnt != 0)
        {
            mmc_spi_init();
            mmc_select();
            pf_read(&buf, sizeof(buf), &cnt);
            mmc_dselect();
            vs1011_spi_init();
            loop_until_bit_is_set(PINB, PB1);
            vs1011_xselect();
            for (int i = 0; i < cnt; i++)
            {
                        spi_write_byte(buf[i]);
                    }
            vs1011_xdselect();

        }
        uart_puts("end.\r\n");
    }

Atmega32 работает на частоте 8мгц. Не хватает скорости чтения с SD карты?

Сообщение отредактировал Pentium02 - Apr 5 2010, 21:00
Go to the top of the page
 
+Quote Post
Pentium02
сообщение Apr 5 2010, 22:54
Сообщение #4





Группа: Участник
Сообщений: 4
Регистрация: 5-07-09
Пользователь №: 50 937



да и sonycman спасибо большое.

забыл сказать, для работы с sd картой использую легкую версию библиотеки elm chan'a
Go to the top of the page
 
+Quote Post
dx40
сообщение Apr 9 2010, 08:02
Сообщение #5


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

Группа: Свой
Сообщений: 147
Регистрация: 4-05-06
Пользователь №: 16 779



Цитата(Pentium02 @ Apr 6 2010, 01:10) *
В общем теперь такая проблема, декодирование происходит с задержками примерно в четверть секунды (может и меньше, я так, на глаз) между фрагментами по 32 байта


Посмотрите, что творится на DREQ. Очень похоже, что поток данных слишком медленный. 32 байта - вообще ни о чем. vs1011 после сигнала DREQ жрет до двух килобайт данных за раз. Попробуйте читать хотя бы по килобайту с карточки за раз и скармливать VSке (не забывая контролировать DREQ после каждых 32 байт). И попробуйте mp3 файл с битрейтом в 32 кбита.

PS: Мега32 и 8 Мегагерц - не тесновато ли будет? Особенно если нужны mp3 с высоким битрейтом, индикация и прочие сервисные функции... У меня 644 на 12 - 320 играется с некоторым трудом, правда много времени жрет цветной графический экран, ИК ПДУ и прочие свистелки.
Go to the top of the page
 
+Quote Post
Pentium02
сообщение Apr 9 2010, 22:27
Сообщение #6





Группа: Участник
Сообщений: 4
Регистрация: 5-07-09
Пользователь №: 50 937



Спасибо уже разобрался. Помимо маленького буфера, на DREQ почему-то всё время была еденица (к земле через резюк подтянут), и вместо звука было бульканье, пока не подтянул ногу TEST на DVCC. dry.gif
Да, 8мгц оказалось мало для 320кбит, повесил кварц на 16мгц, производительности хватает. Буфер чтения файла с карты 416байт, меньше уже начинает заикаться. Из свистелок позже попробую подцепить дисплей ls020 от siemens CX65.

Сообщение отредактировал Pentium02 - Apr 9 2010, 23:10
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 02:44
Рейтинг@Mail.ru


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