UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

cancel
Showing results for 
Search instead for 
Did you mean: 
Visitor taddabenatia
Visitor
276 Views
Registered: ‎03-21-2019

UART Interrupts Zynq7000 driver development

Hello everyone,

I have a design in which I use UART in a special condition. The interrupt outputs are connected to an AXI interrupt block with are then relayed to the GIC in the PS sytem. I do this because of the interrupt number allowed in the GIC. It is not enough. Here is a part of my design to help you understand :Uart-PS.JPG

INT_UART.JPG

I now have a problem with the SDK configuring the driver in the interrupt mode. My interrupts are not correctly handled, I get stuck in the while loop waiting for the interrupts to happen. I sometimes get receiving, other times sending but never both. Here is my configuration:


Initialize the UART driver so that it's ready to use.

Status = AltUartNs550_Initialize(UartInstancePtr, UartDeviceId);
if (Status != XST_SUCCESS) {
  return XST_FAILURE;
}


Initialize the interrupt controller driver so that it is ready


Status = XIntc_Initialize(IntcInstancePtr, INTC_DEVICE_ID);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}

Connect a device driver handler


Status = XIntc_Connect(IntcInstancePtr, UartIntrId,
(XInterruptHandler)AltUartNs550_InterruptHandler,
(void *)UartInstancePtr);
if (Status != XST_SUCCESS) {
  return XST_FAILURE;
}


Start the interrupt controller


Status = XIntc_Start(IntcInstancePtr, XIN_REAL_MODE);
if (Status != XST_SUCCESS) {
  return XST_FAILURE;
}

Enable the interrupt for the UartNs550.

XIntc_Enable(IntcInstancePtr, UartIntrId);

XScuGic_Config *IntcConfig;


Initialize the interrupt controller driver


IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID_G);
if (NULL == IntcConfig) {
  return XST_FAILURE;
}

Status = XScuGic_CfgInitialize(&IntcInstanceG, IntcConfig,
IntcConfig->CpuBaseAddress);
if (Status != XST_SUCCESS) {
  return XST_FAILURE;
}

XScuGic_SetPriorityTriggerType(&IntcInstanceG, IntcIntrId, 0xA0, 0x3);

Connect the interrupt handler


Status = XScuGic_Connect(&IntcInstanceG, IntcIntrId,
(Xil_ExceptionHandler) AltUartNs550_InterruptHandler,
UartInstancePtr);
if (Status != XST_SUCCESS) {
  return Status;
}


Enable the interrupt for the Timer device.

XScuGic_Enable(&IntcInstanceG, IntcIntrId);

 

...


0 Kudos