Hallo zusammen,
ich arbeite schon länger an einem Projekt, in dem ich Daten auf einem
SAM V71 via eingerichteter USART-Schnittstelle übermitteln möchte.
Leider schaffe ich es nicht eine entsprechende Funktion zu schreiben,
die diese Aufgabe erfüllt.
Eine beispielhafte Struktur meiner Daten sieht wie folgt aus:
Da ich also ein Array mit einer gewissen Datengröße übertragen möchte,
muss die Übertragung via USART im Zusammenhang mit dem XDMAC Modul
geschehen oder könnte die Lösung auch anders aussehen? Ich sitze
jedenfalls schon etwas länger an dem Problem, dass ich es nicht schaffe
eine richtige Konfiguration für entsprechende USART-Übertragung mit
XDMAC zu erstellen.
Ich würde mich freuen, wenn ihr mir helfen könnt oder jemand mögliche
Erfahrungen mit mir teilt.
Gruß,
TomMy
Hi,
Niemand zwingt Dich zu DMA.
Wenn Du die Zeit hast, synchron zu übertragen, warum nicht?
ASynchron sollte aber gehen ausser Du macht sonst noch total
zeit abhängige Geschichten.
Ohne Code kann Dir da aber auch keiner bei DMA helfen...
Oder hast Du die Probleme, diese Struktur zu senden ?
Gruß N2
Also ich empfange Daten von 9 ADCs durch eine SPI-Schnittstelle, die
entsprechend verarbeitet, fouriertransformiert etc. werden und in der
oben dargestellten Struktur hinterlegt werden. Hatte ein ähnliches
Projekt schon mal lauffähig auf einem SAM4(mit DMAC- und PMC-Modul),
aber bei dem V71 habe ich einfach Probleme in Verbindung mit dem XDMAC
überhaupt was zu senden. Die Doku beim neuen Board empfinde ich da
einfach lange nicht so hilfreich und enthält auch nicht gerade viel
Beispielcode.
Als eine Möglichkeit zur Initialisierung eines entsprechenden Kanals
habe ich z.B.den folgenden Code:
TomMy schrieb:> Aber ich komm echt nicht drauf, wie ich das zum erfolgreichen Senden mit> meiner Struktur verknüpfen könnte.
Also versteh ich dich richtig, dass dieser Code funktioniert - um dein
'Decoded_Byte_Array' zu versenden?
Falls ja, warum legst du dann den 'mbr_sa' nicht auf die Adresse deiner
Struktur?
Genauso bin ich auch vorgegangen. Damit ihr es einmal viel besser
nachvollziehen könnt, seht ihr unten mal mein Programm auf das nötigste
reduziert mit einem Testarray "src_buf". Selbst bei dieser einfachen
Struktur erzeuge ich keine Ausgabe von Daten über die
USART-Schnittstelle. Ich bin mir auch ziemlich sicher, dass in
"conf_clock" und "conf_uart_serial" die richtigen Konfigurationen für
USART und Clock hinterlegt sind, sodass ich vermute, dass meine Main
noch einen groben Fehler enthält.
Vielen Dank schon mal für die jetzigen Antworten und mögliche weitere,
die folgen!
Gruß,
TomMy
Vielen Dank schon mal, Adam! Tatächlich hatte ich das falsch gesetzt und
am falschen Port gewartet.
Scheint aber leider nicht der einzige Fehler gewesen zu sein, da eine
Ausgabe immer noch nicht vorhanden ist :(
Kannst da mal schauen...
https://github.com/avrxml/asf/blob/master/sam/drivers/spi/spi_xdmac_example/spi_xdmac_example.c
Da überträgt er via SPI, sollte vom Aufbau das gleiche sein -
jedoch siehts deinem sehr ähnlich.
edit:
Leider hab ich kein SAM V Board, sonst würd ich es gleich mal selbst
versuchen ;-)
Beim V71 gibts halt kein Bsp. mit USART und XDMAC, hab ich auch geschaut
- aber schau mal bei anderen µC die XDMAC haben, ob da was hinterlegt
ist und der Aufbau gleich ist, vllt. XMEGA Reihe oder andere Cortex µC
mit XDMAC.
Bei dem SAM4E hab ich auch nach etwas gesucht, gabs net, aber Infos beim
anderen µC Typ gefunden (Application Notes / Example Projects).
Muss man doch nur in die Referenz schauen ;) . Also im Normalfall war es
immer so wenn man die Peripherie(Usart) aktiviert das dann der Transfer
startet.
Versuche doch erst mal so etwas auf die Usart auszugeben. Wenn das
klappt dann fehlt der trigger und der ist eigentlich wie gesagt das man
die Komponente aktiviert. Diese triggert sich dann selber durch das
entsprechende BIT in der Usart wenn der Buffer leer ist. Der DMA
Controller schiebt dann Daten nach...
Welche UART nutzt du als CONF_UART für deine Debug-Ausgaben,
hoffe diese und die für XDMAC sind nicht die gleichen?
Hast du mal versucht, auf der gewünschten UART erstmal etwas ganz
"normal" zu versenden? mittels uart_write / uart_put - wie die Fkt. auch
heißen.
Ich nutze USART1 als CONF_UART. Ich bin anfangs mit einem kleinem
Programm mit der selben Konfiguration und einer putchar-Fkt gestartet,
das zu Testzwecken zunächst einfache Characters überträgt. Das hat auch
alles soweit geklappt ;)
Also möchtest du dein "Console-Port" (USART1) mit DMA nutzen?
Weil:
TomMy schrieb:> Ich nutze USART1 als CONF_UART
Das bedeutet: USART1 = CONF_UART = USART1_DMAC_ID_TX
Hey TomMy,
hab da was für dich :-)
Bei Atmel-Start
http://start.atmel.com/#examples/SAMV71XplainedUltra
"Search: DMA"
gibt es ein Beispiel mit USART und DMA.
Könntest ja da mal schauen, ob du was findest und es mit deinem Source
vergleichen (auch wenn da der Source Aufbau anders ist) -> ASF4.