Hallo, ich habe hier einen SAMD51 bei dem ich den DMA verwenden möchte. Das funktioniert so lange bis ich das Autoinkrement von Source und/oder Destination anschalte. Dann wird nichts kopiert und das "Channel Transfer Error" Flag (DMAC->Channel[0].CHINTFLAG.bit.TERR) gesetzt. Im Anhang ist ein Minimalbeispiel, das von RAM nach RAM kopiert. Das Einkommentieren der Zeilen 51 und/oder 52 Triggern den Fehler. Für Hinweise was hier das Problem ist wäre ich sehr dankbar. Grüße
Errata gelesen? Die sams70 haben da einen Bug in die Richtung...
Danke für den Hinweis, da habe ich schon nachgeschaut. Das Einzige was noch entfernt damit zu tun haben könnte ist "DMAC in Debug Mode", deshalb habe ich auch DBGCTRL.DBGRUN gesetzt.
>dmadesc[0].SRCADDR.reg = (uint32_t)&sendbuffer;
Bei Blocktransfer muss da stehen wo man am Ende ankommen will.
Datenblatt Rev E, Seite 386:
"When source address incrementation is configured (BTCTRL.SRCINC=1),
SRCADDR is calculated as
follows:
If BTCTRL.STEPSEL=1:
SRCADDR = SRCADDRstart + BTCNT *(BAETSIZE+1) *2^STEPSIZE
If BTCTRL.STEPSEL=0:
SRCADDR = SRCADDRstart + BTCNT * (BEATSIZE+2)
• SRCADDRSTART is the source address of the first beat transfer in the
block transfer
• BTCNT is the initial number of beats remaining in the block transfer
• BEATSIZE is the configured number of bytes in a beat
• STEPSIZE is the configured number of beats for each incrementation"
dmadesc[0].SRCADDR.reg = (uint32_t)&sendbuffer[16];
Aaaah, da das Array ziemlich am Anfang des SRAM stand, lag die vom DMA errechnete Startadresse in einem ungültigen Speicherbereich. Daher das Transfer Error Flag. Ich danke dir vielmals. Ein klassischer Fall von RTFM. Im Anhang noch das jetzt Funktionierende Beispiel.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.