Altera_Forum
Honored Contributor
9 years agoNIOS II SPI communication
Hi All!
I've a problem with Nios SPI communication. I studied "Embedded Peripherals IP User Guide" but I didn't understand how to use alt_avalon_spi_command() function. I understood that an Avalon-MM master peripheral controls and communicates with the SPI core via six 32-bitregisters. So I searched more examples on web but I only found this: //------------------------------------ MAIN ------------------------------------------------------------ int main(void){ void send(alt_u16 write); alt_u16 receive(); alt_u16 wrdata=0xabcd; alt_u16 rddata; IOWR_ALTERA_AVALON_SPI_SLAVE_SEL(SPI_BASE, 1); IORD_ALTERA_AVALON_SPI_RXDATA(SPI_BASE); while(1){ send(wrdata); rddata=receive(); } return 0; } //-------------------------------------- SEND ------------------------------------------------------------------------- void send(alt_u16 write){ alt_u32 status; alt_u16 data; IOWR_ALTERA_AVALON_SPI_CONTROL(SPI_BASE, 0x0400); IORD_ALTERA_AVALON_SPI_RXDATA(SPI_BASE); do{ status = IORD_ALTERA_AVALON_SPI_STATUS(SPI_BASE); } while (((status & ALTERA_AVALON_SPI_STATUS_TRDY_MSK) == 0)&&(status & ALTERA_AVALON_SPI_STATUS_RRDY_MSK) == 0); IOWR_ALTERA_AVALON_SPI_TXDATA(SPI_BASE , write); data=IORD_ALTERA_AVALON_SPI_RXDATA(SPI_BASE); do{ status = IORD_ALTERA_AVALON_SPI_STATUS(SPI_BASE); } while ((status & ALTERA_AVALON_SPI_STATUS_TMT_MSK) == 0); IOWR_ALTERA_AVALON_SPI_CONTROL(SPI_BASE, 0); } //----------------------------------- RECEIVE -------------------------------------------------------------------------- alt_u16 receive(){ alt_u16 data; alt_u32 status; IOWR_ALTERA_AVALON_SPI_CONTROL(SPI_BASE, 0x0400); IORD_ALTERA_AVALON_SPI_RXDATA(SPI_BASE); do{ status = IORD_ALTERA_AVALON_SPI_STATUS(SPI_BASE); } while (((status & ALTERA_AVALON_SPI_STATUS_TRDY_MSK) == 0 ) && (status & ALTERA_AVALON_SPI_STATUS_RRDY_MSK) == 0); IOWR_ALTERA_AVALON_SPI_TXDATA(SPI_BASE , 0x00); data=IORD_ALTERA_AVALON_SPI_RXDATA(SPI_BASE); do{ status = IORD_ALTERA_AVALON_SPI_STATUS(SPI_BASE); } while ((status & ALTERA_AVALON_SPI_STATUS_TMT_MSK) == 0); IOWR_ALTERA_AVALON_SPI_CONTROL(SPI_BASE, 0); return data; } The question is "What's the difference between alt_avalon_spi_command() and IOWR_ALTERA_AVALON_SPI_TXDATA() to transmit a data via SPI"? Thank you all :)