#include "system.h" #include "altera_avalon_pio_regs.h" #include "altera_avalon_timer_regs.h" #include "altera_avalon_timer.h" #include "altera_nios2_qsys_irq.h" #include "sys/alt_irq.h" #ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT static void handle_timer_interrupts(void* context); #else static void handle_timer_interrupts(void* context, alt_u32 id); #endif #ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT static void handle_pio_interrupts(void* context); #else static void handle_pio_interrupts(void* context, alt_u32 id); #endif void init_timer_interrupt(void); void init_pio_interrupt(void); alt_u32 mosi; volatile unsigned char flag = 0; volatile unsigned char mosiIndex = 0; volatile unsigned char initDAC = 0; unsigned char writeToDAC = 0; volatile unsigned char startCLK = 0; volatile unsigned char endTx = 0; volatile unsigned char stopSync = 0; volatile unsigned char pulseLDAC = 0; volatile unsigned char stopLDAC = 0; int main() { IOWR_ALTERA_AVALON_PIO_DATA(PIO_3_BASE, IORD_ALTERA_AVALON_PIO_DATA(PIO_3_BASE) | (1 << 5)); //Reset_N off; IOWR_ALTERA_AVALON_PIO_DATA(PIO_3_BASE, IORD_ALTERA_AVALON_PIO_DATA(PIO_3_BASE) | (1 << 4)); //Clear_N off; IOWR_ALTERA_AVALON_PIO_DATA(PIO_3_BASE, IORD_ALTERA_AVALON_PIO_DATA(PIO_3_BASE) | (1 << 3)); //LDAC_N off; IOWR_ALTERA_AVALON_PIO_DATA(PIO_3_BASE, IORD_ALTERA_AVALON_PIO_DATA(PIO_3_BASE) | (1 << 2)); //Slave select_N off; IOWR_ALTERA_AVALON_PIO_DATA(PIO_3_BASE, IORD_ALTERA_AVALON_PIO_DATA(PIO_3_BASE) | (1 << 1)); //MOSI_N off; IOWR_ALTERA_AVALON_PIO_DATA(PIO_3_BASE, IORD_ALTERA_AVALON_PIO_DATA(PIO_3_BASE) | 1); //CLK idle; init_pio_interrupt(); for(;;) { if (flag == 1) { stopLDAC = 0; pulseLDAC = 0; stopSync = 0; mosiIndex = 0; startCLK = 0; endTx = 0; if(initDAC == 0) mosi = 0x00480004; //initialises the DAC else { mosi = 0x00000038; } init_timer_interrupt(); //start the timer flag = 0; //resets the flag initDAC = 1; //Determines what to send; } } return 0; } void init_timer_interrupt(void) { int* ptr; IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE, (1<<3) | (1 << 1) |(1 << 0)); IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE,0);// Clear TO Bit(Reaching 0) IOWR_ALTERA_AVALON_TIMER_PERIODL(TIMER_0_BASE,(alt_u16)(49));// IOWR_ALTERA_AVALON_TIMER_PERIODH(TIMER_0_BASE,(alt_u16)(49>>16)); alt_ic_isr_register(TIMER_0_IRQ_INTERRUPT_CONTROLLER_ID, TIMER_0_IRQ,handle_timer_interrupts, ptr, 0x0); //Register Interrupt IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE,(1<<2) | (1 << 1) | (1 << 0) );//Start Timer, IRQ enable, Continuous enable } #ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT static void handle_timer_interrupts(void* context) #else static void handle_timer_interrupts(void* context, alt_u32 id) #endif { IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE,0);//Clear TO(timeout) bit) if(startCLK != 0 && endTx != 1) IOWR_ALTERA_AVALON_PIO_DATA(PIO_3_BASE, IORD_ALTERA_AVALON_PIO_DATA(PIO_3_BASE) ^ 1); //make clock if((IORD_ALTERA_AVALON_PIO_DATA(PIO_3_BASE) & 1) && endTx != 1) IOWR_ALTERA_AVALON_PIO_DATA(PIO_3_BASE, (IORD_ALTERA_AVALON_PIO_DATA(PIO_3_BASE) - (IORD_ALTERA_AVALON_PIO_DATA(PIO_3_BASE) & 2)) | (((mosi & (1<