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

Figure 22-10: Адрес смещения генерируемый в режиме переферийной косвенной адресации

Периферийное устройство определяет, каким количеством младших битов адреса оно будет управлять. Прикладная программа должна выбрать базовый адрес для буфера в DPSRAM и гарантировать, что соответствующее число младших битов этого смещения адреса является нулевыми. Как и с другими режимами, когда читается регистр Смещения Адреса Начала DPSRAM, возвращается значение последнего адреса смещения передачи DPSRAM, которое включает вычисление адреса смещения, описанное выше. Если канал DMA не конфигурирован для Периферийной Косвенной Адресации, входящий адрес игнорируется и передача данных происходит как обычно.

Периферийный Косвенный Способ адресации совместим со всеми другими операционными режимами и в настоящее время поддерживается ADC и ECAN модулями.

22.6.6.1 ПОДДЕРЖКА ADC ДЛЯ ГЕНЕРАЦИИ АДРЕСА  DMA

В Способе Периферийной Косвенной адресации, периферийное устройство определяет последовательность адресации, которая более приспособлена к функциональным возможностям периферии.

Например, если ADC конфигурирован, чтобы конвертировать непрерывно вводы 0 до 3 в последовательности (0, 1, 2, 3, 0, 1, и т.д.), и ADC связан с каналом DMA конфигурированном для Регистровой косвенной Адресация с Постприращением, передача DMA перемещает эти данные в последовательный буфер как показано на Рисунке 22-11. Пример 22-5 иллюстрирует код для этой конфигурации.

Figure 22-11: Передача данных ADC с регистровой косвенной адресацией

Пример 22-5: Code for Data Transfer from ADC with Register Indirect Addressing

установка ADC1 for channel 0-3 sampling:

AD1CON1bits.FORM = 3;           // формат выходных данных:Signed Fraction(Q15 format)

AD1CON1bits.SSRC = 2;                    // Sample Clock Source: GP Timer starts conversion

AD1CON1bits.ASAM = 1;                   // выборка начинается сразу после конверсии

AD1CON1bits.AD12B = 0;                  // 10-bit операции ADC

AD1CON1bits.SIMSAM = 0;   // отдельные каналы выбираются один за другим

AD1CON2bits.BUFM = 0;

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

AD1CON2bits.CHPS = 0;                    // Converts CH0

AD1CON3bits.ADRC = 0;                   // ADC Clock происходят из 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 для запуска ADC1:

TMR3 = 0x0000;

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

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

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

T3CONbits.TON = 1;               //Start Timer 3

установка канала 5 DMA для регистровой косвенной адресации с постприращением:

unsigned int BufferA[32] __attribute__((space(dma)));

unsigned int BufferB[32] __attribute__((space(dma)));

DMA5CONbits.AMODE = 0;               // конфигурация DMA для регистровой косвенной

// адресации с постинкрементом

DMA5CONbits.MODE = 2;                 // конфигурация DMA для непрерывного Ping-Pong реж

DMA5PAD = (volatile unsigned int)&ADC1BUF0;// указатель DMA на ADC1BUF0

DMA5CNT = 31;                                 // 32 запроса DMA

DMA5REQ = 13;                                 // выбор ADC1 как источник запроса DMA

DMA5STA = __builtin_dmaoffset(BufferA);

DMA5STB = __builtin_dmaoffset(BufferB);