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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.