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.

[参考译文] TM4C1294NCPDT:TM4C1294NCPDT

Guru**** 2609285 points
Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1311040/tm4c1294ncpdt-tm4c1294ncpdt

器件型号:TM4C1294NCPDT

您好!

我的应用打算生成250KHz 的 PWM 信号、我们使用 UDP 协议通过以太网实时提供样片。 器件:TM4C1294NCPDT

我使用 enet_uip 示例构建我的代码。 目前、我能够接收数据包并生成所需的 PWM 信号、但由于发送 PC 时出现网络延迟、我无法保持生成的信号的保真度。 在目前的代码中、我正在使用 代码行 #define NUM_RX_描述 符3的3个以太网接收描述符。

现在、我想将接收缓冲器的数量增加到6或12以解决该问题。 我只需更改代码 #define NUM_RX_描述 符12即可实现这一点。 代码正在编译、没有错误、但是微控制器中没有发生以太网接收。

那么、我的问题是如何将接收描述符的数量增加到12个。  

enet_uip.c 的注释部分提到

"// MAC 硬件至少需要3个接收描述符才能运行。 为
//使用的数字取决于应用程序,应针对最佳情况进行调整
//性能。"

请求在这方面帮助我。

提前感谢。  

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

    您好!

     我不确定。 我想知道您是否将  NUM_RX_描述 符设置为4、5或6、它会起什么作用。 话虽如此,我真的怀疑你的问题与描述符的数目有关。 每个描述符可能最多可以传输一个以太网数据帧、该数据帧大约为1500字节。 如果您接收到的数据仅用于更改 PWM 信号的占空比、那么我认为增加描述符数量对任何性能都没有好处。  

     为什么不首先查看描述符列表? 12个描述符是否正确链接在一起? 最后一个描述符是否表示为链中的最后一个描述符?

     我建议您单步执行、将断点放置在中断中以及调用 PacketRecieve 的行中。  

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

    您好!

    使用3个描述符、我能够接收并生成所需的 PWM 信号。 如果可以增加接收缓冲区的数量、PC 发送的 UDP 小抖动将不起作用。 这就是我想要增加描述符数量的原因。  

    因此、任何高于3的 NUM_RX_描述 符值都将有所帮助。  

    论坛中是否有人 对 NUM_RX_描述 符使用了大于3的值、以及如何执行该操作。 是否有可用的代码示例?

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

    我只能说明它的编码方式、所有三个 RX 描述符都指向同一个缓冲区。 如果你看看我在运行同一示例时捕获的内容、这三个描述符都指向0x20000644处的同一缓冲区。 这与示例中的注释相符、在该示例中、根据设计、UIP 仅使用单个缓冲区。 使用这三个描述符的原因是为了满足与 UIP 无关的硬件要求。 因此,增加描述符的数量,我认为从 UIP 的角度看没有帮助。 我几乎没有看到人们在论坛上开始使用 UIP、更不用说问如果增加描述符的数量、会有什么表现。 您试过4或5个描述符了吗? 结果是什么?

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

    我尝试通过更改代码行将描述符的数量增加到4个甚至更多:

    #define NUM_RX_DODERS 4.

    但是、我无法接收任何数据包、甚至来自 UC 的数据包传输也会停止。  

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

    我不知道你还改变了什么。 请注意、该示例只是一个简单的 Web 服务器。 您可能只更改  NUM_RX_DODERS 以外 的内容。  

    我将 TX 和 RX 都更改为12并运行示例。 我看不出任何问题。  

    #define NUM_TX_DODERS 12
    #define NUM_RX_描述 符12

    如前所述、UIP 仅使用一个缓冲区 、即使您保留3或12也无助于示例的注释。 如果您查看12个描述符、它们都指向同一个缓冲区。  

    我将建议您使用 Wireshark 来了解您的问题。

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

    您好!

    我使用 Tivaware 用户指南中提供的示例修改了 UIP 代码部分。 但是、如果您看到用户指南中的代码部分、则缓冲区的 TX 和 RX 互换存在很小(但有问题)的错误、如下图所示。  

     

    我更正了这个 TX 和 RX 的互换。 即使这样、它也无法接收和传输数据包。 但是当我选中"Debug"时、分配了12个缓冲区、如之前的回复中所示。 我将附加缓冲区的代码部分和描述符初始化。  

    //*****************************************************************************
    //
    // Ethernet DMA descriptors.
    //
    // The MAC hardware needs a minimum of 3 receive descriptors to operate. The
    // number used will be application-dependent and should be tuned for best
    // performance.
    //
    //*****************************************************************************
    #define NUM_TX_DESCRIPTORS 3
    #define NUM_RX_DESCRIPTORS 24
    tEMACDMADescriptor g_psRxDescriptor[NUM_RX_DESCRIPTORS];
    tEMACDMADescriptor g_psTxDescriptor[NUM_TX_DESCRIPTORS];
    uint32_t g_ui32RxDescIndex;
    uint32_t g_ui32TxDescIndex;
    
    #define RX_BUFFER_SIZE 1536
    uint8_t g_ppui8RxBuffer[NUM_RX_DESCRIPTORS][RX_BUFFER_SIZE];
    
    
    
    void
    InitDescriptors(uint32_t ui32Base)
    {
    		uint32_t ui32Loop;
    	
    		// Initialize each of the transmit descriptors. Note that we leave the
    		// buffer pointer and size empty and the OWN bit clear here since we have
    		// not set up any transmissions yet.
    		//
    		for(ui32Loop = 0; ui32Loop < NUM_TX_DESCRIPTORS; ui32Loop++) {
    			g_psTxDescriptor[ui32Loop].ui32Count = DES1_TX_CTRL_SADDR_INSERT;
    			g_psTxDescriptor[ui32Loop].DES3.pLink = (ui32Loop == (NUM_TX_DESCRIPTORS - 1)) ?
    											g_psTxDescriptor : &g_psTxDescriptor[ui32Loop + 1];
    			g_psTxDescriptor[ui32Loop].ui32CtrlStatus = (DES0_TX_CTRL_LAST_SEG | DES0_TX_CTRL_FIRST_SEG |
    					DES0_TX_CTRL_INTERRUPT | DES0_TX_CTRL_CHAINED |
    					DES0_TX_CTRL_IP_HDR_CHKSUM);
    		}
    		//
    		// Initialize each of the receive descriptors. We clear the OWN bit here
    		// to make sure that the receiver doesn t start writing anything
    		// immediately.
    		//
    		for(ui32Loop = 0; ui32Loop < NUM_RX_DESCRIPTORS; ui32Loop++)
    		{
    		g_psRxDescriptor[ui32Loop].ui32CtrlStatus = 0;
    		g_psRxDescriptor[ui32Loop].ui32Count = (DES1_RX_CTRL_CHAINED |
    										(RX_BUFFER_SIZE << DES1_RX_CTRL_BUFF1_SIZE_S));
    		g_psRxDescriptor[ui32Loop].pvBuffer1 = g_ppui8RxBuffer[ui32Loop];
    		g_psRxDescriptor[ui32Loop].DES3.pLink = (ui32Loop == (NUM_RX_DESCRIPTORS - 1)) ?
    					g_psRxDescriptor : &g_psRxDescriptor[ui32Loop + 1];
    		}
    		//
    		// Set the descriptor pointers in the hardware.
    		//
    		EMACRxDMADescriptorListSet(ui32Base, g_psRxDescriptor);
    		EMACTxDMADescriptorListSet(ui32Base, g_psTxDescriptor);
    		//
    		// Start from the beginning of both descriptor chains. We actually set
    		// the transmit descriptor index to the last descriptor in the chain
    		// since it will be incremented before use and this means the first
    		// transmission we perform will use the correct descriptor.
    		//
    		g_ui32RxDescIndex = 0;
    		g_ui32TxDescIndex = NUM_TX_DESCRIPTORS - 1;
    }

    然后、我将 emac.c 和 emac.h 复制到我的源代码文件夹中、并将这些文件添加到我的项目中。 然后进行编译和下载。 令人惊讶的是它能起作用  

    感谢您的支持。