C USARTD0 als SPI?

Janiiix3

Aktives Mitglied
28. Sep. 2013
1.333
10
38
Hannover
Sprachen
  1. ANSI C
  2. C#
Hallöchen,

Ich sitze gerade mal wieder an meinem Evaluation Board.
Mir stellt sich gerade die Frage, wie ich den externen Flash bedienen kann. Laut Zeichnung sind die SPI Pins vom Flash Baustein an "USARTD0" angeschlossen. Kann man den Intern umstellen (Mapping?) also das ich die SPI Pins auf andere I/O´s konfiguriere?

Das Board benutzt einen "ATXMEGA256A3BU".
 

Anhänge

  • spi_xmega256a3bu.png
    spi_xmega256a3bu.png
    85 KB · Aufrufe: 9
Der USART kann auch als SPI (Master?) genutzt werden. Schau doch einfach mal diesbezüglich ins Datenblatt.
 
Okay...
 
Der UART kann auch als USART genutzt werden - das S steht für synchronous. Er besitzt also ein Clock-Latch-Modul. Von dort ist's dann zum SPI nicht mehr weit.k
Unabhängig davon kann eine Schnittstelle natürlich auch in Software an beliebigen Beinen nachgebildet werden. Gerade bei Hochsprachen, wo das dann in Form irgendwelcher Bibliotheken eingebunden werden kann oder gar Bestandteil der IDE ist. Manchen ist dann gar nicht bewußt, das er unnötigen Code/Rechenzeit verbraucht, was die periphäre Hardware im Hintergrund selbst könnte.
 
Zuletzt bearbeitet:
Ich habe das "sanft" überlesen. Danke dir.
Das sollte aber logisch sein, dass Software ineffektiver ist als Hardware.
 
Verstehe ich das richtig, dass ich die "Baudrate" bzw, SCK genau so einstellen kann wie beim UART? Wird das genau so berechnet?
CLK / (BSEL / BSCALE)
 
Verstehe ich das richtig, dass ich die "Baudrate" bzw, SCK genau so einstellen kann wie beim UART? Wird das genau so berechnet?
CLK / (BSEL / BSCALE)

Wenn du das USART Modul im Master SPI Mode verwendest, kannst du SPI Clock folgendermaßen berechnen, bzw. BSEL...

xmega_master_spi_clk.png

Als Clock Source geht bei Master SPI nur der interne Takt für die Peripherie (fper).
 
Beim U(S)ART hast Du zwei Schieberegister, eins zum Senden (das an TxD angeschlossen ist), und eins zum Empfangen (an RxD). Beim echten SPI gibts nur ein gemeinsames, außerdem kehrt sich im Slave-Modus die Datenrichtung der Pins um (deswegen ja MO-SI, MI-SO).

@Dirk , ist das der Grund, warum der USART nur den Master-Mode nachbilden kann? Beim USI geht das mit dieser Einschränkung doch auch.

P.S.: gerade gesehen, daß der XMega-USART auch IrDA unterstützt, und fraktionale(?) Baudraten... das macht den neuen "XTiny" noch interessanter
 
@Dirk , ist das der Grund, warum der USART nur den Master-Mode nachbilden kann? Beim USI geht das mit dieser Einschränkung doch auch.

Dem USART Modul fehlt der SelectSlave Pin und die Logik dahinter, deswegen geht Slave nicht. Bei Master kann man ja jeden beliebigen freien IO pin für SelectSlave Signal verwenden, wenn benötig.
 
Es fehlen:
  • SlaveSelect mit tristate-Schalten des DO-Pins bei nonselect
  • Datenrichtungsumkehr zwischen Master- und Slavemode
Beides hast Du beim USI auch nicht, und da gehts doch trotzdem (muß man selbst realisieren, aber das schieberegister taktet dann in Hardware)
 
