www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Interrupt von RS232(XUART_LITE) in Spartan-3A


Autor: Michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich benutze das Spartan3A-Starter Kit und habe einige IP Cores wie RS232 
(XUartLite), Microblaze in die FPGA-Architektur implementiert.
Es sollen Daten von PC über die RS232-Schnittstelle zum Microblaze 
geschickt werden. Sobald die Daten in den FIFOs der 
RS232-Schnittstelle(XUartLite) ankommen, soll ein Interrupt ausgelöst 
werden. Dieser Interrupt wird benötigt, um interne 
Datenverschiebungsoperationen und bearbeitungen zu ermöglichen. Doch 
leider funktioniert die Interruptauslösung noch nicht.

Hier kommt teile  meiner MHS Datei

BEGIN xps_uartlite
 PARAMETER INSTANCE = RS232_DCE
 PARAMETER C_FAMILY = spartan3a
 PARAMETER C_BAUDRATE = 9600
 PARAMETER C_DATA_BITS = 8
 PARAMETER C_USE_PARITY = 0
 PARAMETER C_ODD_PARITY = 0
 PARAMETER HW_VER = 1.01.a
 PARAMETER C_BASEADDR = 0x84000000
 PARAMETER C_HIGHADDR = 0x8400ffff
 BUS_INTERFACE SPLB = mb_plb
 PORT RX = fpga_0_RS232_DCE_RX_pin
 PORT TX = fpga_0_RS232_DCE_TX_pin
 PORT Interrupt = RS232_DCE_Interrupt
END

BEGIN xps_intc
 PARAMETER INSTANCE = xps_intc_0
 PARAMETER HW_VER = 2.00.a
 PARAMETER C_BASEADDR = 0x81800000
 PARAMETER C_HIGHADDR = 0x8180ffff
 BUS_INTERFACE SPLB = mb_plb
 PORT Intr = Ethernet_MAC_IP2INTC_Irpt & RS232_DCE_Interrupt & SPI_FLASH_IP2INTC_Irpt
 PORT Irq = microblaze_0_Interrupt
END

 Hier kommt mein SW Code
#include "xparameters.h"  //parameters with all addresses of the system
//#include "xmpmc.h"      //Multi-Port Memory Controller
#include "xuartlite.h"    //RS232
#include "stdio.h"
#include "xbasic_types.h"
#include "xintc.h"      //Interrupt Controller
#include "mb_interface.h"  //needed for Interrups

XUartLite UartLite;
XIntc Intc;                    /* The instance of the UartLite Device */

XStatus Status;


void rs232_interrupt_handler(void*)
{
  printf(" Interrupt Controller Interrrupt_handler aufgerufen " );
  return;
}

void UartLite_Recv_Handler (void *CallBackRef, unsigned int EventData)
{
  printf(" UartLite_RecvHandler aufgerufen " );
  return;
}

void UartLite_Send_Handler (void *CallBackRef, unsigned int EventData)
{
  printf(" UartLite_SendHandler aufgerufen " );
  return;
}


int main (void)
{
//------------------------------------------------------------------------------------------------------------------
//Interrupt Controller
  // init interrupt handling device
  if (XIntc_Initialize(&Intc, XPAR_INTC_SINGLE_DEVICE_ID)!=XST_SUCCESS) printf(" Error " );
  
  //Connect with InterruptHandler
  if (XIntc_Connect(&Intc, XPAR_XPS_INTC_0_RS232_DCE_INTERRUPT_INTR, 
                  (XInterruptHandler)rs232_interrupt_handler, 
                  (void *)&UartLite)!=XST_SUCCESS) printf(" Error " );

  // start XPS Interrupt Controller
  if (XIntc_Start(&Intc, XIN_SIMULATION_MODE)!=XST_SUCCESS) printf(" Error " ) ;//XIN_REAL_MODE für nur HW Interrupts zulassen
  
  
  //Enable Interrupts for specific devices
  XIntc_Enable(&Intc, XPAR_XPS_INTC_0_RS232_DCE_INTERRUPT_INTR);
printf(" Interrupt_Controller_inizialisierung_beendet " );

//------------------------------------------------------------------------------------------------------------------

//RS232 Controller
  //Enable RS232 Interrupts
  if (XUartLite_Initialize(&UartLite, XPAR_RS232_DCE_DEVICE_ID)!=XST_SUCCESS) printf(" Error " );
  if (XUartLite_SelfTest(&UartLite)!=XST_SUCCESS) printf(" Error " );

  XUartLite_SetRecvHandler(&UartLite, UartLite_Recv_Handler,(void *) &UartLite );  
  XUartLite_SetSendHandler(&UartLite, UartLite_Send_Handler, &UartLite ); 

  XUartLite_EnableInterrupt(&UartLite);

printf(" Rs232_inizialisierung_beendet " );
//------------------------------------------------------------------------------------------------------------------
//Microblaze
  //enable MB interrupt reception
  microblaze_enable_interrupts();
printf(" Microblaze_inizialisierung_beendet " );

//------------------------------------------------------------------------------------------------------------------
//make SW-Interrupt

  u32 *p_sramdata;
    
  p_sramdata = (u32*)XPAR_XPS_INTC_0_BASEADDR; //Interrupt Status Register 32 bit
  *p_sramdata = 0xE0000000;//Int0, Int1, Int2 Enable
printf("Interrupt-Ausloesungswert %ui", *p_sramdata);

  int exit = 0;
  while (exit =0)
  {
  }
  return 0;
}

Sobald ich was über RS232 sende, wird leider kein Interrupt ausgelöst.
Also wollte ich SW-mäßig einen auslösen, indem ich in das Statusregister 
des Interrupt Controllers schreibe. Leider ist dies ohne Erfolg.
Ich hab mich auch entlang des hier im Forum enthaltenen Artikels 
entlanggetastet, leider ohne Erfolg 
Beitrag "Interrupt mit Xilinx EDK/SDK 10.1 und VirtexII/Pro"


Ich bitte um Eure Hilfe und bedanke mich.

Viele Grüße
Michi

Autor: michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat keiner eine Idee, woran es liegen könnte.

Viele Grüße
Michi

Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mich noch nicht intensiv mit dem MB Interruptsystem 
beschäftigt, möchte das aber in nächster Zeit tun. Hast du das Problem 
lösen können? Beim Überfliegen ist mir noch folgendes aufgefallen: Du 
hast ja einen Send-Handler definiert, indem du mit printf() arbeitest. 
Schreibt in deiner Configuration printf() auf den gleichen UART ?

Autor: michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, wegen diesem printf ging es nicht. Mit LEDs, die über GPIO 
angesteuert werden, habe ich die funktionalität des Interruptsystems 
gezeigt. Der obrige Code ist bis auf den printf Befehl richtig und 
funktionsfähig.

Gruß
Michi

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]
  • [vhdl]VHDL-Code[/vhdl]
  • [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.