DMA для dsPIC. Контроллер Прямого доступа к памяти (DMA). DMA контроллер. Регистр Смещения Адреса Начала A DPSRAM Канала DMA x, страница 16

{

IFS0bits.DMA0IF = 0; // Clear the DMA0 Interrupt Flag;

}

void __attribute__((__interrupt__)) _DMA1Interrupt(void)

{

static unsigned int BufferCount = 0;      // хранит запись какой буфер

// содержит Rx данные

if(BufferCount == 0)

{

DMA0STA = __builtin_dmaoffset(BufferA);    // Point DMA 0 to data

// to be transmitted

}

else

{

DMA0STA = __builtin_dmaoffset(BufferB);    // Point DMA 0 to data

// to be transmitted

}

DMA0CONbits.CHEN = 1;                                                     // Enable DMA0 Channel

DMA0REQbits.FORCE = 1;                            // Manual mode: Kick-start the 1st transfer

BufferCount ^= 1;

IFS0bits.DMA1IF = 0;                         // Clear the DMA1 Interrupt Flag

}

22.6.8 ContinuousMode

Непрерывный режим используется программой, когда повторная передача данных требуется все время по жизни программы.

Этот режим выбирается, программируя биты Выбора Режима Операций (MODE <1:0>) в ‘x0’ в регистре Управлении Канала DMA (DMAxCON). В этом режиме, когда весь блок данных перемещен (длина блока устанавливается в DMAxCNT) канал остается разрешенным. В течение последней передачи данных, адрес DMA DPSRAM сбрасывается назад к (первоначальному) регистр Адреса Начала Смещения DPSRAM (DMAxSTA). рисунок 22-16 иллюстрирует режим Continuous.

Рисунок 22-16: Повторная блочная пересылка Данных в Непрерывном Режиме

 

Если бит HALF установлен в регистре Управления Канала DMA (DMAxCON), DMAxIF установлен (и прерывание DMA сгенерировано, если допускается), когда пересылка половины блока данных закончена. Канал остается разрешенным. Когда закончена пересылка всего блока флажок прерывания не устанавливается  и канал остается разрешенным. См. Раздел 22.6.3" Прерывание пересылки всего или Половины блока ” для информации относительно того, как установить канал DMA, чтобы прервать и на половине и на полной поблочной пересылке.

22.6.9 Ping-Pong режим

Режим пинг-понг позволяет CPU обрабатывать один буфер, в то время как второй буфер работает с каналом DMA. В результате - то, что CPU имеет время равное времени пересылки целого блока, чтобы обработать буфер в настоящее время не используемый каналом DMA. Конечно, этот режим передачи удваивает количество DPSRAM, необходимого для буферов.

Во всех режимах операций DMA, когда канал DMA разрешен, (первичный) Канал DMA x регистр Адреса Начала Смещение DPSRAM А (DMAxSTA), выбран по умолчанию, чтобы генерировать начальный эффективный адрес DPSRAM. После завершения каждой пересылки блока канал DMA повторно инициализируется  адресом начала буфера - sourced от того же самого регистра DMAxSTA.

В режиме Ping-Pong, адрес начала буфера получается от двух регистров:

• Первый: регистр Адрес Начала Смещения А DPSRAM (DMAxSTA) Канала DMA x

• Второй: регистр Адрес Начала Смещения В DPSRAM (DMAxSTВ) Канала DMA x

DMA использует вторичный буфер для поочередной пересылки блоков. После завершения пересылки блока канал DMA повторно инициализируется адрес начала буфера полученным из дополнительного регистра.

Режим пинг-понг выбрирается установкой битов Выбора Режима Операций (MODE <1:0>) к ‘1x’ в регистре Управления Канала DMA (DMAxCON).

Если выбран Continuous режим, в то время как DMA работает в режиме Ping-Pong, DMA отвечает, повторно инициализируя, чтобы указать на вторичный буфер после передачи первичного буфера, и затем перемещает вторичный буфер. Последующие блочные пересылки чередуются между первичными и вторичными буферами. Прерывания генерируются (если разрешены программой) после того, как каждый буфер передан. рисунок 22-17 иллюстрирует режим Ping-Pong с операцией Continuous.

Пример 22-9 иллюстрирует код, используемый для операции Ping-Pong, используя DCI модуль как пример.

Figure 22-17: Repetitive Data Transfer in Ping-Pong Mode

 

Пример 22-9: Code for DCI and DMA with Continuous Ping-Pong Operation

Set up DCI for Rx and Tx:

#define FCY 40000000

#define FS 48000