Forum: Mikrocontroller und Digitale Elektronik ATSAM7S256 SSC Transmit Holding Register wird nicht gesetzt


von Florian B. (Gast)


Lesenswert?

Hallo

Ich bin gerade dran die SSC Schnittstelle für den AT91SAM7S256 zu 
konfigurieren (ohne PDC) und möchte Daten senden. Jedoch habe ich beim 
Debuggen festgestellt, dass das Transmit Holding Register den 
zugewiesenen Wert nicht übernimmt, sondern auf 0 bleibt.

pSSC->SSC_THR = encoded_tx;

Den Wert von encoded_tx habe ich kontrolliert. Ich habe auch schon das 
Signal am Pin angeschaut und dort bekomme ich nur einen HIGH Pegel. 
Einen Clock und ein Frame Signal bekomme ich am Ausgang.
In Verwendung habe ich das AT91SAM7S-EK Evalboard.
Über ein Tipp oder Hinweis bin ich sehr dankbar.

Gruß
Florian

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

THR ist ein Write-Only-Register, du kannst da nichts heraus lesen. Poste 
doch mal deine Konfiguration.

von Florian B. (Gast)


Lesenswert?

Hallo,

stimmt, ich habe auch die Flags, TXREADY und TXEMPTY im 
Statusregister(SSC_SR) angeschaut, die auf 1 bleiben.
Hier ist die Konfig:
1
 /* SSC clock */
2
  pPMC->PMC_PCER = (1 << AT91C_ID_SSC);
3
4
  /* PIO pins für SSC */
5
  pPIO->PIO_ASR = (SSP_TF | SSP_TK | SSP_TD | SSP_RD | SSP_RK | SSP_RF );
6
  pPIO->PIO_PDR = (SSP_TF | SSP_TK | SSP_TD | SSP_RD | SSP_RK | SSP_RF );
7
  /* Soft Reset */
8
  pSSC->SSC_CR = AT91C_SSC_SWRST;
9
  /* disable SSC interrupts */
10
  pSSC->SSC_IDR = 0xFFF;
11
  /* Clock für SSC MCK/4 */
12
  pSSC->SSC_CMR = 0x00000002;
13
  /* Recieve clock Mode Register */
14
  pSSC->SSC_RCMR = AT91C_SSC_CKS_RK | AT91C_SSC_START_FALL_RF;
15
  /* Recieve frame mode register */
16
  pSSC->SSC_RFMR = AT91C_SSC_DATLEN | AT91C_SSC_FSEDGE | AT91C_SSC_MSBF | AT91C_SSC_FSOS_POSITIVE;
17
  /* Transmit clock mode register */
18
  pSSC->SSC_TCMR = (AT91C_SSC_CKO_CONTINOUS | AT91C_SSC_START_CONTINOUS | AT91C_SSC_CKI);
19
  /* Transmit frame mode register */
20
  pSSC->SSC_TFMR = (AT91C_SSC_DATLEN | AT91C_SSC_MSBF | AT91C_SSC_FSOS_POSITIVE );
21
  /* enable SSC */
22
  pSSC->SSC_CR = (AT91C_SSC_TXEN | AT91C_SSC_RXEN);
23
 
24
  /* Senden */
25
  while(!(pSSC->SSC_SR & AT91C_SSC_TXRDY)){};
26
  pSSC->SSC_THR = 0xAAAAAAAA;

Gruß
Florian

von Florian B. (Gast)


Lesenswert?

Hallo,
hab beim Transmit Clock Mode Register eine falsche Konfiguration 
angegeben. Hier ist die Richtige:
1
pSSC->SSC_TCMR = (AT91C_SSC_CKO_CONTINOUS | AT91C_SSC_START_FALL_RF | (0xF << 24 ));

Gruß
Florian

von Florian B. (Gast)


Lesenswert?

Hallo,
ich habe nun den Fehler gefunden. Der Grund ist dass es während dem 
Debuggen nicht funktioniert. Wieso es im Debugmodus nicht funktioniert 
habe ich nicht herausgefunden. Ist der uC im Running Mode so sendet er 
die Daten.

Gruss
Florian

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.