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

AD1CON2bits.BUFM = 0;

AD1CON2bits.CSCNA = 1;                 //Scan CH0+ Input Selections during Sample A bit

AD1CON2bits.CHPS = 0;                    // Converts CH0

AD1CON3bits.ADRC = 0;                   // ADC Clock is derived from Systems Clock

AD1CON3bits.ADCS = 63;                  // ADC Conversion Clock

//AD1CHS0: A/D Input Select Register

AD1CHS0bits.CH0SA = 0;                  // MUXA +ve input selection (AIN0) for CH0

AD1CHS0bits.CH0NA = 0;                  // MUXA -ve input selection (Vref-) for CH0

//AD1CHS123: A/D Input Select Register

AD1CHS123bits.CH123SA = 0;           // MUXA +ve input selection (AIN0) for CH1

AD1CHS123bits.CH123NA = 0;          // MUXA -ve input selection (Vref-) for CH1

//AD1CSSH/AD1CSSL: A/D Input Scan Selection Register

AD1CSSH = 0x0000;

AD1CSSL = 0x000F;               // Scan AIN0, AIN1, AIN2, AIN3 inputs

установка Timer3 to trigger ADC1 conversions:

TMR3 = 0x0000;

PR3 = 4999;                             // запуск ADC1 каждые 125usec

IFS0bits.T3IF = 0;                    // Clear Timer 3 interrupt

IEC0bits.T3IE = 0;                   // Disable Timer 3 interrupt

T3CONbits.TON = 1;               //Start Timer 3

установка DMA Channel 5 for Peripheral Indirect Addressing:

struct

{

unsigned int Adc1Ch0[8];

unsigned int Adc1Ch1[8];

unsigned int Adc1Ch2[8];

unsigned int Adc1Ch3[8];

} BufferA __attribute__((space(dma)));

struct

{

unsigned int Adc1Ch0[8];

unsigned int Adc1Ch1[8];

unsigned int Adc1Ch2[8];

unsigned int Adc1Ch3[8];

} BufferB __attribute__((space(dma)));

DMA5CONbits.AMODE = 2;               // Configure DMA for Peripheral indirect mode

DMA5CONbits.MODE = 2;                 // Configure DMA for Continuous Ping-Pong mode

DMA5PAD = (volatile unsigned int)&ADC1BUF0;// Point DMA to ADC1BUF0

DMA5CNT = 31;                                 // 32 DMA request (4 buffers, each with 8 words)

DMA5REQ = 13;                                 // Select ADC1 as DMA Request source

DMA5STA = __builtin_dmaoffset(&BufferA);

DMA5STB = __builtin_dmaoffset(&BufferB);

IFS3bits.DMA5IF = 0;              //Clear the DMA interrupt flag bit

IEC3bits.DMA5IE = 1;                         //Set the DMA interrupt enable bit

unsigned int DmaBuffer = 0;

void __attribute__((__interrupt__)) _DMA5Interrupt(void)

{

// Switch between Primary and Secondary Ping-Pong buffers

if(DmaBuffer == 0)

{

ProcessADCSamples(BufferA.Adc1Ch0);

ProcessADCSamples(BufferA.Adc1Ch1);

ProcessADCSamples(BufferA.Adc1Ch2);

ProcessADCSamples(BufferA.Adc1Ch3);

}

else

{

ProcessADCSamples(BufferB.Adc1Ch0);

ProcessADCSamples(BufferB.Adc1Ch1);

ProcessADCSamples(BufferB.Adc1Ch2);

ProcessADCSamples(BufferB.Adc1Ch3);

}

DmaBuffer ^= 1;

IFS3bits.DMA5IF = 0; //Clear the DMA5 Interrupt Flag

}

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

AD1CON1bits.ADDMABM = 0;          // DMA buffers are built in scatter/gather mode

AD1CON2bits.SMPI = 3;                     // 4 ADC buffers

AD1CON4bits.DMABL = 3;                // Each buffer contains 8 words

IFS0bits.AD1IF = 0;                 // Clear the A/D interrupt flag bit

IEC0bits.AD1IE = 0;                // Do Not Enable A/D interrupt

AD1CON1bits.ADON = 1;                   // Turn on the A/D converter

22.6.6.2 ПОДДЕРЖКА ГЕНЕРАЦИИ АДРЕСОВ DMA ECAN

Периферийная Косвенная Адресация может также использоваться с модулем ECAN. Когда dsPIC33F устройство фильтрует и получает сообщения через шину CAN, сообщения могут быть категоризированы в две группы:

• Полученные сообщения, которые должны быть обработаны

• Полученные сообщения, которые должны быть отправлены другим узлам CAN без обработки

В первом случае, полученные сообщения должны быть восстановлены в буфере из восьми слов каждый прежде, чем они могут быть обработаны приложением. С несколькими ECAN буферами определенными в DMA RAM, было бы проще позволить периферийному устройству ECAN генерировать адреса RAM для приходящих (или исходящих) данных, как показано в Рисунке 22-13.