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


von Michi (Gast)


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
1
BEGIN xps_uartlite
2
 PARAMETER INSTANCE = RS232_DCE
3
 PARAMETER C_FAMILY = spartan3a
4
 PARAMETER C_BAUDRATE = 9600
5
 PARAMETER C_DATA_BITS = 8
6
 PARAMETER C_USE_PARITY = 0
7
 PARAMETER C_ODD_PARITY = 0
8
 PARAMETER HW_VER = 1.01.a
9
 PARAMETER C_BASEADDR = 0x84000000
10
 PARAMETER C_HIGHADDR = 0x8400ffff
11
 BUS_INTERFACE SPLB = mb_plb
12
 PORT RX = fpga_0_RS232_DCE_RX_pin
13
 PORT TX = fpga_0_RS232_DCE_TX_pin
14
 PORT Interrupt = RS232_DCE_Interrupt
15
END
16
17
BEGIN xps_intc
18
 PARAMETER INSTANCE = xps_intc_0
19
 PARAMETER HW_VER = 2.00.a
20
 PARAMETER C_BASEADDR = 0x81800000
21
 PARAMETER C_HIGHADDR = 0x8180ffff
22
 BUS_INTERFACE SPLB = mb_plb
23
 PORT Intr = Ethernet_MAC_IP2INTC_Irpt & RS232_DCE_Interrupt & SPI_FLASH_IP2INTC_Irpt
24
 PORT Irq = microblaze_0_Interrupt
25
END

 Hier kommt mein SW Code
1
#include "xparameters.h"  //parameters with all addresses of the system
2
//#include "xmpmc.h"      //Multi-Port Memory Controller
3
#include "xuartlite.h"    //RS232
4
#include "stdio.h"
5
#include "xbasic_types.h"
6
#include "xintc.h"      //Interrupt Controller
7
#include "mb_interface.h"  //needed for Interrups
8
9
XUartLite UartLite;
10
XIntc Intc;                    /* The instance of the UartLite Device */
11
12
XStatus Status;
13
14
15
void rs232_interrupt_handler(void*)
16
{
17
  printf(" Interrupt Controller Interrrupt_handler aufgerufen " );
18
  return;
19
}
20
21
void UartLite_Recv_Handler (void *CallBackRef, unsigned int EventData)
22
{
23
  printf(" UartLite_RecvHandler aufgerufen " );
24
  return;
25
}
26
27
void UartLite_Send_Handler (void *CallBackRef, unsigned int EventData)
28
{
29
  printf(" UartLite_SendHandler aufgerufen " );
30
  return;
31
}
32
33
34
int main (void)
35
{
36
//------------------------------------------------------------------------------------------------------------------
37
//Interrupt Controller
38
  // init interrupt handling device
39
  if (XIntc_Initialize(&Intc, XPAR_INTC_SINGLE_DEVICE_ID)!=XST_SUCCESS) printf(" Error " );
40
  
41
  //Connect with InterruptHandler
42
  if (XIntc_Connect(&Intc, XPAR_XPS_INTC_0_RS232_DCE_INTERRUPT_INTR, 
43
                  (XInterruptHandler)rs232_interrupt_handler, 
44
                  (void *)&UartLite)!=XST_SUCCESS) printf(" Error " );
45
46
  // start XPS Interrupt Controller
47
  if (XIntc_Start(&Intc, XIN_SIMULATION_MODE)!=XST_SUCCESS) printf(" Error " ) ;//XIN_REAL_MODE für nur HW Interrupts zulassen
48
  
49
  
50
  //Enable Interrupts for specific devices
51
  XIntc_Enable(&Intc, XPAR_XPS_INTC_0_RS232_DCE_INTERRUPT_INTR);
52
printf(" Interrupt_Controller_inizialisierung_beendet " );
53
54
//------------------------------------------------------------------------------------------------------------------
55
56
//RS232 Controller
57
  //Enable RS232 Interrupts
58
  if (XUartLite_Initialize(&UartLite, XPAR_RS232_DCE_DEVICE_ID)!=XST_SUCCESS) printf(" Error " );
59
  if (XUartLite_SelfTest(&UartLite)!=XST_SUCCESS) printf(" Error " );
60
61
  XUartLite_SetRecvHandler(&UartLite, UartLite_Recv_Handler,(void *) &UartLite );  
62
  XUartLite_SetSendHandler(&UartLite, UartLite_Send_Handler, &UartLite ); 
63
64
  XUartLite_EnableInterrupt(&UartLite);
65
66
printf(" Rs232_inizialisierung_beendet " );
67
//------------------------------------------------------------------------------------------------------------------
68
//Microblaze
69
  //enable MB interrupt reception
70
  microblaze_enable_interrupts();
71
printf(" Microblaze_inizialisierung_beendet " );
72
73
//------------------------------------------------------------------------------------------------------------------
74
//make SW-Interrupt
75
76
  u32 *p_sramdata;
77
    
78
  p_sramdata = (u32*)XPAR_XPS_INTC_0_BASEADDR; //Interrupt Status Register 32 bit
79
  *p_sramdata = 0xE0000000;//Int0, Int1, Int2 Enable
80
printf("Interrupt-Ausloesungswert %ui", *p_sramdata);
81
82
  int exit = 0;
83
  while (exit =0)
84
  {
85
  }
86
  return 0;
87
}

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

von michi (Gast)


Lesenswert?

Hat keiner eine Idee, woran es liegen könnte.

Viele Grüße
Michi

von klaus (Gast)


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 ?

von michi (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.