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