Forum: Mikrocontroller und Digitale Elektronik Probleme mit einem VS1011


von Luca B. (lucabert)


Angehängte Dateien:

Lesenswert?

Hallo, Leute!

Nachdem ich geschafft habe, den Display und das DCF77-Modul zu steuern, 
wollte ich mich mit dem MP3-Decoder mich beschäftigen.

Ich habe einige Codebeispiele im Internet gefunden und probiert.
Leider kommt kein Ton raus...

Als Anhang das Schema meiner Schaltung.

Mein Code:
1
  mp3Init();
2
  tdaTurnOn();
3
  tdaLoud();
4
5
  for (i=0;i<3;i++)
6
  {
7
    sine_on(62);
8
    _delay_ms(100);
9
    sine_off();
10
    _delay_ms(100);
11
  }
12
13
  tdaMute();
14
  tdaTurnOff();
15
  while(1)
16
    ;

Die Init-Funktion sieht so aus:
1
  TDA_ONOF_DDR |= _BV(TDA_ONOF_PIN);
2
  TDA_MUTE_DDR |= _BV(TDA_MUTE_PIN);
3
// Erstmal den Verstärker ausschalten!
4
  tdaTurnOff();
5
  tdaMute();
6
7
  VS_DDR |= _BV(VS_CS_PIN);
8
  VS_DDR |= _BV(VS_RESET_PIN);
9
  VS_DDR &= ~_BV(VS_DREQ_PIN);
10
  VS_PORT |= _BV(VS_DREQ_PIN);
11
  VS_DDR |= _BV(VS_BSYNC_PIN);
12
  vsClearBSync();
13
  vsSetChipSelect();
14
  vsSetReset();
15
16
// SPI einrichten
17
  SPI_DDR |= _BV(MOSI) | _BV(SCK);        // MOSI und SCK als Output
18
  SPI_DDR &= ~_BV(MISO);                  // MISO als Input
19
  SPI_PORT &= ~_BV(SCK);
20
  SPCR |= _BV(SPE) | _BV(MSTR);           // SPI aktivieren
21
  dummy = SPSR;                           // Status löschen
22
23
// Init der VS1001
24
  _delay_us(3000);
25
// Hard Reset
26
  vsClearReset();
27
  _delay_ms(100);
28
  vsSetReset();
29
  _delay_ms(5);
30
31
// Soft Reset
32
  _delay_ms(200);
33
  buf[0] = 0x04;
34
  vsWriteData(0, 1, buf);  // set bit 2
35
  _delay_ms(2);
36
37
  loop_until_bit_is_set(VS_PIN, VS_DREQ_PIN);
38
39
  // set CLOCKF for 24.576 MHz
40
  buf[0] = 0;
41
  vsWriteData(3, 1, buf);
42
43
  vsSendNulls(32);

Und ein paar andere Funktionen/Defines:
1
#define tdaTurnOn()             TDA_ONOF_PORT &= ~_BV(TDA_ONOF_PIN);
2
#define tdaTurnOff()            TDA_ONOF_PORT |= _BV(TDA_ONOF_PIN);
3
#define tdaLoud()               TDA_MUTE_PORT &= ~_BV(TDA_MUTE_PIN);
4
#define tdaMute()               TDA_MUTE_PORT |= _BV(TDA_MUTE_PIN);
5
6
void vsSendNulls(uint8_t n)
7
{
8
  while(n--)
9
    vsSendData(0);
10
}
11
12
inline void vsSendData(unsigned char byte)
13
{
14
  vsSetBSync();
15
16
  SPDR = byte;
17
18
  asm volatile("nop");
19
  asm volatile("nop");
20
  asm volatile("nop");
21
22
  vsClearBSync();
23
24
  loop_until_bit_is_set(SPSR, SPIF);
25
}
26
27
void vsWriteData(uint8_t address, uint16_t count, uint16_t *data)
28
{
29
  vsClearChipSelect();
30
31
  spiWriteByte(VS1001_WRITE);
32
  spiWriteByte(address);
33
34
  while(count--)
35
  {
36
    spiWriteByte((uint8_t)((*data) >> 8));
37
    spiWriteByte((uint8_t)*data);
38
    data++;
39
  }
40
41
  vsSetChipSelect();
42
43
  _delay_ms(5);
44
}
45
46
void sine_on(uint8_t freq)
47
{
48
  uint8_t i,buf[4];
49
50
  // sine on
51
  buf[0] = 0x53;  buf[1] = 0xEF;  buf[2] = 0x6E;  buf[3] = freq;
52
53
  for (i=0;i<4;i++)
54
    vsSendData(buf[i]);
55
  vsSendNulls(4);
56
}
57
58
void sine_off(void)
59
{
60
  uint8_t i,buf[4];
61
62
  // sine off
63
  buf[0] = 0x45;  buf[1] = 0x78;  buf[2] = 0x69;  buf[3] = 0x74;
64
65
  for (i=0;i<4;i++)
66
    vsSendData(buf[i]);
67
  vsSendNulls(4);
68
}

Ich habe mich erwartet ein "Beep" zu hören, aber leider, außer ein "Tik" 
beim Einschalten und Ausschalten des Verstärkers und eine leise Summen 
ist überhaupt nicht zu hören...

Die Kontakte an der Platine scheinen richtig gelötet zu sein.
Bevor ich annehme, daß der VS1011 defekt ist, könnt ihr mir sagen, ob 
Fehler in meinem Code gibt?

Danke
Luca Bertoncello

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.