Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: atmega32 и vs1011.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Pentium02
Здравствуйте всем. Подключил 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, никак не могу разобраться :-( прошу вашей помощи.
sonycman
Цитата(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, а уже потом передавайте данные.
Pentium02
В общем теперь такая проблема, декодирование происходит с задержками примерно в четверть секунды (может и меньше, я так, на глаз) между фрагментами по 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
да и sonycman спасибо большое.

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


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

PS: Мега32 и 8 Мегагерц - не тесновато ли будет? Особенно если нужны mp3 с высоким битрейтом, индикация и прочие сервисные функции... У меня 644 на 12 - 320 играется с некоторым трудом, правда много времени жрет цветной графический экран, ИК ПДУ и прочие свистелки.
Pentium02
Спасибо уже разобрался. Помимо маленького буфера, на DREQ почему-то всё время была еденица (к земле через резюк подтянут), и вместо звука было бульканье, пока не подтянул ногу TEST на DVCC. dry.gif
Да, 8мгц оказалось мало для 320кбит, повесил кварц на 16мгц, производительности хватает. Буфер чтения файла с карты 416байт, меньше уже начинает заикаться. Из свистелок позже попробую подцепить дисплей ls020 от siemens CX65.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.