Forum: Mikrocontroller und Digitale Elektronik Ist der Chip kaputt oder mache ich was falsches?


von Luca B. (lucabert)


Angehängte Dateien:

Lesenswert?

Hallo, Leute!

Immer für mein Projekt, mit dem ich seit lange euch nerve...

Ich weiß nicht, ob ich was falsches mache, oder ob einfach der VS1011e 
"mülltonnenbereit" ist

Wenn ich den Wecker einschalte, lese ich die Lautstärke von einer 
Konfigurationsdatei auf der SD-Karte und schicke den Wert dem VS1011e.
Nur sehr selten ist diese Lautstärke richtig. Fast immer ist es entweder 
zu laut oder zu leise.
Auch wenn ich später die Lautstärke ändern, der Wert X ist fast nie die 
gleiche Lautstärke.
Auf gutem Deutsch: es gibt keine echte Korrespondenz zwischen den Wert, 
den ich dem VS1011e schicke, und die Lautstärke des Signals, das vom 
Lautsprecher kommt.

Zweites Problem: das Signal kommt NUR von einem Kanal, manchmal der 
rechte, manchmal der linke.
Eine Änderung der Lautstärke hat oft als Folge, daß das Signal von dem 
anderen Kanal zu hören ist (aber nicht mehr von dem vorigen).

Ich bezweifel, daß ich was falsches vom Programm mache, denn ich die 
Lautstärke nur so ändern:
1
  vsClearChipSelect();
2
  _delay_ms(10);
3
  spiWriteByte(VS1001_WRITE);
4
  _delay_ms(10);
5
  spiWriteByte(SCIREGISTER_VOLUME);
6
  _delay_ms(10);
7
  spiWriteByte(volume);
8
  _delay_ms(10);
9
  spiWriteByte(volume);
10
  _delay_ms(10);
11
  vsSetChipSelect();
12
  _delay_ms(100);

volume ist ein uint8_t und SCIREGISTER_VOLUME ist 0x0B. Alles wie in der 
Dokumentation geschrieben.

Eure Meinung?

Danke
Luca Bertoncello

von Thomas B. (escamoteur)


Lesenswert?

Hi,

Volume  muss ein uint16_t sein, wobei die oberen 18 Bit den einen und 
die unteren den anderen Kanal setzen. Siehe Seite 28 des Datenblatts.

Gruß
Tom

von Luca B. (lucabert)


Lesenswert?

Thomas Burkhart schrieb:

> Volume  muss ein uint16_t sein, wobei die oberen 18 Bit den einen und
> die unteren den anderen Kanal setzen. Siehe Seite 28 des Datenblatts.

Das ist klar, aber über SPI kann ich nur 8 Bits schicken (mindestens bei 
dem HW-SPI).
Deswegen, wie du siehst, schicke ich ZWEIMAL die gleiche Lautstärke.
Also, der VS1011e bekommt 16 Bits.

Grüße
Luca

von Thomas B. (escamoteur)


Lesenswert?

Schon mal das Delay dazwischen rausgelassen?

wieso kannst Du kein 16Bit SPI senden?

von Luca B. (lucabert)


Lesenswert?

Thomas Burkhart schrieb:
> Schon mal das Delay dazwischen rausgelassen?

Ja, keine Änderung!

> wieso kannst Du kein 16Bit SPI senden?

Na, SPDR ist ein 8-Bit-Register, oder?
Jedenfalls, meine Funktion spiWriteByte ist wie folgendes definiert:
1
/**
2
 * Schickt ein Byte über SPI
3
 *
4
 * @param uint8_t byte        der Byte zu schicken
5
 */
6
#define spiWriteByte(__byte)      { SPDR = __byte; _delay_us(10); loop_until_bit_is_set(SPSR, SPIF); }

Ist es falsch?

Danke
Luca Bertoncello

von Thomas B. (escamoteur)


Lesenswert?

Stimmt hast recht, ich war grad beim STM32

Ich nehme den VS1011, da sieht mein Code so aus um ein Commando zu 
senden:


    PORTB &= ~(1 << VSCS);

    SPDR = 0x2; //write command
    while(!(SPSR & (1<<SPIF)));

    SPDR = reg;
    while(!(SPSR & (1<<SPIF)));

    SPDR = (uint8_t) (value >> 8);
    while(!(SPSR & (1<<SPIF)));

    SPDR = (uint8_t) value;
    while(!(SPSR & (1<<SPIF)));



    PORTB  |= (1 << VSCS);

Also ziemlich ähnlich.

Keine Anhnung was es sonst sein könnte.

von Luca B. (lucabert)


Lesenswert?

Thomas Burkhart schrieb:

> Ich nehme den VS1011, da sieht mein Code so aus um ein Commando zu
> senden:
...
> Also ziemlich ähnlich.

Ich würde sagen, daß bis zu der 10µS Pause vor dem while der Code gleich 
ist...

> Keine Anhnung was es sonst sein könnte.

Also, konnte es sein, daß der Chip kaputt ist?
Das Problem mit der Lautstärke habe ich eigenltlich immer gehabt, das 
Problem daß das Signal nur von einem Lautsprecher weiß ich nicht...
Bei der Entwicklung habe ich nur einen kleinen Lautsprecher an einem 
Kanal angeschloßen...

Grüße
Luca Bertoncello

von Thomas B. (escamoteur)


Lesenswert?

Was ich noch mache ist, dass ich am Anfang das SREG sichere und per 
cli() alle IRQs abschalte. Könnte ja sein, dass die FAT Lib sonst 
dazwischen funkt.

Gruß
Tom

von Luca B. (lucabert)


Lesenswert?

Thomas Burkhart schrieb:
> Was ich noch mache ist, dass ich am Anfang das SREG sichere und per
> cli() alle IRQs abschalte. Könnte ja sein, dass die FAT Lib sonst
> dazwischen funkt.

Ugh?!?
Wenn du die Interrupts abschaltest, wie kann dann SPI funktionieren?
Ich dachte, man braucht die Interrupts, oder?

Jedenfalls, die Änderung der Lautstärke wird gemacht wenn die 
FAT-Library NICHT im Betrieb ist.

Grüße
Luca Bertoncello

von Thomas B. (escamoteur)


Lesenswert?

Nee, wieso sollte man die IRQs brauchen, wenn Du das ready bit pollst?
Tom

von Luca B. (lucabert)


Lesenswert?

Thomas Burkhart schrieb:
> Nee, wieso sollte man die IRQs brauchen, wenn Du das ready bit pollst?
> Tom

Dann habe ich die Dokumentation falsch verstanden...
Ich dachte, man brauch den Interrupts um den Clock zu generieren...

Ich werde was probieren!

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.