尊敬的各位TI员工,各路大神:
我最近在调试OMAPL138 的UPP 程序时遇到了很棘手的问题,已经卡在这好几天了,各种办法,各种试,实在没辙了.请求各位指点,情况如下:
我使用的是ARM端与FPGA进行 双16位UPP通道的全双工通信.UPP配置为双16位 A发送 B接收双工模式.单速率.
首先ARM端采用A通道发送一帧数据,FPGA接收到后,再发送给ARM端B通道一帧数据.为了调试,后面就不发送和接收任何数据了.现在问题情况是:
1.发送接收的时序波形,发送接收的数据都对.两个发送和接收缓冲区数组的数据与波形数据完全一致,说明硬件外设没有任何问题.
2.我用仿真器跟踪每个寄存器的设置,状态寄存器,配置寄存器等等,每个都寄存器的每个位都一一核对,都没有问题.
3.但是就是进入到UPPIsr后,问题就来了.竟然就出不来了,此时外部硬件确认不发送和接受任何数据.为了配合调试我只发送和接收一次.UPPIsr按照官方提供的样例程序写的.尽管我查看那些寄存器该清除的标志位,都清除了.一步步跟踪都是对的.就是在执行UPP_UPEOI=0;后程序就又跳转到UPPIsr入口处执行.UPPIsr代码如下:
interrupt void UPPIsr(void)
{
unsigned long intr_status = HWREG(SOC_UPP_0_REGS + UPP_UPIER);
testupp+=1;
while (intr_status != 0)
{
if (intr_status & UPP_UPIER_EOLI) //DMA_I通道每一行发送结束引发的中断
{
HWREG(SOC_UPP_0_REGS + UPP_UPIER) =1<<UPP_UPIER_EOLI_SHIFT;
}
if (intr_status & UPP_UPIER_EOWI) //DMA_I通道达到WINDOW底部引发的中断
{
HWREG(SOC_UPP_0_REGS + UPP_UPIER) =1<<UPP_UPIER_EOWI_SHIFT;
Counter_UppTransmitInterrupt++;
Sign_UppTransmitInterrupt=1;
}
if (intr_status & UPP_UPIER_ERRI) //DMA_I故障引发的中断
{
HWREG(SOC_UPP_0_REGS + UPP_UPIER) =1<<UPP_UPIER_ERRI_SHIFT;
Counter_UppTransmitError++;
}
if (intr_status & UPP_UPIER_UORI) //DMA_I故障引发的中断
{
HWREG(SOC_UPP_0_REGS + UPP_UPIER) =1<<UPP_UPIER_UORI_SHIFT;
Counter_UppTransmitError++;
}
if (intr_status & UPP_UPIER_DPEI) //DMA_I故障引发的中断
{
HWREG(SOC_UPP_0_REGS + UPP_UPIER) =1<<UPP_UPIER_DPEI_SHIFT;
Counter_UppTransmitError++;
}
if (intr_status & UPP_UPIER_EOLQ) //DMA_Q通道每一行发送结束引发的中断
{
HWREG(SOC_UPP_0_REGS + UPP_UPIER) =1<<UPP_UPIER_EOLQ_SHIFT;
}
if (intr_status & UPP_UPIER_EOWQ) //DMA_Q通道达到WINDOW底部引发的中断
{
HWREG(SOC_UPP_0_REGS + UPP_UPIER) =1<<UPP_UPIER_EOWQ_SHIFT;
Counter_UppReceiveInterrupt++;
Sign_UppReceiveInterrupt=1;
}
if (intr_status & UPP_UPIER_ERRQ) //DMA_Q故障引发的中断
{
HWREG(SOC_UPP_0_REGS + UPP_UPIER) =1<<UPP_UPIER_ERRQ_SHIFT;
Counter_UppReceiveError++;
}
if (intr_status & UPP_UPIER_UORQ) //DMA_Q故障引发的中断
{
HWREG(SOC_UPP_0_REGS + UPP_UPIER) =1<<UPP_UPIER_UORQ_SHIFT;
Counter_UppReceiveError++;
}
if (intr_status & UPP_UPIER_DPEQ) //DMA_Q故障引发的中断
{
HWREG(SOC_UPP_0_REGS + UPP_UPIER) =1<<UPP_UPIER_DPEQ_SHIFT;
Counter_UppReceiveError++;
}
// make sure all interrupts are handled
intr_status = HWREG(SOC_UPP_0_REGS + UPP_UPIER);
}
// finally: write 0 to EOI register
HWREG(SOC_UPP_0_REGS + UPP_UPEOI) =0;
}
