В этом примере сначала принимает Буфер 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 слов)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.