模块架构:
NIOS通过SPI向Verilog端发送控制数据,Verilog端接收SPI发送的数据,然后控制sensor工作,同时数据存储在ram中,数据存储完毕后,NIOS读取Verilog端ram中的数据
软核部分模块:
软核代码:
#include <stdio.h>
#include "system.h"
#include "io.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "sys/unistd.h"
#include "sys/alt_irq.h"
#include "string.h"
#include "sys/alt_cache.h"
#include "altera_avalon_spi.h"
#include "altera_avalon_spi_regs.h"
#define DATA_LEN 288
#define EXPOSURE_INF 0x300003E8 //控制信息
unsigned int buffer[288];
void isr_init();
void isr_execute();
int main()
{
int i;
int n;
// unsigned int exposure_inf[4] = {0x30,0x00,0x03,0xE8};
unsigned int exposure_inf[4];
unsigned int rx_data[4];
for(n=0;n<4;n++)
{
switch(n)
{
case 0:
exposure_inf[0] = (EXPOSURE_INF & (0xFF000000)) >> 24;
continue;
case 1:
exposure_inf[1] = (EXPOSURE_INF & (0x00FF0000)) >> 16;
continue;
case 2:
exposure_inf[2] = (EXPOSURE_INF & (0x0000FF00)) >> 8;
continue;
case 3:
exposure_inf[3] = EXPOSURE_INF & (0x000000FF);
continue;
default:break;
}
}
for(i=0;i<4;i++)
{
alt_avalon_spi_command(SPI_BASE,0,1,&exposure_inf[i],0,rx_data,0);//调用SPI
}
printf("Hello from Nios II!\n");
while(1)
{
isr_init();
}
return 0;
}
void isr_init()
{
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_IRQ_BASE,0x01);
alt_ic_isr_register(PIO_IRQ_IRQ_INTERRUPT_CONTROLLER_ID,PIO_IRQ_IRQ,isr_execute,NULL,0x00);
}
void isr_execute()
{
int j;
int k;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_RD_REQ_BASE,0x00);
for(j=0;j<DATA_LEN;j++)
{
IOWR_ALTERA_AVALON_PIO_DATA(PIO_RD_REQ_BASE,0x01);
IOWR_ALTERA_AVALON_PIO_DATA(PIO_RD_REQ_BASE,0x00);
buffer[j] = IORD_ALTERA_AVALON_PIO_DATA(PIO_DATA_BASE);
}
usleep((EXPOSURE_INF&(0x00FFFFFF))+1000);//等待
printf("=====Start=====\n");
for(k=0;k<DATA_LEN;k++)
{
printf("buffer[%d]=%u\t",k,buffer[k]);
}
printf("\n");
printf("=====End=====\n");
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_IRQ_BASE,0x00);
}