FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
dsp使用i发送到fpga,fpga使用q发送数据到dsp,dsp的发送中断间隔是40us左右,经常收到uori错误,不知道是什么原因。示波器看每次upp发送时间都是很少的。upp中断服务程序如下:
u32 UPP_Isr()
{
Uint32 intr_status = upp_reg_hdl->UPIER;
upp_reg_hdl->UPIER = intr_status;//clear
// Log_print0(Diags_ENTRY | Diags_INFO, "--> UPP_Isr:");
u32 ret=0;
// inline functions
while (intr_status != 0)
{
if (intr_status & CSL_UPP_UPISR_EOLI_MASK)//Line结束事件
{
// Log_print0(Diags_INFO,"eoli.\n");
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLI_MASK);
}
if (intr_status & CSL_UPP_UPISR_EOWI_MASK)//Window结束事件
{
Log_print0(Diags_INFO,"eowi.\n");
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWI_MASK);
upp_interrupt_count++;
upp_interrupt_eowi_count++;
#if UPP_DIR_QI==0
upp_dma_receivestart();
ret=1;
#endif
}
if (intr_status & CSL_UPP_UPISR_ERRI_MASK)//内部总线错误事件
{
Log_print0(Diags_INFO,"erri.\n");
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRI_MASK);
upp_error_count++;
}
if (intr_status & CSL_UPP_UPISR_UORI_MASK)//欠载或溢出事件
{
Log_print0(Diags_INFO,"uori.\n");
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORI_MASK);
upp_error_count++;
}
if (intr_status & CSL_UPP_UPISR_DPEI_MASK)//DMA编程错误事件
{
Log_print0(Diags_INFO,"dpei.\n");
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEI_MASK);
upp_error_count++;
}
if (intr_status & CSL_UPP_UPISR_EOLQ_MASK)
{
// Log_print0(Diags_INFO,"eolq.\n");
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOLQ_MASK);
}
if (intr_status & CSL_UPP_UPISR_EOWQ_MASK)
{
// Log_print0(Diags_INFO,"eowq.\n");
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_EOWQ_MASK);
upp_interrupt_count++;
#if UPP_DIR_QI==1
upp_dma_receivestart();
ret=1;
#endif
}
if (intr_status & CSL_UPP_UPISR_ERRQ_MASK)
{
Log_print0(Diags_INFO,"errq.\n");
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_ERRQ_MASK);
upp_error_count++;
}
if (intr_status & CSL_UPP_UPISR_UORQ_MASK)
{
Log_print0(Diags_INFO,"uorq.\n");
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_UORQ_MASK);
upp_error_count++;
}
if (intr_status & CSL_UPP_UPISR_DPEQ_MASK)
{
Log_print0(Diags_INFO,"dpeq.\n");
upp_reg_hdl->UPIER = (CSL_UPP_UPISR_DPEQ_MASK);
upp_error_count++;
}
// make sure all interrupts are handled
intr_status = upp_reg_hdl->UPIER;
}
// finally: write 0 to EOI register
upp_reg_hdl->UPEOI = 0;
return ret;
}
dsp发送区大小为512字节,发送txsize设置为256字节。使用的是单行,win窗口是512发送方式。发送调用upp_dma_sendstartQI(I):
#define upp_dma_sendstartQI(x) {\
Wait_upp_SendReadyQI(x); \
upp_reg_hdl->UP##x##D0 = (u32)&g_uPPSend; \
upp_reg_hdl->UP##x##D1 = ((u32)upp_line_count_s << 16) | (u32)upp_line_size_s*sizeof(s32); \
upp_reg_hdl->UP##x##D2 = (u32)upp_line_offset_s * sizeof(s32);\
}
#define upp_dma_sendstart() upp_dma_sendstartQI(I)
想知道uori错误是在什么情况下面出现的,好做出修改。
