Dr. Sommer schrieb:
> Sebastian Kaulitz schrieb:
>> Wozu nun also die Angabe der Daten in der Funktion, wenn doch bei der
>> DMA als CMAR sowieso die SPI_BASE plus OFFSET für das Datenregister
>> angegeben wird??
>
> Und die Speicher Adresse der Daten muss auch irgendwo angeben werden:
>
> Sebastian Kaulitz schrieb:
>> Der DMA wird die Speicheradresse der Daten angegeben. (Memory)
>
> Und das ist hier pData. Woher soll die Funktion sonst wissen was
> übertragen wird?
Das geschieht doch mit der folgenden Anweisung:
1 | uint32_t spiPeriphAdress = SPI1_BASE + 0x0C;
|
2 | uint8_t txData[3] = {0,1,2,3,4,5,6,7,8,9};
|
3 |
|
4 | hdma_spi1->Instance->CPAR = spiPeriphAdress;
|
5 | hdma_spi1->Instance->CMAR = (uint32_t) txData;
|
6 | hdma_spi1->Init.PeriphInc = DMA_PINC_DISABLE;
|
7 | hdma_spi1->Init.MemInc = DMA_MINC_ENABLE;
|
Damit schreibt mir die DMA die Daten vom Buffer data2send in das
Datenregister SPI_DR.
Sourceadresse ist also data2send und
Zieladresse ist SPI_DR.
Jetzt muss doch die SPI doch nichts mehr wissen. Dass es die Daten in
seinem eigenen Speicher SPI_DR senden muss, weiss es hoffentlich selbst.
Das ist nämlich das Interface von dem aus txData gesendet und von dem
aus ins rxData geschrieben wird.