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

Если установлен бит DIR, данные читаются из адреса памяти DPSRAM DMA со смещением (используя DMAxSTA или DMAxSTB), и записываются в адрес периферийного устройства (используя периферийный адрес, как предусмотрено DMAxPAD).

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


22.6.3 Прерывание полной и половинной передачи

Каждый канал DMA обеспечивает прерывание на контроллер прерывания, когда передача блока данных закончена или закончена наполовину. Этот режим определяется очисткой или устанавкой бита HALF в регистре Управления Канала DMA x (DMAxCON):

HALF = 0 (инициализирует прерывание, когда все данные были перемещены)

HALF = 1 (инициализирует прерывание, когда половина данных была перемещена)

Когда используется режим Continuous DMA, CPU должен быть способен обработать приходящие или уходящие данные, со скоростью не менее чем DMA перемещает их. Прерывание половины передачи смягчает эту проблему, генерируя прерывание, когда только половина данных была передана.

Например, если ADC непрерывно читается контроллером DMA, прерывание половины передачи позволяет CPU обрабатывать буфер прежде, чем он полностью заполнится.

Если это никогда не продвигается из DMA, пишет, эта схема может использоваться, чтобы ослабить требования времени ответа CPU. рисунок} 22-7 иллюстрирует этот процесс.

Figure 22-7: Half Block Transfer Mode

Во всех режимах, когда установлен бит HALF, DMA запрашивает прерывание только, когда первая половина Буфера А и/или B передана. Никакое прерывание не испускается, когда Буфер А и/или B полностью передан.

Другими словами, прерывания запрашиваются только, когда DMA завершает (DMAxCNT + 1)/2 передач. Если (DMAxCNT + 1) нечетно, прерывания запрашиваются после (DMAxCNT + 2)/2 передач.

Например, если DMA3 конфигурирован для Однократного, буферного Пинг-понга (MODE <1:0> = 11), и DMA3CNT = 7, запрашиваются два прерывания DMA3 - одно после передачи четырех элементов от Буфера A, и одно после передачи четырех элементов из Буфера B. (Для получения дополнительной информации см. Раздел 22.6.7" Однократный Режим” и Раздел 22.6.9" Режим Пинг-понг”.)

Даже при том, что канал DMA выпускает прерывание или на полу -или полно-блочной передаче, приложение может "обманывать" в запросе прерывания на полу - и полно-блочных передачах, переключая значение бита HALF в течение каждого прерывания DMA. Например, если канал DMA инициализирован с битом HALF в ‘1’, прерывание запрашивается после каждой половины блочной пересылки. Если пользовательское приложение сбрасывает бит HALF, во время обслуживания прерывания, DMA запрашивает другое прерывание, когда закончена полная пересылка блока.

Чтобы разрешить эти прерывания, соответствующее биты разрешения Прерывания DMA (DMAxIE), должны быть установлены в  регистрах разрешения Управления Прерываниями (IECx) в модуле контроллера прерывания, как показано в Таблице 22-3.

Пример 22-1 shows, как разрешаются прерывания канала DMA 0:

Пример 22-1: Code to Enable DMA Channel 0 Interrupt

IEC0bits.DMA0IE = 1;

Table 22-3: Interrupt Controller Settings for Enabling/Disabling DMA Interrupts

 

Каждое прерывание передачи канала DMA устанавливает соответствующий флажок состояния в контроллере прерывания, который вызывает программу обработки прерывания (ISR). Приложение должно затем очистить этот флажок состояния, чтобы предотвратить перезапуск ISR.

Таблица 22-4 показывает регистры Состояния Флажков Прерывания (IFSx) и соответствующее название битов (DMAxIF) в модуле контроллера прерывания. Она также показывает Код вызова Структуры C, который очищает флажок.

Как пример, разрешение прерывания канала 0 DMA, который  , канал DMA, который 0 передач закончили, и соответствующее прерывание было выпущено на контроллер Прерывания. Следующий код должен присутствовать в ISR канале 0 DMA,  чтобы очистить состояние флажка и предотвратить отложенное прерывание.