Re: Ukončení přenosu využitím DMA

Tomáš Hamouz hamouz na divesoft.cz
Středa Září 14 15:17:07 CEST 2016


>>Debug build
>>
>>while(SET == DMA_GetChannelActiveStatus(SSP1_DMA_CHAN_RX)) {;}
> [...]
>>
>>  0000EDA4    040006DC    .word 0x040006DC       ; *DMA_Channel5



>>Release build
>>  0000A320    E59F4088    ldr r4, 0x0000A3B0
>>while(SET == DMA_GetChannelActiveStatus(SSP1_DMA_CHAN_TX)) {;}
>>  0000A3AC    780001A0    .word 0x780001A0       ; DMA_Channel5


> ??? V debug builde pouzivate kontrolu Rx a v release TX?

To je zase snaha být dokonalý :-(
V obou buildech se používá to samé, CH4 pro Rx a Ch5 pro Tx. Chtěl
jsem poslat vyčištěný kód a celé jsem to pak zbabral.
Pro klid duše jsem to teď opravil zpátky na ..Rx, přeložil a kód je
stejný, jen adresa DMA je 0x78000180 (Channel 4)


> ??? Tak Tx aj Rx je DMA_Channel5? (nemam tu kapitolu DMA nastudovanu, ten
> DMA vyzera byt vyrazne rafinovanejsi nez ktorykolvek z tych 2 ci 3 co sa
> pouzivaju v STM32)

Kanál je pro každý směr jiný, viz výše, jinak by to nemohlo vůbec fungovat.


> ??? Preco je v prvom pripade pouzity *pointer* (ten kam vedie? co je presne
> na tom pamatovom mieste?) a v druhom priamo adresa?

To je dané knihovnama, sám nevím proč.
V debug buildu se vytvoří pro každou periférii pointer a povinně se na
začátku volá funkce debug(), která je inicializuje. Kdežto v release
se používají přímo adresy.
Odkrokoval jsem to a skutečně se sahá ve všech případech na správné místo v paměti.


91x_map.h

#ifndef DEBUG
#define DMA_Channel5       ((DMA_Channel_TypeDef *)DMA_Channel5_BASE)
#else
EXT DMA_Channel_TypeDef    *DMA_Channel5;
#endif

a v 91x_lib.c

void debug(void)
{
 DMA_Channel5=       (DMA_Channel_TypeDef *)DMA_Channel5_BASE;
}


Tomáš


> --------
>>> No toto mi vobec nedava zmysel. Takze nakoniec sa aj pri tom "zakopnuti"
>>> prenesie ocakavany pocet znakov (/ 8 = pocet clockov zodpovedajuci poctu
>>> bytov nastavenych v Tx DMA), ale v Rx buffri nie su?
>>
>> Pokud dojde k zakopnutí, tak se přenos ukončí předčasně. Z nějakého
>> důvodu vypadne ze smyčky kde se čeká až Rx kanál DMA skončí přenos.

> Hm. Takze nastane zakopnutie, potom este par byte, ale aj tak je clockov
> menej ako bolo predpisane, je to tak?

> [...]

>>> Bolo by tiez dobre mat pred,
>>> medzi a za tymi while nejaku znacku (zacvicit nejakym pinom) a pozerat
>>> osciloskopom/LA spolu s tymi hodinami od SPI.
>>
>>Přesně tak jsem to dělal.

> No a kde teda je ten bod medzi tymi dvoma while sluckami, pred zakopnutim,
> pocas neho, alebo az uplne na konci po prenose tych dodatocnych byte za
> zakopnutim?

> wek


> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list




Další informace o konferenci Hw-list