// uPP A 通道启动发送
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &transposeParA);
// uPP B 通道启动接收
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &transposeParB);
// 等待 uPP 传输完毕
delay(0x00FFFFFF);
while (upp_interrupt_count < target_int_count && upp_error_count == 0)
{
}
您好,我想问一下upp发送完成后需要等待B通道接收中断吗?为什么我加上while(upp_interrupt_count < target_int_count && upp_error_count == 0)这条语句,EOW一直不中断呢?如果去掉这条语句,就会有中断,但是第一次发送的数据会有几个错误,之后的数据正常。这是什么问题?
下面这个是中断服务函数。
void uPPIsr(void)
{
unsigned int intr_dmai_status, intr_dmaq_status;
// 取得 DMA 中断状态
intr_dmai_status = uPPIntStatus(SOC_UPP_0_REGS, uPP_DMA_CHI);
intr_dmaq_status = uPPIntStatus(SOC_UPP_0_REGS, uPP_DMA_CHQ);
while(intr_dmai_status != 0 || intr_dmaq_status != 0)
{
if (intr_dmai_status & uPP_INT_EOL) //通道I行结束中断
{
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_EOL); //清除中断
}
if (intr_dmai_status & uPP_INT_EOW) //通道I窗口结束中断
{
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_EOW);
upp_interrupt_count++;
}
if (intr_dmai_status & uPP_INT_ERR) //通道I错误中断
{
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_ERR);
upp_error_count++;
}
if (intr_dmai_status & uPP_INT_UOR) //通道I欠载/溢出中断
{
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_UOR);
upp_error_count++;
}
if (intr_dmai_status & uPP_INT_DPE) //通道I编程错误中断
{
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_DPE);
upp_error_count++;
}
if (intr_dmaq_status & uPP_INT_EOL) //通道Q行结束中断
{
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHQ, uPP_INT_EOL);
}
if (intr_dmaq_status & uPP_INT_EOW) //通道Q窗口结束中断
{
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHQ, uPP_INT_EOW);
upp_interrupt_count++;
}
if (intr_dmaq_status & uPP_INT_ERR) //通道Q错误中断
{
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHQ, uPP_INT_ERR);
upp_error_count++;
}
if (intr_dmaq_status & uPP_INT_UOR) //通道Q欠载/溢出中断
{
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHQ, uPP_INT_UOR);
upp_error_count++;
}
if (intr_dmaq_status & uPP_INT_DPE) //通道Q编程错误中断
{
uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHQ, uPP_INT_DPE);
upp_error_count++;
}
// uPP 中断将多个事件组合为同一中断源
// 判断是否全部事情被处理完毕
intr_dmai_status = uPPIntStatus(SOC_UPP_0_REGS, uPP_DMA_CHI);
intr_dmaq_status = uPPIntStatus(SOC_UPP_0_REGS, uPP_DMA_CHQ);
}
// 通知 CPU uPP 中断处理完毕以便后续事件可以产生
uPPEndOfInt(SOC_UPP_0_REGS);
}
Tony Tang:
user5250905delay(0x00FFFFFF);
在中断系统中,这个delay没有什么用吧。
user5250905我想问一下upp发送完成后需要等待B通道接收中断吗?为什么我加上while(upp_interrupt_count < target_int_count && upp_error_count == 0)这条语句,EOW一直不中断呢?如果去掉这条语句,就会有中断,
这条语句跟中断没有关系啊。这里仅仅是一个while等待状态,能跟中断是否发生有什么关系呢?