This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?



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错误是在什么情况下面出现的,好做出修改。

  • dsp端(i channel)40us周期性发送512字节数据给fpga,fpga(q channel)不定时(有部分检测io脚的数据,当有更新时)发送128字节给dsp,经常会出现uori错误(dsp发送端产生的),不知道这个错误是在什么情况下产生的。发送前数据都已经更新到内存,而且发送时,dsp是比较空闲的状态

  • Kevin Le 说:
    Wait_upp_SendReadyQI(x);

    的代码实现?

  • 这个的实现就是判断当前upp是否有待发送的数据,就是upp的一个标志位pend。很简单的,在家里没法添加具体代码。upp发送支持两个发送数据,一个当前,一个排队数据。。。

  • //等待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

  • 1、dsp初始化upp设备后,在没有发送数据的情况下,dsp使用的upp的发送端start、enable信号一直是高电平,这是不正常的,应该是低电平才对。

    2、在启动uppdma输出后,start信号的高电平有点长(如发间隔为50us,start的高电平达到45us,低电平才5us;start信号不应该是比较短的吗?看手册画的start信号是一个很短的高电平),而且enable信号一直是高从来没低过(数据传输完成,不应该降为低电平吗?),这是什么原因?

  • 重新对着例程重新初始化upp设备,目前start、enable信号是正常的。目前是:发送数据有1*512Byte字节,每40us传输一次,接收为 1*128Byte不定时FPGA检测硬件状态后上传。想问一下,TXSIZEA(B),RDSIZEI(Q),要怎样设置。试了各种组合,甚至将单速率 传输由37.5Mhz降到25Mhz,upp的uori(q)错误一直都有发生(发送端)