Цитата(jcxz @ Feb 8 2016, 06:53)

А что именно вызывает затруднения? Поставить бит в SSP.DMACR и написать 5 строчек инициализации DMA-канала???
Подсказка: чтобы хоть что-то организовать, надо первым делом открыть даташит. Или этот шаг пропустили и сразу в примеры полезли?
Зачем мне для передачи из памяти в uart ставить бит в SSP.DMACR ? нелогично вроде.
Кстати, SSP.DMACR - read/write регистр, а UnFCR, куда нужно писать соответствующие биты для DMA - write only, что придает некоторую сексуальность в сравнении "тут работает, тут не работает".
И на 5 строчек тоже как-то не хватает, но пофиг, пусть будет больше, лишь бы работало
Код
/* зовем один раз */
LPC_SC->PCONP |= (1 << 29); /* Enable GPDMA clock */
LPC_SC->DMAREQSEL = 0x0000; /* Select primary function(UART0/1/2/3) in DMA channels, secondary is timer 0/1/2/3. */
/*.....*/
/* str - строка для передачи в uart длиной len */
/* всё работает , если len <= 16, если больше - в порт уходит только 16 байт */
DMA_Init( M2P, str, 0, len);
LPC_GPDMACH0->DMACCConfig |= 0x08001|0x380; /* Enable channel and IE bit */
/* [b]UPDATE[/b]: а так всё работает, как надо (chanel tranfer type был установлен в memory to memory) */
LPC_GPDMACH0->DMACCConfig |= 0x08001|0x380|(1<<11); /* Enable channel and IE bit */
/*.....*/
int DMA_Init( int DMAMode, char *src_addr, char *dest_addr, int dsize)
{
if ( DMAMode == M2P ) {
/* Ch0 set for M2P transfer from mempry to UART. */
LPC_GPDMACH0->DMACCSrcAddr = (uint32_t) src_addr;
LPC_GPDMACH0->DMACCDestAddr = (uint32_t) LPC_UART3_BASE;
/* The burst size is set to 1, source and dest transfer width is 32 bits(word), Terminal Count Int enable */
LPC_GPDMACH0->DMACCControl = (dsize & 0x0FFF)|(0x00 << 12) |(0x00 << 15)
|(0x00 << 18)|(0x00 << 21) | (1 << 26)| (0 << 27) | 0x80000000;
}
LPC_GPDMA->DMACConfig = 0x01; /* Enable DMA channels, little endian */
while ( !(LPC_GPDMA->DMACConfig & 0x01) );
NVIC_EnableIRQ(DMA_IRQn);
return (TRUE);
}