cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Highlighted
Visitor
Visitor
473 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
0 Replies