[XMEGA] Nicht deterministische start-up Zeit beim UART

Gast #3480886
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
}
Angehängte Dateien:
(Firma: TravelRec.) Persönliche Seite #3481042
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren