Перейти к содержанию
    

PIC32MZ2048ECH064: DMA и UART

Здравствуйте!

Ситуация такая: по UART приходит строка длиной 80 байт hfp d ctreyle, ее нужно принять и записать в буфер с последующей обработкой. Для этой задачи решил прикрутить DMA.

Возникла такая ситуация: строка записывается только один раз, т.е. первый раз записали и все дальше буфер не обновляется, хотя прерывания от DMA генерируются.

Что я не так делаю? Помогите кто чем сможет. Заранее все спос!!!!!

 

Код инициализации:

    unsigned char buf[100];
    U2BRG  = 87;//115200
    U2STA  = 0;
    U2MODE   = 0x00008008; //Enable Uart for 8-bit data no parity, 1 STOP bit
    U2STASET = 0x00001410;

    DCH0SSA = (unsigned int) &U2RXREG   & 0x1FFFFFFF;  // source start address
    DCH0DSA = (unsigned int) &buf & 0x1FFFFFFF;  // destination start address
    DCH0SSIZ = 1;               // source size
    DCH0DSIZ = 80;              // destination size
    DCH0CSIZ = 1;               // cell size
    //DCH0DAT = '*';              //Последовательность остановки

    DCH0ECONbits.CHSIRQ = _UART2_RX_VECTOR;  // Заполнение буфера по прерывании UART
    DCH0ECONbits.SIRQEN = 1;  //
    //DCH0ECONbits.PATEN  = 1; // Разрешить остановку по детектировании заданной последовательности

    //DCH0CONbits.CHPATLEN = 0; //Длина последовательности остановки 1 байт
    DCH0CONbits.CHPRI    = 3; // Приоритет канала
    DCH0CONbits.CHEN     = 1; // Включаем канал DMA
    DCH0INTbits.CHBCIE   = 1; // Включить прерывание по приему 80 байт

 

Прерывание:

void __ISR(_DMA0_VECTOR, ipl6) __DMA0Interrupt(void)
{
    if(DCH0INTbits.CHBCIF) F_RX = 1;
    DCH0INTbits.CHBCIF = 0;
    DCH0INTbits.CHBCIE = 1;
    if(U2OERR) U2OERR = 0; // Если было переполнение буфера UART
    DMA0IF = 0;
}

 

Обработка в программе, вывод по 485:

        if(F_RX)
        {
            F_RX  = 0;
            DMACON = 0;
            LED_RED = 1;
            LED_GRN = 0;
            TX_UART2(&buf);
            while (!U2STAbits.TRMT);
            LED_RED = 0;
            LED_GRN = 1;
            DMACON   = 0x8000;
            DCH0CONbits.CHEN   = 1;
        }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Народ может кто знает рабочий пример для MX-серии? Перепробовал все примеры из референсов результат тот-же, что делать хз!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Воспользуйтесь гармонией. Желательно готовым драйвером для работы с USART и использованием DMA.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Воспользуйтесь гармонией. Желательно готовым драйвером для работы с USART и использованием DMA.

 

Да как то привык уже писать без библиотечных функций. Да и какая разница как писать железка все равно работает одинаково, а писанины будет больше - я так предполагаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...