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