mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ARM lp2378 UART mit VIC


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag miteinander.
Habe da ein Problem mit meinem Projekt auf dem LPC 2378 und dem Olimex 
LPC-2378-STK Board.
Arbeite mit der Kickstartversion von IAR und habe deren uIP Beispiel mir 
vorgenommen. In dieses Projekt habe ich versucht noch UART zu 
integrieren, unter anderem mit Hilfe der Beispiele für WinARM und der 
von IAR.
WebServer läuft immer noch, LCD ebenfalls, aber das Senden über UART 
nicht ganz. Es wird zwar was gesendet, aber die falschen Zeichen. Hoffe 
jemand kann mir weiterhelfen, sitze schon seit Tagen dran und weiß nicht 
mehr wo ich noch nach Fehler suchen soll.
Hier mal meine Code-Ausschnitte
void uart1Init(DWORD baud)
{
  DWORD Fdiv;
  
  PINSEL0 |= 0x40000000;  /* Enable TxD1 P0.15 */
  PINSEL1 |= 0x00000001;  /* Enable RxD1 P0.16 */
  
  U1LCR = 0x83;    /* 8 bits, no Parity, 1 Stop bit */
  Fdiv = ( Fpclk / 16 ) / baud;
  U1DLM = Fdiv / 256;              
  U1DLL = Fdiv % 256;
  U1LCR = 0x03;    /* DLAB = 0 */
  U1FCR = 0x07;    /* Enable and reset TX and RX FIFO. */
  
  
  VICINTSELECT &= ~VIC_BIT(VIC_UART1);  // UART1 selected as IRQ
  VICINTENABLE = VIC_BIT(VIC_UART1);    // UART1 interrupt enabled

  VICVECTPRIORITY1 = VIC_ENABLE | VIC_UART1;
  VICVECTADDR1 = (Int32U)uart1ISR;    // address of the ISR
}

void uart1ISR(void)
{
Int8U iid;

  // loop until not more interrupt sources
  while (((iid = U1IIR) & UIIR_NO_INT) == 0)
    {
    // identify & process the highest priority interrupt
    switch (iid & UIIR_ID_MASK)
      {
      case UIIR_RLS_INT:                // Receive Line Status
        U1LSR;                          // read LSR to clear
        break;
      case UIIR_CTI_INT:                // Character Timeout Indicator
      case UIIR_RDA_INT:                // Receive Data Available
        do
          {
          Int16U temp;

          // calc next insert index & store character
          temp = (uart1_rx_insert_idx + 1) % UART1_RX_BUFFER_SIZE;
          uart1_rx_buffer[uart1_rx_insert_idx] = U1RBR;

          // check for more room in queue
          if (temp != uart1_rx_extract_idx)
            uart1_rx_insert_idx = temp; // update insert index
          }
        while (U1LSR & ULSR_RDR);

        break;

      case UIIR_THRE_INT:               // Transmit Holding Register Empty
        while (U1LSR & ULSR_THRE)
          {
          // check if more data to send
          if (uart1_tx_insert_idx != uart1_tx_extract_idx)
            {
            U1THR = uart1_tx_buffer[uart1_tx_extract_idx++];
            uart1_tx_extract_idx %= UART1_TX_BUFFER_SIZE;
            }
          else
            {
            // no
            uart1_tx_running = 0;       // clear running flag
            break;
            }
          }

        break;

      case UIIR_MS_INT:                 // MODEM Status
        U1MSR;                          // read MSR to clear
        break;

      default:                          // Unknown
        U1LSR;
        U1RBR;
        U1MSR;
        break;
      }
    }

   VICADDRESS = 0x00000000;           // clear this interrupt from the VIC

}
const char *uart1Puts(const char *string)
{
   register char ch;

  while ((ch = *string) && (uart1Putch(ch) >= 0))
    string++;

  return string;
}

int uart1Putch(int ch)
{
  Int16U temp;

  temp = (uart1_tx_insert_idx + 1) % UART1_TX_BUFFER_SIZE;

  if (temp == uart1_tx_extract_idx)
    return -1;                          // no room

  // check if in process of sending data
  if (uart1_tx_running)
    {
    // add to queue
    uart1_tx_buffer[uart1_tx_insert_idx] = (Int8U)ch;
    uart1_tx_insert_idx = temp;
    }
  else
    {
    // set running flag and write to output register
    uart1_tx_running = 1;
    U1THR = (Int8U)ch;
    }

  return (Int8U)ch;
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.