RX-TX-Problem ARM7 LPC2136

OP #1798080
Lesenswert?

Schönen guten Tag,
Ich kann mir ein Ereignis nicht erklären. Und zwar funktioniert das 
Empfangen über Uart1 im Interrupt einwandfrei mit:
1
void uart1_irq_init(void)
2
{
3
  UART1_LCR = 0x03;             //8bit lenght
4
    UART1_FCR = 0x07;             //Enable and reset TX and RX FIFO.
5
  UART1_IER |= 0x7;             //Enable RBR/THRE/RX Line Interrupt
6
  VICVectAddr0 = (unsigned)uart1isr;    //ISR deklarieren
7
  VICVectCntl0 = (1<<5)|7;          //Interrupt Priority
8
  VICIntEnable |= (1<<7);        //Uart1 Interrupt enable
9
}
10

11
void uart1isr(void)
12
{
13
  uartdata=UART1_RBR;            //glob.Var zuordnen
14
  VICVectAddr = 0;            //"Submit" Interrupt
15

16
}

Jedoch wenn ich etwas senden möchte bleibt er hängen nachdem er das Byte 
gesendet hat. Mit der Funktion sende ich ein Byte:
1
int uart1Putch(int ch)
2
{
3
  while (!(UART1_LSR & ULSR_THRE))          // wait for TX buffer to empty
4
    continue;                           // also either WDOG() or swap()
5
  UART1_THR = (uint8_t)ch;  // put char to Transmit Holding Register
6
  return (uint8_t)ch;      // return char ("stdio-compatible"?)
7
}

Das Senden funktioniert wunderbar nur das Hängenbleiben kann ich mir 
nicht erklären.
Kann es daran liegen, dass ich zyklisch (alle 90ms) etwas empfange und 
dann irgendwo ein Speicher vollläuft, oder behindert meine ISR das 
Senden?

Schonmal Vielen Dank im Vorraus.
#1798202
Lesenswert?

Freilich kann man per Interrupt senden. Aber bei dir wär's vorerst damit 
getan, nur diejenige Interrupt-Quelle einzuschalten, die du in der ISR 
auch wirklich behandelst. Immerhin schaltest du 3 Interrupt-Quellen ein 
(RBR/THRE/RX), behandelst davon aber nur eine. Blindflug?

Sowieso wäre anzuraten, in der ISR mal nachzufragen, was für ein 
Interrupt überhaupt ansteht - und insbesondere auch ob überhaupt einer 
ansteht, weil letzteres bei dieser UART nicht ganz so selbstverständlich 
ist wie es scheint.
OP #1798224
Lesenswert?

1
void uart1_irq_init(void)
2
{
3
  UART1_LCR = 0x03;             //8bit lenght
4
    UART1_FCR = 0x07;             //Enable and reset TX and RX FIFO.
5
  UART1_IER |= (1<<0);           //Enable "NUR" RBR !!!!!!!!!!!!!!!!!
6
  VICVectAddr0 = (unsigned)uart1isr;    //ISR deklarieren
7
  VICVectCntl0 = (1<<5)|7;          //Interrupt Priority
8
  VICIntEnable |= (1<<7);        //Uart1 Interrupt enable
9
}

Und es funktioniert EINWANDFREI!!!!
Du hast mir den Tag gerettet.
Vielen Dank

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren