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