Hallo, ich möchte gerne den I2C mit dem DMA eines STM32F303 betreiben. Hierzu ist mir was im Reference Manual aufgefallen, was nicht ganz verstehe. Und zwar kann man im DMA direkte Registeradressen einstellen, auf die das DMA-Modul zugreift (z.B. die Datenregister des I2C-Moduls). Zusätzlich können beim I2C-Modul im Register CR1 die Bits RXDMAEN bzw. TXDMAEN gesetzt werden. Was bewirken diese beiden Bits nun genau? Müssen diese gesetzt werden, wenn ich das ganze mit DMA betreibt? Im Reference Manual steht hierzu folgendes (Seite 870): DMA (Direct Memory Access) can be enabled for transmission by setting the TXDMAEN bit in the I2C_CR1 register. Data is loaded from an SRAM area configured using the DMA peripheral (see Section 13: Direct memory access controller (DMA) on page 263) to the I2C_TXDR register whenever the TXIS bit is set. bzw. für RX: DMA (Direct Memory Access) can be enabled for reception by setting the RXDMAEN bit in the I2C_CR1 register. Data is loaded from the I2C_RXDR register to an SRAM area configured using the DMA peripheral (refer to Section 13: Direct memory access controller (DMA) on page 263) whenever the RXNE bit is set. Only the data (including PEC) are transferred with DMA. Hier noch ein Link zum Reference Manual: http://www.st.com/content/ccc/resource/technical/document/reference_manual/4a/19/6e/18/9d/92/43/32/DM00043574.pdf/files/DM00043574.pdf/jcr:content/translations/en.DM00043574.pdf Schonmal Vielen Dank für eure Hilfe!
Fragender schrieb: > Zusätzlich können beim I2C-Modul im Register CR1 die Bits RXDMAEN bzw. > TXDMAEN gesetzt werden. > Was bewirken diese beiden Bits nun genau? Müssen diese gesetzt werden, > wenn ich das ganze mit DMA betreibt? ohne die CPU oder die Doku zu kennen, was könnte wohl RXDMAEN bedeuten?` RX_DMA_EN -> Recive DMA Enable damit würde ich schlussfolgern, das man zum Empfang mit DMA das bit setzen muss.
Der DMA Controller bietet für jede seiner beiden Einheiten eine Reihe an Kanälen an, meist 7 oder 8 verschiedene, alle frei konfigurierbar. Grundsätzlich muss bei der Konfiguration eines Kanals zwischen 2 Szenarien unterschieden werden. 1.) Der Kanal wird via Software getriggered. 2.) Der Kanal wird via Hardware getriggered. Für den 2.) Fall bietet jeder Kanal eine Reihe verschiedener Requests an, wie für I2C etwa einen RX- und einen TX- Request. Setzt man die entsprechenden Bits für diesen Requests, so wird der Kanal "intern mit der I2C Schnittstelle verbunden" und reagiert von nun an auf Events die von der I2C Schnittstelle ausgehn. Nun will man natürlich nicht, dass die I2C den entsprechenden DMA Kanal triggered, ohne dass man diesen überhaupt nutzen will. Aus diesem Grund muss es für I2C eigene "DMA-Enable" Bits geben. Für den DMA muss es das "Enable" Bit ebenfalls geben, da man den DMA ja auch komplett ohne Request nutzen kann, um etwa Daten von A nach B zu kopieren. Zur Nutzung des DMAs mit der I2C Schnittstelle müssen alle "Enable" Bits entsprechend gesetzt werden.
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.