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错误是在什么情况下面出现的,好做出修改。
Kevin Le82:
dsp端(i channel)40us周期性发送512字节数据给fpga,fpga(q channel)不定时(有部分检测io脚的数据,当有更新时)发送128字节给dsp,经常会出现uori错误(dsp发送端产生的),不知道这个错误是在什么情况下产生的。发送前数据都已经更新到内存,而且发送时,dsp是比较空闲的状态
Tony Tang:
Kevin LeWait_upp_SendReadyQI(x);
的代码实现?
Kevin Le82:
回复 Tony Tang:
这个的实现就是判断当前upp是否有待发送的数据,就是upp的一个标志位pend。很简单的,在家里没法添加具体代码。upp发送支持两个发送数据,一个当前,一个排队数据。。。
Kevin Le82:
回复 Kevin Le82:
//等待uPP发送准备好#define upp_ChkPendQI(x) ((upp_reg_hdl->UP##x##S2) & 0x00000002)#define Wait_upp_SendReadyQI(x) while(upp_ChkPendQI(x))#define upp_line_count_s (1)#define upp_frame_size_s (upp_line_size_s * upp_line_count_s)#define upp_line_offset_s (upp_line_size_s)#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);\ }#if UPP_DIR_QI#define upp_dma_sendstart() upp_dma_sendstartQI(I)#define upp_dma_receivestart() upp_dma_receivestartQI(Q)#else#define upp_dma_sendstart() upp_dma_sendstartQI(Q)#define upp_dma_receivestart() upp_dma_receivestartQI(I)#endif
Kevin Le82:
回复 Kevin Le82:
1、dsp初始化upp设备后,在没有发送数据的情况下,dsp使用的upp的发送端start、enable信号一直是高电平,这是不正常的,应该是低电平才对。
2、在启动uppdma输出后,start信号的高电平有点长(如发间隔为50us,start的高电平达到45us,低电平才5us;start信号不应该是比较短的吗?看手册画的start信号是一个很短的高电平),而且enable信号一直是高从来没低过(数据传输完成,不应该降为低电平吗?),这是什么原因?
Kevin Le82:
回复 Kevin Le82:
重新对着例程重新初始化upp设备,目前start、enable信号是正常的。目前是:发送数据有1*512Byte字节,每40us传输一次,接收为 1*128Byte不定时FPGA检测硬件状态后上传。想问一下,TXSIZEA(B),RDSIZEI(Q),要怎样设置。试了各种组合,甚至将单速率 传输由37.5Mhz降到25Mhz,upp的uori(q)错误一直都有发生(发送端)