TI中文支持网
TI专业的中文技术问题搜集分享网站

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

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)错误一直都有发生(发送端)

赞(0)
未经允许不得转载:TI中文支持网 » FPGA和Omapl138的dsp核使用upp通信,总是出现uor错误中断,这时为什么?
分享到: 更多 (0)