STM32F303 SPI3 DMA2 negeneruje TC flag

Jan Waclawek konfera na efton.sk
Středa Srpen 14 17:24:19 CEST 2013


A co je rw_dummybyte? Neukazuje to nahodou niekam, kde sa "nesmie"
zapisovat? Nenastane nejaka chyba v DMA (t.j. nenastavi sa nejaky chybovy
flag)?

wek


----- Original Message ---------------

Subject: STM32F303 SPI3 DMA2 negeneruje TC flag
   From: Stano <stano.hw at gmail.com>
   Date: Wed, 14 Aug 2013 00:53:31 +0200
     To: HW-news <hw-list at list.hw.cz>

>Zdravim konferenci
>Uz sa peknych par hodin trapim z nasledovnym problemom.
>Potrebujem po odvysielani (a prijati) dat cez SPI nahodit CS. Chcel som 
>pouzit TC flag DMA na RX SPI.
>Ak mam zapnute inkrementovanie pamate vsetko funguje dobre. Ak vsak 
>chcem vysielat a na prijimanych datach nezalezi je inkrementovanie RAM 
>vypnute. A v tomto pripade STM negeneruje TC flag. Pokusal som sa o 
>workarround s tym ze pockam na TC flag od zapisu do SPI a potom na RNXE 
>od SPI periferie, zial bez uspechu.
>Na STM32F103 som na tento problem nenarazil aj ked DMA periferia je 
>velmi podobna tej z F303.
>Stretol sa s tym niekto?
>Nastavenie DMA:
>
>    DMA_InitStructure.DMA_PeripheralBaseAddr     = 
>(uint32_t)(&(SPIMMC->DR));
>    DMA_InitStructure.DMA_PeripheralInc         = DMA_PeripheralInc_Disable;
>    DMA_InitStructure.DMA_PeripheralDataSize     = 
>DMA_PeripheralDataSize_Byte;
>    DMA_InitStructure.DMA_MemoryDataSize         = DMA_MemoryDataSize_Byte;
>    DMA_InitStructure.DMA_Mode                     = DMA_Mode_Normal;
>    DMA_InitStructure.DMA_Priority                 = DMA_Priority_High;
>    DMA_InitStructure.DMA_M2M                    = DMA_M2M_Disable;
>    /* DMA_SPI_RX */
>    DMA_InitStructure.DMA_MemoryBaseAddr     = (uint32_t)(&rw_dummybyte);
>    DMA_InitStructure.DMA_DIR                 = DMA_DIR_PeripheralSRC;
>    DMA_InitStructure.DMA_MemoryInc             = DMA_MemoryInc_Disable;
>    DMA_Init(SPIMMC_DMA_CHANNEL_RX, &DMA_InitStructure);
>
>    /* SPI_DMA_TX */
>    DMA_InitStructure.DMA_MemoryBaseAddr     = (uint32_t)buff;
>    DMA_InitStructure.DMA_DIR                  = DMA_DIR_PeripheralDST;
>    DMA_InitStructure.DMA_MemoryInc             = DMA_MemoryInc_Enable;
>    DMA_Init(SPIMMC_DMA_CHANNEL_TX, &DMA_InitStructure);
>    DMA_Cmd(SPIMMC_DMA_CHANNEL_RX, ENABLE);
>    DMA_Cmd(SPIMMC_DMA_CHANNEL_TX, ENABLE);
>/*--------------------------------------------------------------------*/
>/* DMA TC flag nenastavi a program zamrzne v nasledovnom riadku */
>while (DMA_GetFlagStatus(SPIMMC_DMA_FLAG_RX_TC) == RESET) { ; }
>
>S pozdravom
>       Stano



Další informace o konferenci Hw-list