- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello,
I am trying to receive a 9 byte length SPI message with standard Altera SPI slave component in QSys. I need to use interrupts, since I can't poll for packets in the main cycle. All 9 bytes are transferred by the master during one chipselect toggle. If I'm sending only one byte, then everything work fine. Here's my interrupt routine:
void SPI_ISR(void * context) {
DISABLE_INTERRUPTS();
IOWR_ALTERA_AVALON_SPI_STATUS(SPI_BASE, 0x00); // Clear status register
spi_rx_value = IORD_ALTERA_AVALON_SPI_RXDATA(SPI_BASE);
for(spi_index=1; spi_index<9; spi_index++) {
while((IORD_ALTERA_AVALON_SPI_STATUS(SPI_BASE) & ALTERA_AVALON_SPI_STATUS_RRDY_MSK) == 0);
spi_rx_value = IORD_ALTERA_AVALON_SPI_RXDATA(SPI_BASE);
}
ENABLE_INTERRUPTS();
}
As You can see, I get interrupt on the very first byte and poll other 8 bytes of data. The problem: I constantly get program stuff in a while() cycle waiting for the byte to be received. It gets stuck in random place: sometimes I see spi_index=5, sometimes spi_index=1. If I do data retransfer, then this routine gets completed and a byte from the middle of the second message triggers another interrupt. This causes complete mess. What I am doing wrong here? Thank You.
Link Copied
0 Replies
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page