Ситуация такая: по 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 байт
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;
}
{
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;
}
{
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;
}