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();
}
................
};
{
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, никак не могу разобраться :-( прошу вашей помощи.