Вопрос по контроллеру DMA в xmega128A3.
Мне нужно по Event 0 данные из регистра IN порта записывать в циклический буфер размером в 16 байт. Контороллер конфигурирую так:
//DMA Configuration
DMA_CTRL = (1<<DMA_RESET_bp);
DMA_CH0_CTRLA = (1<<DMA_CH_RESET_bp);
DMA_CH0_CTRLB = (0<<DMA_CH_ERRINTLVL_gp)|(3<<DMA_CH_TRNINTLVL_gp);
//ERRINTLVL - OFF; TRNINTLVL - high
DMA_CH0_ADDRCTRL = (2<<DMA_CH_SRCRELOAD_gp)|(1<<DMA_CH_SRCDIR_gp)|
(1<<DMA_CH_DESTRELOAD_gp)|(1<<DMA_CH_DESTDIR_gp);
//SRCRELOAD - BURST; SRCDIR - INC; DESTRELOAD - BLOCK; DESTDIR - INC
DMA_CH0_TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH0_gc;
//Запуск от события 0
DMA_CH0_TRFCNT = 16;//Размер блока - 0
DMA_CH0_REPCNT = 0; //Кол-во повторов - неограничено
DMA_CH0_SRCADDR0 = (unsigned long)SR_ADDR & 0xFF;
DMA_CH0_SRCADDR1 = ((unsigned long)SR_ADDR>>8) & 0xFF;
DMA_CH0_SRCADDR2 = ((unsigned long)SR_ADDR>>16) & 0xFF;
DMA_CH0_DESTADDR0 = (unsigned long)DataBuffer & 0xFF;
DMA_CH0_DESTADDR1 = ((unsigned long)DataBuffer >> 8) & 0xFF;
DMA_CH0_DESTADDR2 = ((unsigned long)DataBuffer >> 16) & 0xFF;
DMA_CH0_CTRLA = (1<<DMA_CH_ENABLE_bp)|//Enable DMA chanal 0
(1<<DMA_CH_REPEAT_bp)|//Repeat ON
(0<<DMA_CH_TRFREQ_bp)|//TRFRE - OFF
(1<<DMA_CH_SINGLE_bp)|//Single Shot Data transfer - ON
(0<<DMA_CH_BURSTLEN_gp); //BURSTLEN - 1byte
DMA_CTRL = (1<<DMA_ENABLE_bp)|(1<<DMA_DBUFMODE_gp)|(3<<DMA_PRIMODE_gp);
В результате получается, что после передачи каждого блока, когда TRFCNT доходит до 0, сбрасывается бит ENABLE в регистре CH0_CTRLA.
!!! Поскольку отлаживать в железе пока нет возможности то пытаюсь отлаживать в симуляторе avrstudio(что симуляторы - зло знаю :)). Вопрос собственно в том Enable сбрасывается и в реальности или это глюк симулятора? Или с настройками контроллера что-то не так,