首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

spi通信

spi通信

请教各位高手:下面是我写的一段SPI通信驱动LED的程序,运行到alt_irq_register(SPI_IRQ,(void*) &data , spi_interrupts);程序就死在那了????不知道什么问题???


使用alt_main()程序能跑但是没有办法中断,哪为高人用过SPI中断的指教小弟一下!!!


#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "sys/alt_irq.h"
#include "altera_avalon_spi.h"
#include "altera_avalon_spi_regs.h"



alt_u8 led;
int data;


static void spi_interrupts(void* context, alt_u32 id)
{
  if(IORD_ALTERA_AVALON_SPI_STATUS(SPI_BASE)==0x40)
  {
      led++;
      IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led);
  }
  IOWR_ALTERA_AVALON_SPI_STATUS(SPI_BASE, 0x00);
}



void DelayNS(alt_u32 time)
{
   alt_u32 i,j ;
   for(i=0;i<time;i++)
   {
      for(j=0;j<100;j++);
   }
 
}
 
 
void spi_ini(void)
{
   //IOWR_ALTERA_AVALON_SPI_SLAVE_SEL(SPI_BASE, 0x01); 
   alt_irq_register(SPI_IRQ,(void*) &data , spi_interrupts);
   IOWR_ALTERA_AVALON_SPI_STATUS(SPI_BASE, 0x00);
   IOWR_ALTERA_AVALON_SPI_CONTROL(SPI_BASE, 0xc0);
   IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0xff);
   DelayNS(2000);
}  



 
//int main (void) __attribute__ ((weak, alias ("alt_main")));


  /*
   * Use alt_main as entry point for this free-standing application
   */


int main (void)
{
    const alt_u8  DISP_TAB[16] = { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
                                 0x88,0x83,0xC6,0xA1,0x86,0x8E };
    alt_u8 i;
    IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0xf0);
    spi_ini();
    IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x0f);
    while (1)
    {
      for(i=0; i<16; i++)
      { 
       IOWR_ALTERA_AVALON_SPI_TXDATA(SPI_BASE, DISP_TAB); // 输出LED显示数据
        DelayNS(2000);   // 延时
      }      
    }
  return 0;
}

单用alt_main(),自己不进行初始化的话,肯定跑不通中断。nios里面的spi接口好像不怎么好跑。
在交流中前进,共同实现nios的应用。
我估计是spi通信的中断注册有问题!是不是没有注册失败就会导致系统崩溃!
没有注册成功一般也不会引起系统崩溃。
在交流中前进,共同实现nios的应用。
返回列表