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

 
 
> 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
 
Start new topic
Ответов
Pentium02
сообщение Apr 5 2010, 20:55
Сообщение #2





Группа: Участник
Сообщений: 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



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

 


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


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