05-06-2015 06:14 AM
As part of my bachelor thesis project at the university of Amsterdam, I'm currently trying to build a system using the Microblaze MCS IP core running on a Spartan 3E starter kit board. I'm running the latest version of ISE 14.7.
I've been trying to get the MCS' UART working in order to receive serial data from the PC, handling interrupts when a new byte is received. It seems that I've stumbled upon what appears to be a bug in the I/O module driver.
I was trying to run the following code on the Microblaze such that it would respond to a byte received from the PC: https://gist.github.com/matthijsbos/49600e747182216ea355#file-uart_test
However, the handler function would not fire. I spent some time figuring out why it would not run and I found the source of the problem to be in the XIOModule_Uart_InterruptHandler() function, contained in:
And still appears to exist in the latest version of the driver that comes with SDK 2015.1:
It appears that the function reads the wrong I/O module register in order to check whether the interrupt was caused by a receive or transmit interrupt, so an interrupt handler is never called. A solution is provided in:
In order to fix this, modify the line in XIOModule_Uart_InterruptHandler() in the sdk directory and recreate your board support packages to get I/O Module uart interrupts working.
05-13-2015 02:29 AM
Thank you for debugging and reporting this issue. I have created an internal change request to correct the iomodule driver code in the next tool release.
11-22-2015 08:40 AM
We will check it and get back to you if it works in 2015.3.
11-23-2015 01:26 AM
Yes, the issue appears to be solved in Vivado 2015.3. The I/O Module driver version 2.2 has been modified to read the status register instead of the IPR in the UART interrupt handler.