fpga给c6455发doorbell中断,从DOORBELL0_ICSR寄存器来看是收到了中断信号,但是进不了中断服务函数,配置为1x模式,srio可以进行nwrite等操作,
我的doorbell中断配置如下:
在dsp/bios中的配置:
bios.HWI.instance("HWI_INT10").fxn = prog.extern("srio_db_ISR");
bios.HWI.instance("HWI_INT10").interruptSelectNumber = 20;
bios.HWI.instance("HWI_INT10").useDispatcher = 1;
中断服务程序为:
void srio_db_ISR(void)
{
Uint32 doorbell;
printf("enter doorbell interrupt \n");
//read doorbell.
doorbell = SRIO_REGS->DOORBELL_INTR[0].DOORBELL_ICSR;
//printf("received doorbell value %d\n",doorbell);
//clear doorbell interrupt
SRIO_REGS->DOORBELL_INTR[0].DOORBELL_ICCR = doorbell;
SRIO_REGS->INTDST_RATE_CNTL[0] = 0;
……………
}
请问还有那些需要注意的?谢谢
Shine:
请检查一下总中断CSR有没有使能?IFR对应的标志位有没有置1?
user6027759:
回复 Shine:
我查看了寄存器,如下图
请问有什么问题?另外我还使用了i2c中断,HWI_INT4事件是16,i2c中断能正常工作。
user6027759:
回复 Shine:
另外我的程序是跑在dsp/bios上的
下面是关于中断的初始化
srioRegs->LSU_ICCR = 0xFFFFFFFF; for (i = 0; i < 4; i++) { srioRegs->LSU_ICRR[i] = 0x11111111; }
srioRegs->ERR_RST_EVNT_ICCR = 0xFFFFFFFF; for (i = 0; i < 4; i++) { srioRegs->DOORBELL_INTR[i].DOORBELL_ICCR = 0xFFFFFFFF; srioRegs->DOORBELL_INTR_ROUTE[i].DOORBELL_ICRR = 0x11111111; srioRegs->DOORBELL_INTR_ROUTE[i].DOORBELL_ICRR2 = 0x11111111; }
Shine:
回复 user6027759:
看了一下IFR=0x8,您把SRIO中断映射到INT10,IFR对应的INT10并没有置1,表示中断没有发生。CSR.bit0 GIE位也没有置1,使能总中断。检查一下INTMUXn是否把中断事件映射到INT10了?
另外,您可以按照配置I2C中断的方法配置SRIO。
user6027759:
回复 Shine:
INTMUXn中断事件映射成功,CSR.bit0我强制置1了,但是fpga发送门铃中断还是进不了中断函数。
另外我就是用i2c的方法配置的doorbell中断!
我调试c6678发现能否进中断函数跟FPGA的门铃信息有关。
请问这跟门铃信息的值相关吗,FPGA需要写多少?
Shine:
回复 user6027759:
你把IFR.int10位强制置1看能不能进中断?
user6027759:
回复 Shine:
IFR.int10无法控制,只能控制ISR.int10是可以进入中断函数的
user6027759:
回复 user6027759:
请问有什么建议
Shine:
回复 user6027759:
您的意思是不能手动改IFR寄存器?进入中断的条件是需要IFR置1,GIE使能,这两个条件需要同时满足,才会跳转到中断子程序。