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.

[参考译文] CCS/TM4C1294NCPDT:使用 EMAC 时出现 UDMA 总线错误

Guru**** 2042910 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/648189/ccs-tm4c1294ncpdt-udma-bus-errors-when-using-emac

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

您好!

在使用 EMAC DMA 时、是否有任何方法来设置 EMAC DMA 和 UDMA 的优先级、或避免 UDMA 上的总线错误?

我需要在乒乓模式下使用 uDMA (MEMORY -> SSI1)持续发送数据28ms、然后传输停止约5ms。 然后重复循环。

如果以太网数据包在 UDMA 传输期间到达、则会导致 UDMA 总线错误- 调用 uDMAErrorHandler、 uDMAErrorStatusGet 返回1。 因此、乒乓传输停止(必须避免这种情况、必须保持恒定的数据流)。

在这种情况下、ETH 的优先级可能较低、如果需要、数据复制可能会被推迟。

我不使用 RTOS、使用具有几乎默认配置的 lwIP 堆栈(向 ETH 添加了更多缓冲区)。

有没有关于如何消除 uDMA 总线错误的想法?

太棒了!

我的配置如下:

#define SysTK_INT_PRIORITY 0x80
#define ETHERNET_INT_PRIORITY 0xC0
#define SSI1_INT_PRIORITY 0x00

int main(){
(...)
MAP_IntPrioritySet (INT_EMAC0、ETHERNET_INT_PRIORITY);
MAP_IntPrioritySet (FAULT_SysTick、SysTK_INT_PRIORITY);
MAP_IntPrioritySet (INT_SSI1、 SSI1_INT_PRIORITY);

uDMAChannelAttributeDisable (UDMA_CHANGE_SSI1TX、
UDMA_ATTR_ALTSELECT |
UDMA_ATTR_HIGH_PRIOR|
UDMA_ATTR_REQMASK);

uDMAChannelControlSet (UDMA_CHANGE_SSI1TX | UDMA_PRI_SELECT、
UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE |
UDMA_ARB_4);

uDMAChannelControlSet (UDMA_CHANGE_SSI1TX | UDMA_ALT_SELECT、
UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE |
UDMA_ARB_4);

SSIIntEnable (SSI1_BASE、SSI_DMATX);
(... 通道传输置位、uDMAChannelEnable...)
IntEnable (INT_SSI1);

}

lwIPInit ()
{
MAP_EMACPHYConfigSet (EMAC0_BASE、EMAC_PHY_CONFIG);

//
//初始化 MAC 并设置 DMA 模式。
//
MAP_EMACInit (EMAC0_BASE、ui32SysClkHz、
EMAC_BCONFIG_DMA_PRIO_权 重_1 | EMAC_BCONFIG_Mixed_BURST | EMAC_BCONFIG_PRIORY_FIXED、
1、1、0);//<<<<<<<<--这是在没有 PRIO_weight 参数和4、4、0的情况下设置的默认值。 结果是相同的。

//
//设置 MAC 配置选项。
//
MAP_EMACConfigSet (EMAC0_BASE、(EMAC_CONFIG_FUL_DUPLEX |
EMAC_CONFIG_CHECKSUM_OFFLOAD |
EMAC_CONFIG_7BYTE_PREAMBLE |
EMAC_CONFIG_IF_GAP_96BITS |
EMAC_CONFIG_USE_MACADDR0 |
EMAC_CONFIG_SA_FTER_descriptor |
EMAC_CONFIG_BO_LIMIT_1024)、
(EMAC_MODE_RX_STORE_Forward |
EMAC_MODE_TX_STORE_Forward |
EMAC_MODE_TX_THRESHOLD_64_Bytes |
EMAC_MODE_RX_THREST_64_Bytes)、0);
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、话题可能已结束。

    原因是堆栈溢出。 它被设置为512字节。

    在 Eth 读取函数中、我在堆栈上分配了1、5kB 缓冲器(用于测试目的)、有时它会覆盖 DMA 乒乓配置结构。 因此、在接下来的一个周期中、它会由于无效地址而导致 DMA 总线错误。

    谢谢!
    mj