Forum: Mikrocontroller und Digitale Elektronik [XMEGA] Nicht deterministische start-up Zeit beim UART


von Jiri D. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ein weiteres Problem mit dem ATxmega384C3 U(S)ART (im Master SPI Mode 
betrieben):
Das DATA Register wird immer zur gleichen Zeit beschrieben, aber die 
eigentliche Uebertragung findet manchmal frueher, manchmal spaeter 
statt.
Ist das normal?
Um eine Synchronisation zu erzwingen, habe ich ihn neu gestartet und die 
Konfiguration aktualisiert. Aber obwohl der Programmfluss zu Beginn 
absolut linear ist und das DATA Register immer zur selben Zeit 
beschrieben wird, schwankt die Zeit bis zum Beginn der Uebertragung.

o delay26.png: 848ns
o delay27.png: 974ns
Gemessen wurde die Laenge des ersten Pulses an MISO (hat sich angeboten, 
da der zum /CS passt)
C1: MOSI, C4: SCK, C2: MISO, C3: /CS

Mit welchem Parameter synchronisiert sich der UART/MSPI?
Prescaler/dem counter darunter, Enable/Disable (offensichtlich nicht), 
...?

EDIT:
Hier noch der Anfang der Funktion:
1
void task_read_adxl(void)
2
{
3
  ADXL_CS_PORT.OUTCLR = ADXL_CS_bm;
4
5
  AUXBUS_UART_MSPI.CTRLB &= ~(USART_RXEN_bm | USART_TXEN_bm);
6
  AUXBUS_PORT.DIRSET = AUXBUS_MOSI_bm;
7
  AUXBUS_PORT.AUXBUS_SCK_PINCTRL = AUXBUS_ADXL312_SCK_PINCTRL;
8
  AUXBUS_UART_MSPI.CTRLC = USART_CMODE_MSPI_gc | AUXBUS_ADXL312_UCPHA;
9
  AUXBUS_UART_MSPI.BAUDCTRLA = AUXBUS_ADXL312_BAUDCTRLA;
10
  AUXBUS_UART_MSPI.BAUDCTRLB = AUXBUS_ADXL312_BAUDCTRLB;
11
  AUXBUS_UART_MSPI.CTRLB = USART_RXEN_bm | USART_TXEN_bm;
12
13
  AUXBUS_UART_MSPI.DATA = ADXL_READ_bm | ADXL_MULTIBYTE_bm
14
      | ADXL_DATAX0_addr;
15
  // ...
16
}

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Jiri Denkdirwasaus schrieb:
> Mit welchem Parameter synchronisiert sich der UART/MSPI?
> Prescaler/dem counter darunter

Wenn neue Daten da sind, die zu übertragen sind, wird mit der nächsten 
steigenden SPI-Takt-Flanke (intern) die SPI-Clock gestartet. Wann die 
nächste interne Flanke kommt, entscheidet der Baudratenteiler, der von 
Fcpu herunterteilt. Da dieser Teiler ständig weiterläuft, kann die 
nächste Flanke unmittelbar kommen oder erst nach n Zyklen. Wenn Du immer 
eine gleiche Startzeit haben möchtest, setze BSEL zuerst auf 0x000, dann 
auf den gewünschten Wert und dann schreibe die Daten in das 
DATA-Register. Die Ausgabe erfolgt dann immer genau n-Zyklen nach dem 
Schreiben des neuen Wertes nach BSEL. Voraussetzung dafür ist, dass die 
Daten geschrieben sind, bevor BSEL abläuft.

von Jiri D. (Gast)


Lesenswert?

Danke, auch diese Mal hat es funktioniert :)

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.