This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Interrupt Handling

I am working with a Cypress FX2 based board. There are 5 endpoints (BULK) that I use.
Endpoint 1 and 4 are used for sending data from PC to FX2. Endpoint 2 and 6 are used to send data from FX2 to PC.
Endpoint 8 is to be used for reset.

Endpoint 1 is used for Initiating communication with the PC. The firmware is polling for the a flag which is set by the ISR for this endpoint e.g.

Polling function:
void poll_func(void)
{
if( EP1_Enabled)
{
resetFlag = 0; //clear the reset
process_command();
EP1OUTBC = 0 ; // re-arm endpoint 1 OUT
SYNCDELAY;
EP1_Enabled = 0;
}
}

ISR:
void ISR_Ep1out(void) interrupt 0
{
// tell polling software we have new data
EP1_Enabled = 1;
EZUSB_IRQ_CLEAR();
EPIRQ = bmEP1OUTIER;
}

The process_command() processes user requests and reads some data (with timeouts) of FPGA and fills up output endpoint 82Hnd arms it as below:

{
/* Fill 32 bytes in ep2 buffer
Maximun time allowed = 50 millsec. */
receive_wait(32, 50);

EP2BCH = 0; // arm endpoint 2 IN
EP2BCL = 0x20;

/* if both buffers are still committed to
USB, wait around until one of them is free
*/
while((EP2CS & bmEPFULL) && !resetFlag )
;
}

The ISRs for EP2 and EP6 are empty. i.e.
void ISR_Ep2inout(void) interrupt 0
{
}

The ISR for EP8 used for reset is as below:
void ISR_Ep8inout(void) interrupt 0
{
EP8BCL = 0x80; //re-arm endpoint 8
SYNCDELAY;
resetFlag = 1;
EZUSB_IRQ_CLEAR();
EPIRQ = bmEP8IER;
}

The PC sends data on EP1 and then starts waiting to get data back on EP2.

In some conditions, I want to use receive_nowait() instead of receive_wait() i.e. I want to do
receive_nowait(32);
so that this call would become a blocking call and firmware control would come out of this function only after 32 bytes are received or if the resetFlag is set to 1.

The PC application spawns a thread and sends data on EP1 and then it waits on data from EP2 (since receive_nowait() is blocking.

Now if I have to set the resetFlag, I send data on EP8, which should work. But it gets queued, till I come out of receive_nowait() and arm EP2. Only after this, I see that resetFlag is getting set to 1.

I seems like interrupts get disabled, while I am handling any other interrupt.I tried setting EA(IE Register bit 7) to 1, EUSB (EIE Register Bit 0) to 1 and USBINT (EXIF register bit 4) to 1

How do I fix this? Any ideas would be greatly appreciated.

Thanks
Dave

0