Beides hast Du beim USI auch nicht, und da gehts doch trotzdem (muß man selbst realisieren, aber das schieberegister taktet dann in Hardware)
Dann fallen mir noch folgende Gründe ein ...
  • USART-Modul ist kein USI-Modul
  • Entwicklungen liegen zeitlich auseinander
  • Kostengründe
  • andere Abteilung
  • Entwickler vom USART Modul macht beim Entwickler vom USI Modul immer Striche auf die Kaffeeliste, der ist dann stinkig und rückt seinen VHDL Source nicht raus ;)
 
  • Like
Reaktionen: LotadaC
Nein, das bedeutet nur, dass das SPI Modul seinen Takt über den fractional Baud Rate Generator erhält und dieser erhält wiederum seinen Takt über Peripheral Clock. Also extern takten kann man das SPI Modul nicht, ist auch egal. Das hat nichts mit PLL zu tun.
 
Okay,

Das heißt ich muss erst Prescaler A - C konfigurieren und dann habe ich ClkPer?

ATXMEGA256A3BU_PRESCALER.jpg

Das ist doch aber ein bisschen doof, dass heißt wenn ich diesen USARTD0_SPI nutzen möchte, muss ich dafür extra meine ClkCPU runter schrauben...
 
Du hast noch Prescaler B und C, die die CPU-Clock nicht betreffen, um die peripheral Clock zu drosseln. Und im USART-Modul selbst dann nochmal BSEL (aber nicht BSCALE).

Nachtrag: war natürlich Quark, aber BSEL sollte reichen
 
Zuletzt bearbeitet:
Du hast noch Prescaler B und C, die die CPU-Clock nicht betreffen, um die peripheral Clock zu drosseln. Und im USART-Modul selbst dann nochmal BSEL (aber nicht BSCALE).

Laut Diagramm sehe ich aber das Prescaler B sowohl C die CLK_CPU beeinflussen.
Wenn ich dort Prescaler_A.: CLK/1 und Prescaler _B.: CLK/1 einstelle, kann ich nur noch CLK_PER durch BSEL drosseln. Ich arbeite mit 32Mhz (muss aktuell zwar noch nicht sein aber wer weiß), dass würde bedeuten.: 32.000.000 / BSEL ?
 
Also irgendwo oben habe ich ja mal ein Screenshot mit Gleichungen reingestellt, nach BaudRate oder BSEL aufgelöst.
 
Also irgendwo oben habe ich ja mal ein Screenshot mit Gleichungen reingestellt, nach BaudRate oder BSEL aufgelöst.

Ist ja inordnung.
Mir ist jetzt immer noch nicht klar, wenn ich mit einer Frequenz von 32Mhz arbeite (CPU Clock) und ich an den Prescalern nichts weiter einstelle, ob ich dann mit ClkPer = 32Mhz rechnen kann.

Nachtrag.:

Habe dort glaube ich was verwechselt. BSEL ist ja 12 Bit breit (4095 Dez.) Das habe ich mit BSCALE verwechselt.

32.000.000 / 4096 wären dann ja 7,814 kHz, dann passt mein Verständnis und meine Rechnung.
 
Zuletzt bearbeitet:
Ist ja inordnung.
Mir ist jetzt immer noch nicht klar, wenn ich mit einer Frequenz von 32Mhz arbeite (CPU Clock) und ich an den Prescalern nichts weiter einstelle, ob ich dann mit ClkPer = 32Mhz rechnen kann.

CLKper hat gleiche Frequenz wie CLKcpu und kann aktiv sein, wenn CLKcpu inaktiv ist (sleep mode).
CLKper ist synchron zu CLKcpu.

Habe dort glaube ich was verwechselt. BSEL ist ja 12 Bit breit (4095 Dez.) Das habe ich mit BSCALE verwechselt.

32.000.000 / 4096 wären dann ja 7,814 kHz, dann passt mein Verständnis und meine Rechnung.

?

xmega_master_spi_clk.png

Hier noch einmal die Gleichungen.
 
Moin.

#define SPI_USART_CALC_BSEL(BAUD) ((F_CPU/(BAUD*2))-1)

mache ich hier was falsch um BSEL zu berechnen? Komme irgendwie nicht auf einen Nenner...
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)