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