Forum: Mikrocontroller und Digitale Elektronik ARM: SSC beim AT91SAM7S reagiert nicht wie gedacht


von Daniel D. (stachelsau)


Angehängte Dateien:

Lesenswert?

Hallo,

ich spiele gerade eine wenig mit dem SSC und einem Stereo-Codec herum. 
Der Codec ist dabei der Master. TF und TK sehen auch gut aus, aber was 
auf TD kommt, passt irgendwie nicht zu dem was ins THR geschrieben wird 
(ich schreibe direkt in das Register, also kein PDC).

Das ist der Teil, der die Werte ausgibt. out_val ist ein unsigned short 
int mit wechselnden Werten.
1
while(!pSSC->SSC_SR & AT91C_SSC_TXRDY);
2
pSSC->SSC_THR = out_val;
3
    
4
while(!pSSC->SSC_SR & AT91C_SSC_TXRDY);
5
pSSC->SSC_THR = 0x00;
6
    
7
while(!pSSC->SSC_SR & AT91C_SSC_TXRDY);
8
pSSC->SSC_THR = out_val;

Der SSC ist folgendermaßen eingestellt:
1
pSSC->SSC_TCMR = AT91C_SSC_CKS_RK |    
2
    AT91C_SSC_START_EDGE_RF |
3
    (1 << 16);      // STTDLY = 1
4
                            
5
pSSC->SSC_TFMR = (15) |            // 16 bit word length
6
        (0 << 8) |        // 1 word per frame
7
        AT91C_SSC_MSBF;    // MSB first

Erwartet hätte ich an dieser Stelle, das ich 3 Frames sehe, von denen 
der erste und letzte identische Werte enthalten. Der mittlere Frame 
müsste die 0 enthalten. Stattdessen sieht TD so aus, wie in der 
angehängten Datei.
Irgendwie fehlt da der Frame mit der 0 in der Mitte. Mir ist natürlich 
klar, dass das keine sinnvolle Ausgabe für den Codec ist, es geht nur um 
das grundsätzliche Verständnis. Ich habe dazu aber irgendwie keine 
intelligente Idee mehr. Oder läuft das nur mit dem PDC ordentlich?

Viele Grüsse,
Daniel

von Daniel D. (stachelsau)


Lesenswert?

War ja klar, dass es nur ne Kleinigkeit ist. Kaum setzt man die Klammern 
in der while-Schleifenbedingung richtig, funktionierts. Also Mädels, 
immer an die Klammern denken...

VG,
Daniel

von Thomas B. (a_user)


Lesenswert?

Hallo Daniel,
ich probiere auch gerade, die SSC Schnittstelle als Slave zu bedienen.
Ich versuche zyklisch mit einem externen Clock Daten aus dem µC 
auszulesen.

Mein Problem ist, dass die Daten erst ab der dritten Flanke des Clocks 
zur Verfügung stehen.

Wenn ich aber das Start Event im Transmit Clock Mode Register auf 
Continuous stelle, müssten doch ab der ersten Flanke die Daten 
ausgetaktet werden oder?

Ich habe auch schon versucht, den Start Event mit dem TF Signal zu 
erzeugen.
Kann es sein, dass wenn ich mit einem externen Clock arbeite das TF 
Signal nicht zur Verfügung steht? Denn nach Initialisierung bleibt das 
TF Signal auf Dauer "high".

Grüße

Thomas

von Thomas B. (a_user)


Lesenswert?

Das mit dem TF Signal ist geklärt. Das lag an der Initialisierung.

Das Problem der zeitversetzten Daten besteht leider immer noch. Denn 
auch das TF Signal wird erst drei Takte nach Anlegen des Clocks auf Low 
gezogen, und somit auch der Transmit Vorgang.

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.