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

В этом примере сначала принимает Буфер 2  затем Буфер 0. ECAN модуль генерирует адреса назначения, чтобы должным образом разместить данные в DMA RAM (Периферийная Косвенная Адресация).

Figure 22-13: передача данных из ECAN с периферийной косвенной адресацией

Как упомянуто ранее, Вы должны обратить особое внимание на число младших битов, которые зарезервированы для периферийного устройства при инициализации приложением регистров Смещения Адреса Начала DPSRAM (DMAxSTA и DMAxSTB), если DMA работает в режиме Периферийной Косвенной адресации. Для ECAN, число битов зависит от числа буферов ECAN, определенных битами размера Буфера DMA (DMABS <2:0>) устанавленными в ECAN регистре Управления FIFO (CiFCTRL).

Например, если ECAN модуль резервирует 12 буферов, установив биты DMABS <2:0> к ‘3’, будет 12 буферов по 8 слов каждый, общим количеством 96 слов (192 байта). Это означает, что адрес смещения, который записан в регистры DMAxSTA и DMAxSTB должен иметь 8 (2^8 битов = 256 байтов) младших битов, установленных на ‘0’. Если используется MPLAB C30 компилятор, чтобы инициализировать регистр DMAxSTA, должно быть определено надлежащее выравнивание данных через атрибуты данных. Для вышеупомянутого примера, код в Примере 22-7 должным образом инициализирует регистр DMAxSTA.

Пример 22-7: выравнивание буфера DMA в MPLAB® C30

Пример 22-8 illustrates the code for this configuration.

int BufferA[12][8] __attribute__((space(dma),aligned(256)));

DMA0STA = __builtin_dmaoffset(&BufferA[0][0]);

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

Этот режим передачи данных может быть достигнут с Регистровой Косвенной Адресацией DMA с Постприращением. рисунок 22-14 иллюстрирует этот сценарий.

Пример 22-8: Код для ECAN и DMA с переферийной косвенной адресацией

установка ECAN1 с 2 фильтрами:

/* инициализируется вначале ECAN clock. См секцию ECAN для примера кода */

C1CTRL1bits.WIN = 1;                       // разрешаем окно фильтров

C1FEN1bits.FLTEN0 = 1;                    // фильтр 0 разрешен

C1FEN1bits.FLTEN1 = 1;                    // фильтр 1 разрешен

C1BUFPNT1bits.F0BP = 0;      // фильтр 0 указывает на Buffer0

C1BUFPNT1bits.F1BP = 2;      // фильтр 1 указывает на Buffer2

C1RXF0SID = 0xFFEA;                      // конфигурация фильтра 0

C1RXF0EID = 0xFFFF;

C1RXF1SID = 0xFFEB;                       // конфигурация фильтра 1

C1RXF1EID = 0xFFFF;

C1FMSKSEL1bits.F0MSK = 0;            // маска 0 используется для обоих фильтров

C1FMSKSEL1bits.F1MSK = 0;            // маска 0 используется для обоих фильтров

C1RXM0SID = 0xFFEB;

C1RXM0EID = 0xFFFF;

C1FCTRLbits.DMABS = 3;                 // 12 буферов в  DMA RAM

C1FCTRLbits.FSA = 3;                        // FIFO начинается с TX/RX буфера 3

C1CTRL1bits.WIN = 0;

C1TR01CONbits.TXEN0 = 0; // Buffer 0 приемный буфер

C1TR23CONbits.TXEN2 = 0; // Buffer 2 приемный буфер

C1TR01CONbits.TX0PRI = 0b11; //High Priority

C1TR01CONbits.TX1PRI = 0b10; //Intermediate High Priority

C1CTRL1bits.REQOP = 0;                   // разрешение нормального режима

установка DMA канала 0 для переферийной косвенной адрсации:

unsigned int Ecan1Rx[12][8] __attribute__((space(dma)));// 12 buffers, 8 words each

DMA0CONbits.AMODE = 2;                                      // Continuous режим, одиночный буфер

DMA0CONbits.MODE = 0;                                         // переферийная косвенная адресация

DMA0PAD = (volatile unsigned int) &C1RXD;            // указывает на Rx регистр ECAN1

DMA0STA = __builtin_dmaoffset(Ecan1Rx);   // Point DMA to ECAN1 buffers

DMA0CNT = 7;                                              // 8 DMA запросов (1 буфер, каждый 8 слов)