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.

[参考译文] TMS570LC4357:使以太网 MAC 运行、从环回测试开始

Guru**** 633805 points
Other Parts Discussed in Thread: HALCOGEN, TMS570LC4357, LAUNCHXL2-570LC43, DP83630, TMDX570LC43HDK, TMDSRM48HDK
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1121389/tms570lc4357-getting-ethernet-mac-running-starting-with-loopback-test

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGENLAUNCHXL2-570LC43CCStudioDP83630TMDX570LC43HDKTMDSRM48HDK

您好!

我正在尝试使 EMAC 正常工作,并遇到了其他人遇到的同样的问题,就像在这里的线程中一样....

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/872569/ccs-launchxl2-570lc43-ethernet-all-received-frames-are-filtered/3244804?tisearch=e2e-sitesearch&keymatch=xl2-570lc43%20ethernet#3244804

我按照 Halcogen 帮助文档中的步骤执行 EMAC 回送。

我尝试将 MPU 区域设置为 normal_OIWTNOWA_nonshared (直写式)、正如上述海报中的假设那样、但这对我不起作用。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/612990/tms570lc4357-mdiophyregread?tisearch=e2e-sitesearch&keymatch=TMS570LC4357%25252525252520Ethernet%25252525252520loopback%25252525252520MDIO

我尝试拿起此帖子中指示的包裹:

TMS570LC4357_LaunchPad_EMAC_Loopback.zip

但无权检索它。

感谢您为 EMAC 的发展提供的所有帮助。

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

    我还尝试获取 LWIP 项目示例、但无法使用它...

    Git 克隆 git://git.ti.com/cgit/hercules_examples/hercules_examples/tree/Application/LwIP/v00.04.00
    正在克隆到'v00.04.00'中...
    致命:远程错误:访问被拒绝或系统信息库未导出:/cgit/hercules_examples/hercules_examples/tree/Application/lwIP/v00.04.00

    感谢你的帮助。

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

    您好!

    请使用以下回送代码  

    e2e.ti.com/.../570LC43_5F00_EMAC_5F00_LOOPBACK.zip

    这个项目是按照"Halcogen Help documentation to do EMAC loopback (执行 EMAC 回送的 Halcogen 帮助文档)"创建的、但是除此之外、我做了另外两个修改  

    在引脚复用表中、我手动配置了"MDIO"和"MDCLK"、因为当我们启用"MII"时、这些引脚不会在 HALCoGen 中自动配置。

    2.我还 将 RAM MPU 设置更改为  "normal_OIWTNOWA_nonshared"、因为默认情况下会启用高速缓存。

    --

    谢谢、

    Jagadish。

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

    您好!

    非常感谢您提供的.zip,我能够使用它来演示 EMAC 回送,其中调用了 emacRxNotification (hdkif)(由 EMACRxIntISR()调用)。  我不清楚 HL 基础设施是如何让用户检索接收到的数据的。

    此主题...

    e2e.ti.com/.../2748630

    说明 EMACRxIntISR()调用 EMACReceive(hdkif),我看到代码在调用 emacRxNotification(hdkif)后执行该操作。

    我不清楚 pack()数组和 hdkif->rxchptr 是什么,以及软件应该如何获取它们指向的任何数据。  用户提供的 emacRxNotification (hdkif)是否应该在 EMACRxIntISR()中发生调用之前调用 EMACReceive(hdkif)[]来检索数据?

    EMAC 接收路径是否有任何代码示例?

    再次感谢。

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

    尊敬的 Peter:

    如果您在代码中验证函数"EMACDMAInit"、我们将初始化发送和接收通道描述符。
    在我们的接收通道描述符示例中、我们给出了"pbuf_array"

    因此、我们接收到的数据包将移至该缓冲区中。

    为了便于验证、请将此缓冲区作为全局缓冲区而不是静态缓冲区

    完成此操作后、您可以在该缓冲区中看到接收到的数据包、如下所示  

    在我们的示例中、我们发送了两个数据包、以便在  pbuf_array[0]和 pbuf_array[1]中接收这两个数据包。

    --

    谢谢、

    Jagadish。

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

    您好!

    我使用了您提供的信息、看到接收到的第一个数据包、而不是第二个数据包。  我稍微修改了示例代码、以便我能够更好地识别接收到的数据包(无论第二个数据包是丢弃还是改写第一个数据包)、并在打印内容和增加延迟的过程中提供了更多调试信息(针对我自己)。  其中一个缺失的信息是接收到的数据包长度、我猜在 hdkif 传递给 emacRxNotification (hdkif)的某个位置可以使用该长度;我(很明显)需要这一关键信息、即使我只是对通知调用中引用的 pbuf_array[]进行"盲"序索引。  另外、EMACDMAInit()目前使用了10个(MAX_RX_PBUF_ALLOC) pbuf_array[]缓冲器、我需要知道接收器在使用第10个缓冲器后是否将重新循环(第11个数据包使用 pbuf_array[0]等)。

    非常感谢您的帮助。  我已附加修改后的示例代码、我看到它在运行时产生的输出。

    已将代码添加到 hL_emac.c 中、以便 emac_buf_array 引用 pbuf_array:

    静态 uint8_t pbuf_array[MAX_RX_PBUF_ALLOC][MAX_TRANSF_UNIT];
    uint8_t (* emac_pbuf_array)[MAX_RX_PBUF_ALLOC][MAX_TRANSF_UNIT]=&pbuf_array;

    	/** @example example_EMAC_Loopback_TxRx.c
    *  This is an example which describes the steps to create an example application which 
    *  uses the HALCoGen driver to send and receive broadcast Ethernet packets in loopback mode.
    *  The EMACTransmit API is used for transmitting a single packet. Here, it is called twice, thereby transferring two packets.
    *  To see the transmitted information, the transmitted and receive buffer descriptors must be observed, which are located in the EMAC RAM.
    *  In the default configuration, the transmitted descriptors can be found at 0xFC520000 (Base address of EMAC RAM) and the receive descriptors start at 0xFC521010.
    *  One can also observe the number of packets transmitted and other such information in the EMAC network statistics registers.
    *
    *  @b Step @b 1:
    *
    *  Create a new project.
    *
    *  Navigate: -> File -> New -> Project
    *
    *  @image html example_createProject.jpg "Figure: Create a new Project"
    *
    *  @b Step @b 2:
    *
    *  Configure driver code generation: 
    *  - Enable EMAC driver
    *  - Disable others
    *
    *  Navigate: -> TMS570LSxx /RM4 -> Driver Enable
    *
    *
    *  @b Step @b 3:
    *
    *  Configure Interrupt handling: 
    *  - Under ‘VIM Channels 64-95’, enable EMAC Tx and Rx interrupts (Channels 77 and 79 respectively).
    *
    *  Navigate: -> TMS570LSxx /RM4 -> VIM Channels 64-95
    *
    *  @image html emac_interruptenable.jpg "Figure: Interrupt Configuration"
    *
    *  @b Step @b 4:
    *
    *  Configure PLL: 
    *  - Under the ‘PLL’ tab, change the multiplier for both PLLs to a value of 150, such that the output frequency in both cases is 300.00 MHz.
    *
    *  Navigate: -> TMS570LSxx /RM4 -> PLL
    *
    *  @image html emac_PLL.jpg "Figure: PLL Configuration"
    *
    *  @b Step @b 5:
    *
    *  Configure GCM: 
    *  - Under the ‘GCM’ tab, change the value of the VCLK1, VCLK2 and VCLK3 Dividers to 1 and 
    *    VCLKA4 Divider to 2,  such that the output of VCLKA4_DIV is 37.50 MHz.
    *
    *  Navigate: -> TMS570LSxx /RM4 -> GCM
    *
    *  @image html emac_gcm.jpg "Figure: GCM Configuration"
    *
    *  @b Step @b 6:
    *
    *  Configure PINMUX
    *  - Under the ‘PINMUX’ tab, enable RMII/MII under pin muxing. Under 'Input Muxing', enable MDIO(G3), MII_COL(F3), MII_CRS(B4), MII_RX_DV(B11), 
    *	 MII_RX_ER(N19), MII_RXCLK(K19), MII_RXD[0], MII_RXD[1], MII_RXD[2], MII_RXD[3], MII_TX_CLK.
    *
    *  Navigate: -> OS -> PINMUX.
    *
    *  @image html emac_pinmux.jpg "Figure: PINMUX Configuration"
    *
    *  @b Step @b 7:
    *
    *  Configure EMAC: 
    *  -change the EMAC address to any MAC Address of your choice. The physical address is 1 by default.
    *  -Enable Loopback. Leave the other options with their default values.
    *  Navigate: -> File -> EMAC
    *
    *  @image html emac_config.jpg "Figure: EMAC Configuration"
    *
    *  @b Step @b 8:
    *
    *  Generate code
    *
    *  Navigate: -> File -> Generate Code
    *
    *  @image html example_freeRTOS_generateCode.jpg "Figure: Generate Code"
    *
    *  @b Step @b 9:
    *
    *  Copy source code below into your application.
    *
    *  The example file example_EMAC_Loopback_TxRx.c can also be found in the examples folder: ../HALCoGen/examples
    *
    *  @note HALCoGen generates an empty main function in sys_main.c, 
    *        please make sure that you link in the right main function or copy the source into the user code sections of this file.
    *
    */
    
    #include "HL_sys_common.h"
    #include "HL_system.h"
    
    /* USER CODE BEGIN (1) */
    #include "HL_emac.h"
    #include "HL_hw_reg_access.h"
    
    #include "stdio.h"
    #include "scidma.h"
    #include "timer.h"
    /* USER CODE END */
    
    /** @fn void main(void)
    *   @brief Application main function
    *   @note This function is empty by default.
    *
    *   This function is called after startup.
    *   The user can use this function to implement the application.
    */
    
    uint8	emacAddress[6U] = 	{0x00U, 0x08U, 0xEEU, 0x03U, 0xA6U, 0x6CU};
    uint32 	emacPhyAddress	=	1U;
    
    /* USER CODE BEGIN (2) */
    extern hdkif_t hdkif_data[1];
    
    #define NFRAG 5
    #define DATASZ 200
    pbuf_t pack[NFRAG];
    static uint8 data[NFRAG][DATASZ];
    
    uint32 pktlen, fraglen;
    
    void create_packet(uint32 idx)
    {
        int i, j;
    
        for (i = 0; i < NFRAG; i++) {
            pack[i].tot_len = pktlen;
            pack[i].len = fraglen;
            j = 0;
            if (i == 0) {
                for ( ; j < 6; j++) {
                    data[i][j] = 0xffu;
                }
                for ( ; j < 12; j++) {
                    data[i][j]= emacAddress[j - 6];
                }
                data[i][j++] = (pktlen >> 8 & 0xff);
                data[i][j++] = pktlen & 0xff;
            }
            data[i][j++] = (idx >> 8 & 0xff);
            data[i][j++] = idx & 0xff;
            data[i][j++] = (fraglen >> 8 & 0xff);
            data[i][j++] = fraglen & 0xff;
            data[i][j++] = (NFRAG >> 8 & 0xff);
            data[i][j++] = NFRAG & 0xff;
            for ( ; j < DATASZ; j++) {
                data[i][j] = i + idx;
            }
            pack[i].payload = &data[i][0];
            if (i != NFRAG - 1)
                pack[i].next = &pack[i + 1];
        }
        pack[NFRAG - 1].next = NULL;
    
        printf("create_packet...\n");
        for (i = 0; i < NFRAG; i++) {
            printf("== ");
            for (j = 0; j < 12 + 2 + 10; j++) {
                printf("%02x ", data[i][j]);
            }
            printf("\n");
        }
    }
    
    extern uint8_t (*emac_pbuf_array)[MAX_RX_PBUF_ALLOC][MAX_TRANSFER_UNIT];
    uint32 emac_pbuf_idx = 0;
    uint64 emac_pbuf_mask = 0x0;
    
    void get_packet(uint32 idx)
    {
        uint8_t *p = emac_pbuf_array[idx][0];
        int i;
        printf("get_packet...\n");
        printf("-- ");
        for (i = 0; i < 12 + 2 + 10; i++)
            printf("%02x ", p[i]);
        printf("\n");
    }
    
    void emacRxNotification(hdkif_t *hdkif)
    {
        emac_pbuf_mask |= (1 << emac_pbuf_idx);
        emac_pbuf_idx++;
    }
    
    /* USER CODE END */
    
    void main(void)
    {
    /* USER CODE BEGIN (3) */
        uint32 pkt_idx = 0;
    
        timer_init();
    
        sciInit();
        scidmaInitAll();
    
        printf("Starting EMAC loopback\n");
    
        _enable_IRQ();
        _enable_FIQ();
    
        EMACHWInit(emacAddress);
        fraglen = 94;
        pktlen = fraglen * NFRAG;
        create_packet(pkt_idx++);
        EMACTransmit(&hdkif_data[0], &pack[0]);
    
        fraglen = 120;
        pktlen = fraglen * NFRAG;
        create_packet(pkt_idx++);
        EMACTransmit(&hdkif_data[0], &pack[0]);
    
        timer_delay(3);
    
        printf("Display received packets...\n");
        int i;
        for (i = 0; i < 64; i++) {
            if (emac_pbuf_mask & (1ULL << i)) {
                get_packet(i);
            }
        }
        
        while(1);
    /* USER CODE END */
    }
    

    代码的输出仅显示接收到的第一个数据包:

    Starting EMAC loopback
    create_packet...
    == ff ff ff ff ff ff 00 08 ee 03 a6 6c 01 d6 00 00 00 5e 00 05 00 00 00 00
    == 00 00 00 5e 00 05 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
    == 00 00 00 5e 00 05 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
    == 00 00 00 5e 00 05 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
    == 00 00 00 5e 00 05 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
    create_packet...
    == ff ff ff ff ff ff 00 08 ee 03 a6 6c 02 58 00 01 00 78 00 05 01 01 01 01
    == 00 01 00 78 00 05 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
    == 00 01 00 78 00 05 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
    == 00 01 00 78 00 05 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
    == 00 01 00 78 00 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05
    Display received packets...
    get_packet...
    -- ff ff ff ff ff ff 00 08 ee 03 a6 6c 01 d6 00 00 00 5e 00 05 00 00 00 00
    get_packet...
    -- 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    

    可以看到、pbuf_array[1]全为0。

    非常感谢。

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

    出于完整性考虑、我在 get_packet (idx)中添加了代码来显示整个数据包、以确保数据包已完成...

    void get_packet(uint32 idx)
    {
        uint8_t *p = emac_pbuf_array[idx][0];
        int i;
        printf("get_packet...\n");
        printf("-- ");
        for (i = 0; i < 12 + 2 + 10; i++)
            printf("%02x ", p[i]);
        printf("\n");
    #define DISP_ALL
    #ifdef DISP_ALL
        uint32 pktlen = ((uint32) p[12] << 8) + (uint32) p[13];
        if (pktlen != 0) {
            pktlen -= 12 + 2; // compensate for DA (6), SA (6), LEN (2)
            pktlen += 2; // display 2 bytes beyond packet
        }
        for (i = 10; i < pktlen; i++) { // 10 bytes already displayed
            printf("%02x ", p[12 + 2 + i]);
    	if ((i - 10) % 24 == 23)
                printf("\n");
        }
        printf("\n");
    #endif
    }
    

    输出现在...

    Starting EMAC loopback
    create_packet...
    == ff ff ff ff ff ff 00 08 ee 03 a6 6c 01 d6 00 00 00 5e 00 05 00 00 00 00
    == 00 00 00 5e 00 05 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
    == 00 00 00 5e 00 05 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
    == 00 00 00 5e 00 05 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
    == 00 00 00 5e 00 05 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
    create_packet...
    == ff ff ff ff ff ff 00 08 ee 03 a6 6c 02 58 00 01 00 78 00 05 01 01 01 01
    == 00 01 00 78 00 05 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
    == 00 01 00 78 00 05 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
    == 00 01 00 78 00 05 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
    == 00 01 00 78 00 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05
    Display received packets...
    get_packet...
    -- ff ff ff ff ff ff 00 08 ee 03 a6 6c 01 d6 00 00 00 5e 00 05 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 5e 00 05 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
    01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
    01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
    01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00 00 5e
    00 05 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
    02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
    02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
    02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 00 00 00 5e 00 05
    03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
    03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
    03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03
    03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 00 00 00 5e 00 05 04 04
    04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
    04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
    04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04
    04 04 04 04 04 04 04 04 04 04 04 04 04 04 00 00
    get_packet...
    -- 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    
    

    因此、整个第一个数据包是完整/正确的。

    但没有第二个数据包。

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

    您好!

    我还成功地使用 wget 下载了 LWIP 项目、因为顶部位置在某种程度上是"受保护的"或链接(与应用程序中的其他项目不同)。

    我花了很多小时尝试将 LWIP 项目组合在一起、并不断遇到编译问题。  我希望有一个已经构建的 CCS 项目(所有组件都已经在正确的位置)我可以运行、但情况似乎并非如此。  考虑到这些论坛中有很多关于 LWIP 是 EMAC 功能的"合适"演示的抖动、这有点奇怪。

    我是否可以为 XL2-570LC43获取并运行一些"现成"的 LWIP CCS 项目?  此时、我想尝试从源代码构建 LWIP 对我来说是一项徒劳的工作、尤其是因为我不知道项目的各个部分应该驻留在哪里(在 TI 环境之外和内部)。

    感谢您就此主题提供的任何信息。

     

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

    您好!

    没关系。  第二个数据包被正确接收、我可以在调试器中正确地看到数据。  我的指针计算不正确(emac_pbuf_array 的定义)。  我将发布我需要的修复程序。

    我仍然需要了解(硬件)数据包长度是多少、它应该可以通过 hdkif 中的某个内容派生。  我目前正在使用软件包长度(根据802.3、数据包的字节12和13)。

    感谢您在硬件长度方面的帮助。

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

    这会正确声明 EMAC_pbuf_n_array……

    静态 uint8_t pbuf_array[MAX_RX_PBUF_ALLOC][MAX_TRANSF_UNIT];
    uint8_t (* emac_pbuf_n_array)[MAX_TRANSF_UNIT]=&pbuf_array[0];

    所以

    printf ("&pbuf_array[0]=%p\n"、EMAC_pbuf_n_array[0]);
    printf ("&pbuf_array[1]=%p\n"、EMAC_pbuf_n_array[1]);

    在正确的位置显示数据包[1]。

    谢谢。

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

    您好!

    我已经验证 EMAC 器件将在缓冲区的使用中发生回绕(至少在我正在执行的低速回路)。

    那么、悬而未决的问题是如何使用 emacRxNotification 可用的 hdkif 结构找到硬件数据包长度?  通常、最好将硬件数据包长度与软件(数据包内)数据包长度相匹配、以进行完整性检查。

    下一步是使用此项目开发一个使用两个 XL2-570LC43板的对等发送/接收平台。

    非常感谢。

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

    您好!


    根据 TRM 中的上述信息、我们不会为 EMAC 描述符配置任何数据包长度。  

    EMAC 模块会自动获取以太网帧的长度、并根据长度等待接收整个数据包。 一旦接收到完整的数据包、EMAC 外设触发 CPU、CPU 开始执行"EMACRxIntISR"并处理接收到的数据包。

    --

    谢谢、
    Jagadish。

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

    您好!

    很抱歉、但似乎有一些断开连接。

    以太网帧的字节12和13为以太网 II 类或802.3长度...

    https://en.wikipedia.org/wiki/Ethernet_frame

    在您的描述中、您似乎表示字节12和13 _must 是一个长度、但情况并非如此。  字节12和13的常见用法是固定值0x800 (2048)、以指示数据包是 IPv4。  在您提供的环回示例代码中、该字段硬编码为0x800。  发送代码可以(应该能够)根据需要使用字节12和13 (因为它是一个软件实体)。

    有一个长度的硬件计数器(应该是)、此计数器根据数据包间隙指定从 MAC 目的(起始帧分界符后的第一个数据字节)到有效载荷末尾(或者帧校验序列的末尾)的帧长度。  该计数器为_hardware_帧长度、与任何软件帧长度无关(因为字节12和13绝不限于长度计数器[可用作类型标志])。

    请帮助我了解570-LC43 EMAC 如何提供_hardware_帧计数器。  请注意、软件不必提供任何缓冲区最大值、因为根据定义、以太网帧必须小于1536字节/八位位组等。

    非常感谢。

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

    测试电子邮件通知、请忽略(仅限)此测试回复。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="521569" URL"~/support/microcontrollers/arm-based microcontrollers-group/arm -based-microcontrollers/f/arm based-microcontrollers-forum/1121389/tms570lc4357-getting-ethernet-mac-running - starting-with -loopback -test/4162612#4162612"]请帮助我确定硬件的报价单[_lc570_框架 EM570_

    是 表32-6中的数据包长度字段。  《TMS570LC43x 16/32 RISC 闪存微控制器技术参考手册》(修订版 A)中的基本描述符说明 您在寻找什么?

     TRM 中的第32.2.6.5.5节"数据包长度"提供了有关软件如何确定接收到的以太网数据包长度的更多信息。

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

    根据您发送的表/说明、我需要缓冲区长度、它指示为一个帧接收的实际数据量。  如何从 hdkif 句柄获取缓冲长度可用的 emacRxNotification()处理程序?  或者、它是否通过某些"外部可见"数组、与当前为 pbuf_array[]进行索引的方式相同?  或者,在调用 emacRxNotification()时,它是否在某些寄存器中是最新的(并且在调用 emacReceive()之后,可能会更新为下一帧的值)。  Halcogen 是否提供了获取 BL 的函数、或者用户是否必须通过一些指针访问来实现它?  询问想知道的人。

    抱歉、没有太多示例代码可供参考。

    非常感谢。

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

    很抱歉、我看错了您的答案。  您所说的似乎是、如果正在使用接收散射、则数据包长度是帧的总长度、缓冲区长度是块的长度。  问题是、emacRxNotification (hdkif)如何到达数据包描述符?  我目前只是在 pbuf_array[](包含1514字节线性缓冲区)中使用一个"盲"索引来获取数据(根据 TI 先前的建议、 以及 TI 环回示例代码所做的操作)、因此没有一种机制来访问描述符(大概是由 Halcogen 代码进行现场部署)。

    谢谢。

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

    您好!

    我看到 hdkif 会导致 rxchptr->active_head->flags_pktlen,所以请查看。

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [~ userid="521569" URL"/support/microcontrollers/arm-based microcontrollers-group/arm -based-microcontrollers/f/arm based-microcontrollers-forume/1121389/tms570lc4357-getting-ethernet-mac-running - starting-with loopback -test/4163160#4163160"]问题是如何获取数据包通知?  [/报价]

    在 hl_emac.c 中查看 HALCoGen 生成的 EMACRxIntISR()函数、可以看到:

        /* The data is received in the allocated receive descriptors starting from (&(hdkif->rxchptr))->active_head */
        /*SAFETYMCUSW 45 D MR:21.1 <APPROVED> "Valid non NULL input parameters are assigned in this driver" */      
        /*SAFETYMCUSW 45 D MR:21.1 <APPROVED> "Valid non NULL input parameters are assigned in this driver" */      
        /*SAFETYMCUSW 45 D MR:21.1 <APPROVED> "Valid non NULL input parameters are assigned in this driver" */      
        /*SAFETYMCUSW 45 D MR:21.1 <APPROVED> "Valid non NULL input parameters are assigned in this driver" */      
        /*SAFETYMCUSW 45 D MR:21.1 <APPROVED> "Valid non NULL input parameters are assigned in this driver" */      
        /*SAFETYMCUSW 45 D MR:21.1 <APPROVED> "Valid non NULL input parameters are assigned in this driver" */      
        emacRxNotification(hdkif);

    hdkif->rxchptr 是 rxch_t 类型  rxch_t 在 HL_emac.h 中定义为:

    /**
     * Helper struct to hold the data used to operate on a particular
     * receive channel
     */
    typedef struct rxch_struct {
      volatile emac_rx_bd_t *free_head; /*Used to point to the free buffer descriptor which can receive new data.*/
      volatile emac_rx_bd_t *active_head; /*Used to point to the active descriptor in the chain which is receiving.*/
      volatile emac_rx_bd_t *active_tail; /*Used to point to the last descriptor in the chain.*/
    }rxch_t;

    在 HL_emac.h 中、EMAC_Rx_BD_t 类型定义为:

    /* EMAC RX Buffer descriptor data structure - Refer TRM for details about the buffer descriptor structure. */
    typedef struct emac_rx_bd {
      volatile struct emac_rx_bd *next; /*Used as a pointer for next element in the linked list of descriptors.*/
      volatile uint32 bufptr; /*Pointer to the actual Buffer which will store the received data.*/
      volatile uint32 bufoff_len; /*Buffer Offset and Buffer Length (16 bits each)*/
      volatile uint32 flags_pktlen; /*Status flags and Packet Length. (16 bits each)*/
    }emac_rx_bd_t;

    因此、数据包描述符中的16位数据包长度应位于 flags_pktlen 字段中。

    对于 LWIP 示例、 lwip-1.4.1/ports/hdk/netif/hdkif.c 文件具有以下内容、其中显示了如何从数据包描述符中的 flags_ptklen 字段中提取数据包长度:

          /* Get the total length of the packet. curr_bd points to the start
           * of the packet.
           */ 
          tot_len = hdkif_swizzle_data(curr_bd->flags_pktlen) & 0xFFFF;

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

    您好!

    我"需要 hdkif.h/.c 来使 EMAC 周围的软件层能够执行"简单"任务、即能够传输和接收以太网数据包、但它看起来像 hdkif.h/.c、其中包含的内容比我真正需要的更多、 或需要处理的问题。

    通过比较 hdkif 代码与环回演示代码(使用 Halcogen 生成的代码/工具)、似乎有很多代码段是替换代码而不是补充代码。

    因此、我现在面临的两难问题是、我需要使用 hdkif 代码来实现"真正的"以太网 MAC 层运行、或者增强环回演示代码以在禁用环回的情况下运行是否足够。  我已经尝试"只"禁用(副本)环回演示代码中的环回以访问网络、但到目前为止还没有到达任何位置(以太网交换机上没有指示链路连接的链路状态 LED 指示灯)。

    我还尝试为 XL2-570LC43构建 LWIP 项目、但遇到了很多我放弃的构建问题(现在至少是这样)。  如果有一个"交钥匙型"LWIP 项目、我只需拿起并在 Launchpad 上运行、那么也许我可以更好地了解真正需要的东西。

    您能给我一个关于哪种方法(hdkif 移植或环回演示调制)的意见吗?  我想尽量减少走错路的机会、只需要重新跟踪或从头开始。  现在、我倾向于修改回送演示、主要是因为我让它在硬件上工作、而且它很简单且自包含。

    非常感谢您的帮助。

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

    我合并了来自 hdkif.c 的代码、该代码从 ACTIVE_HEAD 中检索缓冲区指针和 pktlen、引用自传递给 emacRxNotification (hdkif)的 hdkif 指针、环回功能像以前一样良好(当使用 pbuf_array[]"盲目"获取接收到的数据时)。

    因此、我稍微修改了回送代码以禁用回送、并希望发送端能够"正常工作"、将数据发送到线路上。  我遇到了处理第一个发送数据包的挂起情况、其中 HL 代码(HL_EMAC.c)正在寻找要在标志字段中设置的 EMAC_BUF_DESC_EOQ 位。  我认为硬件应该"保证"无限 while ()循环永远不会挂起。  我不知道是什么阻止了 EMAC 发送数据包的输出、这可能是因为 PHY 配置不正确(或根本没有)。  Halcogen 配置和代码生成器似乎工作正常。

    如果我有一个正在运行/正在运行的 LWIP 构建、也许我可以用它来计算在尝试将环回采样更改为在线路上进行外部传输时缺少的内容。  现在、我将通过查看代码尝试弄清 hdkif.c 在实际访问网络时所做的工作。

    感谢您的任何见解。

    =正在挂起代码...

    否则{
    /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/
    CURR_BD = txch->ACTIVE_TAIL;
    /*等待 EOQ 位被置位*/
    /*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
    /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
    /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/
    while (EMAC_BUF_DESC_EOQ!=(EMACSwizleData (CURR_BD->FLAGS_pktlen)& EMAC_BUF_DESC_EOQ))


    /*在 TXHDP0变为零之前不要写入它*/
    /*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
    /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
    while ((((uint32) 0U!=*((uint32 *) 0xFCF78600U)))

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

    我合并了来自 hdkif.c 的代码、该代码从 ACTIVE_HEAD 中检索缓冲区指针和 pktlen、引用自传递给 emacRxNotification (hdkif)的 hdkif 指针、环回功能像以前一样良好(当使用 pbuf_array[]"盲目"获取接收到的数据时)。

    因此、我稍微修改了回送代码以禁用回送、并希望发送端能够"正常工作"、将数据发送到线路上。  我遇到了处理第一个发送数据包的挂起情况、其中 HL 代码(HL_EMAC.c)正在寻找要在标志字段中设置的 EMAC_BUF_DESC_EOQ 位。  我认为硬件应该"保证"无限 while ()循环永远不会挂起。  我不知道是什么阻止了 EMAC 发送数据包的输出、这可能是因为 PHY 配置不正确(或根本没有)。  Halcogen 配置和代码生成器似乎工作正常。

    如果我有一个正在运行/正在运行的 LWIP 构建、也许我可以用它来计算在尝试将环回采样更改为在线路上进行外部传输时缺少的内容。  现在、我将通过查看代码尝试弄清 hdkif.c 在实际访问网络时所做的工作。

    感谢您的任何见解。

    =正在挂起代码...

    否则{
    /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/
    CURR_BD = txch->ACTIVE_TAIL;
    /*等待 EOQ 位被置位*/
    /*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
    /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
    /*SAFETYMCUSW 45 D MR:21.1 "此驱动程序中分配了有效的非 NULL 输入参数"*/
    while (EMAC_BUF_DESC_EOQ!=(EMACSwizleData (CURR_BD->FLAGS_pktlen)& EMAC_BUF_DESC_EOQ))


    /*在 TXHDP0变为零之前不要写入它*/
    /*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
    /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/
    while ((((uint32) 0U!=*((uint32 *) 0xFCF78600U)))

    在查看 hdkif.c 代码时、我会看到类似的"可怕"内容(我也会在回送项目的 hl_emac.c 代码中看到相同的内容、因此我猜需要这样做)一些使用对位置0xfcf78600的直接轮询来解决的问题...

     
     /*
       * Chain the bd's. If the DMA engine, already reached the end of the chain, 
       * the EOQ will be set. In that case, the HDP shall be written again.
       */
      else {
        curr_bd = txch->active_tail;
        /* TODO: (This is a workaround) Wait for the EOQ bit is set */
        while (EMAC_BUF_DESC_EOQ != (hdkif_swizzle_data(curr_bd->flags_pktlen) & EMAC_BUF_DESC_EOQ));
        /* TODO: (This is a workaround) Don't write to TXHDP0 until it turns to zero */
      	while (0 != *((uint32 *)0xFCF78600));
        curr_bd->next = hdkif_swizzle_txp(active_head);
        if (EMAC_BUF_DESC_EOQ == (hdkif_swizzle_data(curr_bd->flags_pktlen) & EMAC_BUF_DESC_EOQ)) {
          /* Write the Header Descriptor Pointer and start DMA */
          EMACTxHdrDescPtrWrite(hdkif->emac_base, (unsigned int)(active_head), 0);
        }
      }



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

    我对编辑模式的工作方式有一些小问题、因此请忽略看似重复的帖子。

    0xfcf78600的轮询也发生在 HL_EMAC.c 中的环回项目中、因此以某种方式需要它。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="521569" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1121389/tms570lc4357-getting-ethernet-mac-running - starting-with loopback -test/LW4163626#4163626"]我现在还尝试构建很多相关项目、但至少遇到了很多问题(lc432-lc2)、但我在构建过程中遇到了很多问题。  如果有一个"交钥匙型"LWIP 项目、我只需拿起并在 Launchpad 上运行即可、那么或许我可以更好地了解真正需要的东西。[/引述]

    要对此进行调查:

    1.在 Windows 10下使用 SmartGit 克隆 https://git.ti.com/git/hercules_examples/hercules_examples.git URL

    2.在 CCS 12.0中、从 克隆的存储库中将项目从 Application\LwIP\v00.04.00\LAUNCHXL2-TMS570LC43x\build-LAUNCHXL2-TMS570LC43x 目录中导入。

    在 CCS Project Properties 中、可以看到工程是使用编译器 TI v18.12.2.LTS 创建的。 CCS 12未安装该编译器版本、因此选择了 TI v20.2.6.LTS:

    使用  TI v20.2.6.LTS 编译器成功编译工程。

    5、使用 USB 电缆将 LAUNCHXL2-570LC43连接到板载 XDS110、使用以太网电缆连接到交换机。

    6. 项目随附的目标配置文件 targetConfigs\TMS570LC43xx.ccxml 的连接设置为"Texas Instruments XDS100v2 USB Debug Probe"。 为了匹配 LAUNCHXL2-570LC43上的调试探针、已将连接更改为"Texas Instruments XDS110 USB Debug Probe"。

    7.下载程序,并将串行终端连接到板载 XDS110上的用户 UART,设置为9600波特。

    8.在最初运行程序时、串行输出上报告了以下内容:

    HERCULES MICROCONTROLLERS
    Texas Instruments
    Little Endian device
    Initializing ethernet (DHCP)
            DEBUG - Getting PHY ID....SUCCESS
            DEBUG - Getting PHY Alive Status...SUCCESS
            DEBUG - Getting PHY Link Status...SUCCESS
            DEBUG - Setting up Link...SUCCESS
    ..DONE
    
    
    -------- ERROR INITIALIZING HARDWARE --------

    9.调试错误的原因发现程序等待从 DHCP 服务器(在宽带路由器的网络部分)获取 IP 地址时超时。

    10.在 lwIPInit 函数中进行了以下更改,以增加等待使用 DHCP 获取 IP 地址的超时:

    mr_halfword@DESKTOP-5DD8B6L MINGW64 ~/hercules_examples (master)
    $ git diff Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/lwiplib.c
    diff --git a/Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/lwiplib.c b/Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/lwiplib.c
    index e5ecb92..5403330 100644
    --- a/Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/lwiplib.c
    +++ b/Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/lwiplib.c
    @@ -195,13 +195,13 @@ static struct netif hdkNetIF[MAX_EMAC_INSTANCE];
            unsigned int dhcp_flag = 0;
            unsigned int dhcp_tries = 5;
            unsigned int count;
    -       unsigned int delay;
    +       volatile unsigned int delay;
            while(dhcp_tries--)
            {
    
    
            dhcp_start(&hdkNetIF[instNum]);
    -       count = 10;
    +       count = 100;
            /* Check for DHCP completion for 'count' number of times, each for the given delay. */
                    while(count--)
                    {
    
    

    11.通过上述更改,程序成功获得了 IP 地址,报告了串行输出中的以下内容:

    HERCULES MICROCONTROLLERS
    Texas Instruments
    Little Endian device
    Initializing ethernet (DHCP)
            DEBUG - Getting PHY ID....SUCCESS
            DEBUG - Getting PHY Alive Status...SUCCESS
            DEBUG - Getting PHY Link Status...SUCCESS
            DEBUG - Setting up Link...SUCCESS
    ..DONE
    Starting Web Server..DONE
    
    HERCULES MICROCONTROLLERS
    Texas Instruments
    Little Endian device
    Device IP Address: 192.168.0.20
    Webserver accessible @ http:\\192.168.0.20
    

    12.在 Windows 10 PC 上、可以成功访问 LAUNCHXL2-570LC43 IP 地址处的网页、  并成功显示 LAUNCHXL2-570LC43中程序提供的网页。   LAUNCHXL2-570LC43也正在响应 ping。

    13.示例程序中的网页包含  一个222,066字节的/img/Hercules_block_diagram.gif 文件。 问题在于当在运行 Linux 的另一台 PC 上尝试查看网页时,/img/Hercules_block_diagram.gif 只会部分显示。 在 Linux PC 上运行 Wireshark 会显示 LAUNCHXL2-570LC43中的 Web 服务器 似乎在传输过程中处于停滞状态。 命令行中的 wget 也会停止尝试下载 /img/Hercules_block_diagram.gif 文件。 尚未确定原因、但确实看起来是 lwip 程序中的错误。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="91588" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1121389/tms570lc4357-getting-ethernet-mac-running - starting-with -loopback -test/4164929#4164929"]尚未确定错误原因、但引用了 lwip/quote 的原因。]

    我在  Application\LwIP\v00.04.00\LAUNCHXL2-TMS570LC43x\Build-LAUNCHXL2-TMS570LC43x 示例中注意到的另一个问题是、当通过连接 USB 电缆打开 Launch Pad 电源时、网络无法启动(以太网电缆在通电时保持连接)。

    按下 PORRST 按钮后、网络成功启动。

    通过在启动板上电后连接调试器、可以发现  hdkif.c 中的 hdkif_hw_init ()卡在以下循环中、等待读取 PHY ID:

      while ((phyID == 0) && (phyIdReadCount > 0)) {
    	  phyID = Dp83640IDGet(hdkif->mdio_base, hdkif->phy_addr);
    	  phyIdReadCount--;
    	  sciDisplayText(sciREGx, txtProgress, sizeof(txtProgress));
      }

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

    非常感谢您提供有关如何构建/运行有效 LwIP 项目的全面说明。  在解决一些文书问题(包括配置 include 和库路径以及更改一些.c 文件以添加 Halcogen include 文件的前缀)后、我终于成功构建了一个项目。  遗憾的是、CCS GUI 配置机制(尤其是对于路径)操作起来非常麻烦(与许多其他 IDE (如 Visual Studio)一样)。  至少我没有遇到任何无法通过 neophyte 解决的真正 C 代码冲突。

    我想插入所需包含路径的屏幕截图、但此论坛不允许我插入.jpg 文件。  CCS 的配置/属性功能非常有限、因此无法以文本形式提取/操作包含路径。  

    如果没有您的帮助、我就无法完成570LC43的 LwIP 构建。

    我将很快尝试运行该项目。

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

    问题解答:

    在我的推文中、我不得不补充

    #define _TMS570LC43x_

    到 lwip_main.c 和 ldkif.c 的顶部、以使构建成功。

    难道不应该已经在构建- LAUNCHXL2-TMS570LC43x 项目的某个位置定义这些内容吗?  如果是、哪个文件是应该定义_TMS570LC43x_(由 lwip_main.c 和 ldkif.c 直接或间接包含)的"config"文件?

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="521569" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1121389/tms570lc4357-getting-ethernet-mac-running - starting-with -loopback -test/tms5978#4165978"]不应该已经使用这些引用来构建 TMS570LC43x-lc64x/slec]

    查看从  Application\LwIP\v00.04.00\LAUNCHXL2-TMS570LC43x\build-LAUNCHXL2-TMS570LC43x 示例导入的工程的 CCS 工程属性、 在工程属性中设置了_TMS570LC43x_预定义符号:

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

    您好!

    由于我必须为项目自行设置 CCS 环境、因此该符号不在 GUI 中、就像所有必要的包含路径一样。  从某些设置文件中配置 CCS 设置是否有规定的方式?  或者、这只是项目设置机制中的一个漏洞吗?

    至少我现在不需要 C 代码模式来构建项目。

    谢谢。

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

    我像你所说的那样,对 lwiplib.c 做了运动。  我看不到您看到的行为。

    当我运行项目时、会显示初始启动横幅字符串、并且在"Debug - Getting PHY Alive Status... 错误... "Done"(完成)消息。

    我有一根以太网电缆连接到 Launchpad、并验证了是否已连接 DHCP 服务器并提供 IP 地址(在 Windows 笔记本电脑连接到电缆时进行了测试)。

    我在 hdkif.c:455 (对 Dp8360IDGE()的调用)中放置了一个断点,它永远不会触发。

    不知道正在发生什么、但会尝试调试。  如果您对如何追踪事件的顺序有任何想法、请告诉我。

    非常非常感谢。

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

    同时按下 PORRST 按钮几次、但系统行为似乎相同(显示点)。  PORRST 似乎与(软件) CCS Run->Reset 执行"相同"操作、减去设置的断点。

    谢谢。

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

    抱歉,在行 hdkif.c:455后显示的 txProgress 是点(".") 显示。  不知道为什么断点不触发(有时)。

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

    包含路径位于.cproject 文件中、如果是相对于 project_root...定义的、则必须以这种方式定义。












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

    MDIOPhyRegRad()似乎与 MDIO 相关,我看了 Jadish 在这个线程上的早期帖子,他在这里提供了环回项目,并检查在 PINMUX 中,MDIO (G3)和 MDCLK (V5)是否在 Halcogen 中被连接,而不是。  我在此项目中连接了它们、重新生成了 C 代码、并单击了我在之前接收到的其他 LwIP 项目上看到的 PINMUX_BLE_R4_错误。  我不知道焊球_R4_是什么、也不知道如何解决这个问题。  我怀疑 MDIO 和 MDCLK 必须连接。

    感谢你的帮助。

    >>编译失败
    HALCoGen-TMS570LC43x/source/subdir_rules.mk:86:目标'HALCoGen-TMS570LC43x/source/HL_pinmux.obj'的配方失败
    "C:/users/plu/Documents/TMS_XL2-570LC43-examples/570LC43_EMAC_LWIP_new/Hercules 示例/Application/LwIP/v00.04.00/LAUNCHXL2-TMS570LC43x/HALCoGen-TMS570LC43x/SOURCE /HL_pinmux.c:R4_Ball 标识符为未定义的错误:"Call 标识符"、"r4_ball:r4_cumx_r4:***.c"
    1在编译"C:/users/plu/Documents/TMS_XL2-570LC43-examples/570LC43_EMAC_LWIP_new/Hercules 示例/Application/LwIP/v00.04.00/LAUNCHXL2-TMS570LC43x/HALCoGen-TMS570LC43x/SOURCE /pinmux_hl"时检测到错误。
    Gmake:***[HALCoGen-TMS570LC43x/SOURCE /HL_pinmux.obj]错误1.

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

    在查看代码库时、我看到备份.dIL 文件使用 PINMUX_BLE_R4_GPIOB_3来代替当前使用 PINMUX_BLE_R4_的.dIL。  因此、GPIOB_3可能与 MDIO 有关。

    LTWPNE1840A:~μ C/Examples/570LC43_EMAC_LWIP_new/Hercules _Examples/Application/LwIP/v00.04.00/LAUNCHXL2-TMS570LC43x/HALCoGen-TMS570LC43x 113> grep -n -R BLE_R4
    HALCoGen-TMS570LC43x.DIL:10405:driver.PINMUX.VAR.PINMUX9.value="PINMUX_BLE_R4_| PINMUX_BLE_N17_EMIF_NCS_0 | PINMUX_BLE_L17_EMIF_NCS_2
    HALCoGen-TMS570LC43x_Bak.DIL:10100:driver.PINMUX.VAR.PINMUX9.value="PINMUX_BLE_R4_GIOB_3 | PINMUX_BLE_N17_EMIF_NCS_0 | PINMUX_BLE_L17_EMIF_NCS_2
    include/hl_pinmux.h:76:#define PINMUX_BLE_R4_SHIFT 8U
    include/hl_pinmux.h:271:#define PINMUX_BLE_R4_MASK (~(uint32)(((uint32) 0xFFU << PINMUX_BLE_R4_SHIFT))
    include/hl_pinmux.h:517:#define PINMUX_BLE_R4_EMIF_NCA ((uint32)(((uint32) 0x1U << PINMUX_BLE_R4_SHIFT))
    include/hl_pinmux.h:518:#define PINMUX_BLE_R4_GIOB_3 (((uint32)(((uint32) 0x4U << PINMUX_BLE_R4_SHIFT))
    source/HL_pinmux.c:254:pinMuxReg ->PINMUX[9]= PINMUX_BLE_R4_| PINMUX_BLE_N17_EMIF_NCS_0 | PINMUX_BLE_L17_EMIF_NCS_2;

    在回送代码中、"相同"行具有 PINMUX_BLE_R4_EMIF_NCA、这似乎表示与某些 CAS (列地址选通???)之间存在某种关系。

    LTWPNE1840A:~μ A/examples/570LC43_EMAC_loopback 53> grep -n -R BLE_R4
    570LC43_EMAC_Roopback。DIL:10324:driver.PINMUX.VAR.PINMUX9.value="PINMUX_BLE_R4_EMIF_NCA | PINMUX_BLE_N17_EMIF_NCS_0 | PINMUX_BLE_L17_EMIF_NCS_2
    include/hl_pinmux.h:76:#define PINMUX_BLE_R4_SHIFT 8U
    include/hl_pinmux.h:271:#define PINMUX_BLE_R4_MASK (~(uint32)(((uint32) 0xFFU << PINMUX_BLE_R4_SHIFT))
    include/hl_pinmux.h:517:#define PINMUX_BLE_R4_EMIF_NCA ((uint32)(((uint32) 0x1U << PINMUX_BLE_R4_SHIFT))
    include/hl_pinmux.h:518:#define PINMUX_BLE_R4_GIOB_3 (((uint32)(((uint32) 0x4U << PINMUX_BLE_R4_SHIFT))
    source/HL_pinmux.c:254:pinMuxReg ->PINMUX[9]= PINMUX_BLE_R4_EMIF_NCA | PINMUX_BLE_N17_EMIF_NCS_0 | PINMUX_BLE_L17_EMIF_NCS_2;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="521569" URL"~/support/microcontrollers/arm-based microcontrollers-group/arm -based-microcontrollers/f/arm based-microcontrollers-forum/1121389/tms570lc4357-getting-ethernet-mac-running - starting-with -loopback -test/IO6479#4166479"]在查看当前已使用的 GPIO_BIL_DR4_ball 文件中、请参阅引用的.BIL_BIL_BIL_R4_ ball 代码 ball。

    我查看了从 TI GIT 示例复制的未经修改的 Hercules 示例/Application/LwIP/v00.04.00/LAUNCHXL2-TMS570LC43x/HALCoGen-TMS570LC43x/SOURCE /HL_pinmux.c。 第254行、该行具有以下成功编译的代码:

    	pinMuxReg->PINMUX[9] = PINMUX_BALL_R4_GIOB_3 | PINMUX_BALL_N17_EMIF_nCS_0 | PINMUX_BALL_L17_EMIF_nCS_2;

    未经修改 的 Hercules _examples/Application/LwIP/v00.04.00/LAUNCHXL2-TMS570LC43x/HALCoGen-TMS570LC43x/HALCoGen-TMS570LC43x.DIL 具有:

    DRIVER.PINMUX.VAR.PINMUX9.VALUE="PINMUX_BALL_R4_ | PINMUX_BALL_N17_EMIF_nCS_0 | PINMUX_BALL_L17_EMIF_nCS_2"

    而未经修改 的 Hercules 示例/应用程序/LwIP/v00.04.00/LAUNCHXL2-TMS570LC43x/HALCoGen-TMS570LC43x/HALCoGen-TMS570LC43x_BAK.dIL 具有:

    DRIVER.PINMUX.VAR.PINMUX9.VALUE="PINMUX_BALL_R4_GIOB_3 | PINMUX_BALL_N17_EMIF_nCS_0 | PINMUX_BALL_L17_EMIF_nCS_2"

    因此、 存储在 TI GIT 示例 repo 中的 HALCoGen-TMS570LC43x.DIL 似乎出了问题、 如果使用 HALCoGen 重新生成代码、则会导致生成无效的 hl_pinmux.c。

    王  能解释出问题的原因、以及如何解决问题。

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

    我删除了 MDIO 和 MDCLK PINMUX 连接、并且 PINMUX_BLE_R4_错误仍然存在。  现在、我不确定原始 C 代码库是否与 Halcogen .hcg (和.dil)文件一致。  我注意到 Halcogen 显示了2作为列表冲突。

    回送项目显示0表示列表冲突、连接了 MDIO 和 MDCLK、并具有多个 MII 连接、而 LwIP 项目仅显示2个 MII 连接表示 MII_TX_CLK 和 MII_RX_CLK。

    不知道从哪里去、主要是因为我不知道 MDIO、MII、EMAC 和 PINMUX 之间的关系。

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="521569" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1121389/tms570lc4357-getting-ethernet-mac-running - starting-with -loopback-test/cadc6517#4166517"]现在、我确定原始的 HCC/cogen 文件与.H[引用的代码不一致。]

    我在 HALCoGen v04.07.01中打开了 Hercules 示例\Application\LwIP\v00.04.00\LAUNCHXL2-TMS570LC43x\HALCoGen-TMS570LC43x\HALCoGen-TMS570LC43x.hcg。 然后选择菜单选项 File -> Generate Code。

    生成 的应用程序\LwIP\v00.04.00\LAUNCHXL2-TMS570LC43x\HALCoGen-TMS570LC43x\SOURCE \HL_pinmux.c 中的第254行已从以下正在编译的内容中更改:

    	pinMuxReg->PINMUX[9] = PINMUX_BALL_R4_GIOB_3 | PINMUX_BALL_N17_EMIF_nCS_0 | PINMUX_BALL_L17_EMIF_nCS_2;

    下面的代码生成编译错误:

    	pinMuxReg->PINMUX[9] = PINMUX_BALL_R4_ | PINMUX_BALL_N17_EMIF_nCS_0 | PINMUX_BALL_L17_EMIF_nCS_2;

    Building file: "C:/Users/mr_halfword/hercules_examples/Application/LwIP/v00.04.00/LAUNCHXL2-TMS570LC43x/HALCoGen-TMS570LC43x/source/HL_pinmux.c"
    Invoking: ARM Compiler
    "C:/ti/ccs1200/ccs/tools/compiler/ti-cgt-arm_20.2.6.LTS/bin/armcl" -mv7R4 --code_state=32 --float_support=VFPv3D16 --include_path="C:/Users/mr_halfword/hercules_examples/Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/check" --include_path="C:/Users/mr_halfword/hercules_examples/Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/include/netif" --include_path="C:/Users/mr_halfword/hercules_examples/Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/include" --include_path="C:/Users/mr_halfword/hercules_examples/Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/netif" --include_path="C:/Users/mr_halfword/hercules_examples/Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk" --include_path="C:/ti/ccs1200/ccs/tools/compiler/ti-cgt-arm_20.2.6.LTS/include" --include_path="C:/Users/mr_halfword/hercules_examples/Application/LwIP/v00.04.00/lwip-1.4.1/apps/httpserver_raw" --include_path="C:/Users/mr_halfword/hercules_examples/Application/LwIP/v00.04.00/lwip-1.4.1/src/include/ipv4" --include_path="C:/Users/mr_halfword/hercules_examples/Application/LwIP/v00.04.00/LAUNCHXL2-TMS570LC43x/HALCoGen-TMS570LC43x/include" --include_path="C:/Users/mr_halfword/hercules_examples/Application/LwIP/v00.04.00/lwip-1.4.1" --include_path="C:/Users/mr_halfword/hercules_examples/Application/LwIP/v00.04.00/example/hdk/inc" --include_path="C:/Users/mr_halfword/hercules_examples/Application/LwIP/v00.04.00/lwip-1.4.1/src/include" --define=_TMS570LC43x_ -g --diag_warning=225 --diag_wrap=off --display_error_number --enum_type=packed --abi=eabi --preproc_with_compile --preproc_dependency="HALCoGen-TMS570LC43x/source/HL_pinmux.d_raw" --obj_directory="HALCoGen-TMS570LC43x/source"  "C:/Users/mr_halfword/hercules_examples/Application/LwIP/v00.04.00/LAUNCHXL2-TMS570LC43x/HALCoGen-TMS570LC43x/source/HL_pinmux.c"
     
    >> Compilation failure
    HALCoGen-TMS570LC43x/source/subdir_rules.mk:86: recipe for target 'HALCoGen-TMS570LC43x/source/HL_pinmux.obj' failed
    "C:/Users/mr_halfword/hercules_examples/Application/LwIP/v00.04.00/LAUNCHXL2-TMS570LC43x/HALCoGen-TMS570LC43x/source/HL_pinmux.c", line 254: error #20: identifier "PINMUX_BALL_R4_" is undefined
    1 error detected in the compilation of "C:/Users/mr_halfword/hercules_examples/Application/LwIP/v00.04.00/LAUNCHXL2-TMS570LC43x/HALCoGen-TMS570LC43x/source/HL_pinmux.c".
    gmake: *** [HALCoGen-TMS570LC43x/source/HL_pinmux.obj] Error 1

    在 HALCoGen GUI 中,转到 PINMUX -> Pun Muxing 选项卡,对于焊球 R4,为 GIOB[3]选择了一个链接:

    然后在 HALCoGen GUI 中重新生成代码。  hL_pinmux.c 文件随后恢复到其原始状态并正在进行编译。

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

    非常感谢。  现在我了解了 PINMUX_x_y 的含义、尽管我不知道各种 y 连接的含义(例如、EMIF_NCA 与 GPIOB (3))。

    我在连接 PINMUXes MDIO 和 MDCLK 的情况下构建了项目、并且行为保持不变(2分钟以上的点、等待获得 phyID)。

    不知道从这里去哪里。

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

    我使用设置 PINMUX_R4_EMIF_NCA (与回送项目一样)进行了播放、并且行为没有不同。  在 LwIP 项目中、连接了 PINMUX_T4_MII_RXCLK 和 PINMUX_U7_MII_TX_CLK、但 Halcogen 将它们显示为冲突。  可能是问题、也可能不是问题。  不知道它们为什么是冲突。  如果给定的 PINMUX_x_具有多个连接、则看起来是冲突、但 MII 时钟并非如此。

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="521569" URL"~/support/microcontrollers/arm-based microcontrollers-group/arm -based-microcontrollers/f/arm based-microcontrollers-forum/1121389/tms570lc4357-getting-ethernet-mac-running - starting-with -loopback -test/cabC66669#4166669"]在 LwCLK_MCU_INDIX 项目中、显示这些冲突已连接、但显示为 RXMCU_CLK_INDI_U_CLK_INU_MCW。  可能是问题、也可能不是问题。

    我注意 到、在 Hercules 示例\Application\LwIP\v00.04.00\LAUNCHXL2-TMS570LC43x\HALCoGen-TMS570LC43x\HALCoGen-TMS570LC43x\HALCoGen-TMS570LC43x.hcg 中、这些引脚的冲突已报告。 当按下 Pin Mixing (引脚混合)选项卡上的 List Conflicts (列表冲突)按钮时、在输出窗口中获得以下内容:

    不知道报告的冲突的重要性、但即使是报告的冲突也能使以太网通信正常工作。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="521569" URL"~/support/microcontrollers/arm-based microcontrollers-group/arm -based-microcontrollers/f/arm based-microcontrollers-forum/1121389/tms570lc4357-getting-ethernet-mac-running - starting-with loopback -test/4166645#4166645"]我构建了相同的项目并等待了2分钟时间和 phyMDIO[+、等待与 INMDIO]以获得相同的连接。

    我看到 lwip 示例失败、出现仅在 加电时获取 PHY ID 的错误。

    如果按下复位按钮、PORRST 按钮或下载程序未检测 到 LAUNCHXL2-570LC43无法访问 PHY ID。

    我可能能够添加一些调试、以了解在加电时何时无法获取 PHY ID。

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

    按下 RESET 或 PORRST 按钮时、我无法重新生成 PHY ID 工作时的情况。  当我按下 RESET 或 PORRST 时、我看到的行为与执行软件 Run->Reset 时相同、显示2分钟以上的点、表示等待 PHY ID、然后显示"Debug - Getting PHY Alive Status... 错误... 完成。"

    我不知道为什么我的设置不执行你的操作。  我不知道为什么您的"硬件"复位(复位或 PORRST 按钮)与您的"软件"复位(运行->复位)的行为不同。

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

    太棒了。  事实证明、我正在使用的 Launchpad 恰好具有"缺陷"PHY。  我在我的另一个 Launchpad 上运行了 LwIP 项目,它的行为确实如您所述,使用 PORRST 时,它始终成功处理 PHY ID 和 DHCP 地址请求/应答,使用 Run->Reset 时,有时成功处理 PHY ID 和 DHCP。

    我之前没有启动和运行其他 Launchpad、因为我遇到了 CCS 处理多个实例和调试会话/探针的怪异情况、其中第一个 Launchpad "硬化"资源、而第二个无法启动并运行。  但是、这是我经常遇到的一个问题、我通常必须关闭两个会话并重新启动它们、或者完全重新启动 Windows 笔记本电脑、才能使 CCS 多会话重新运行。

    因此、我最终拥有一个工作/正在运行的 LwIP、通过它我可以跟踪事件 hdkif 经过的序列、以获得一个正常运行的 MAC 层。  我需要更换有缺陷的 Launchpad。

    BTW、我的"良好" Launchpad 的8引脚以太网连接器上的琥珀色和绿色指示灯/LED 始终亮起、而"不良" Launchpad 的指示灯始终熄灭(无论是否连接电缆)。  我不认为这是任何潜在硬件运行状况的有用指标、但它可能是一个大指标。  在大多数以太网设备中、LED 仅在连接电缆且链路处于活动状态(与合作伙伴通话)时亮起、琥珀色表示"低速"(10Mbps?) 绿色表示"高速"(100Mbps?)。

    您能否告诉我您的 Launchpad 以太网连接器 LED 的行为方式?  它们是否始终开启?

    非常非常感谢。  我将使用 LwIP 项目来确定 hdkif 的作用。  也许回送开启的在线项目可以在"Good "Launchpad 上工作。

    我刚刚发现、在我的第一个 Launchpad 上运行回送项目(现在为"坏")可能会损坏 Launchpad EMAC 硬件、或使其处于某种"坏"状态。  Launchpad 上是否存在一些阻止 Launchpad 进入网络的残余配置(一旦在其上运行了回送项目)?  这似乎比 Launchpad 恰好具有不良 EMAC 的想法更有可能。  是否有某种方法可以将 Launchpad 设置为"出厂复位"模式?

    === Good Launchpad 的输出

    Hercules 微控制器
    应用工程师
    小端字节序器件
    初始化以太网(DHCP)
    调试-获取 PHY ID ...成功
    调试-使 PHY 处于活动状态...成功
    调试-获取 PHY 链路状态...成功
    调试-设置链接...成功
    已完成
    正在启动 Web Server..Done

    Hercules 微控制器
    应用工程师
    小端字节序器件
    设备 IP 地址:192.168.0.86
    可访问 Web 服务器@ http:\\192.168.0.86

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="521569" URL"~/support/microcontrollers/arm-based microcontrollers-group/arm -based-microcontrollers/f/arm based-microcontrollers-forum/1121389/tms570lc4357-getting-ethernet-mac-running - starting-with -loopback -test/cabC66669#4166669"]在 LwCLK_MCU_INDIX 项目中、显示这些冲突已连接、但显示为 RXMCU_CLK_INDI_U_CLK_INU_MCW。  可能是问题、也可能不是问题。

    我尝试通过移除焊球 T4上的 MII_RX_CLK 和 HALCoGen GUI 上焊球 U7上的 MII_TX_CLK 的链接来消除"冲突"。 在重新生成代码并进行更改后、该示例在 LAUNCHXL2-570LC43上不再起作用、并在串行输出上报告以下错误:

    HERCULES MICROCONTROLLERS
    Texas Instruments
    Little Endian device
    Initializing ethernet (DHCP)
            DEBUG - Getting PHY ID....SUCCESS
            DEBUG - Getting PHY Alive Status...SUCCESS
            DEBUG - Getting PHY Link Status...SUCCESS
            DEBUG - Setting up Link...SUCCESS
    ..DONE
    
    
    -------- ERROR INITIALIZING HARDWARE --------

    看一下引脚复用、 LAUNCHXL2-570LC43上确实需要连接 PINMUX_T4_MII_RXCLK 和 PINMUX_U7_MII_TX_CLK、以确保 将 TX_CLK 和 RX_CLK 连接到 DP83630以太网 PHY。

    即、有关冲突的 HALCoGen 警告显示为 false。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="521569" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1121389/tms570lc4357-getting-ethernet-mac-running - starting-with loopback-test/4167001#4167001"]当您使用 DHCP 地址并使用另一个 LaunchPad/RwID 在项目上运行时,有时会使用该项目并使用该项目进行重新设置,并使用该项目时,请使用该项目并使用另一个名称[rwID/rwPhy]并使用该项目,并使用该项目,并使用该项目进行重新设置。

    我想已经找到了代码在加电时无法读取 PHY ID 的原因、并修改 了 hdkif.c 中的 hdkif_hw_init ()函 数、以便在尝试访问 PHY 之前复位 DP83630 PHY。 代码修改为:

    $ git diff Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/netif/hdkif.c
    diff --git a/Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/netif/hdkif.c b/Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/netif/hdkif.c
    index 0f8cd15..c67592a 100644
    --- a/Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/netif/hdkif.c
    +++ b/Application/LwIP/v00.04.00/lwip-1.4.1/ports/hdk/netif/hdkif.c
    @@ -62,6 +62,7 @@
     #include "HL_mdio.h"
     #include "HL_phy_dp83640.h"
     #include "HL_sci.h"
    +#include "HL_gio.h"
     #else
     #include "emac.h"
     #include "mdio.h"
    @@ -430,6 +431,38 @@ hdkif_hw_init(struct netif *netif)
       /* maximum transfer unit */
       netif->mtu = MAX_TRANSFER_UNIT;
    
    +  /* On a LAUNCHXL2-570LC43 the:
    +   * a. The TMS570LC4357 ECLK output is connected to the DP83630 Phy X1 oscillator input.
    +   * b. The TMS570LC4357 GIO4[4] GPIO is connected to the DP83630 RESETn input.
    +   *
    +   * The DP83630 datasheet for the "RESET pulse width" says:
    +   *   Clock must be stable for at min 1 us during RESET pulse low time
    +   *
    +   * I.e. the DP83630 datasheet implies the X1 clock must be running before reset is released.
    +   *
    +   * On a power-up of the LAUNCHXL2-570LC43 the TMS570LC4357 ECLK output won't be running until
    +   * the software in systemInit() has initialised the clocks.
    +   *
    +   * Therefore the following code:
    +   * a. First asserts the DP83630 RESETn input for at least 5 microseconds.
    +   *    The datasheet parameter T2.2.4 "RESET pulse width is a min of one microsecond.
    +   * b. After the reset delays for at least 167 milliseconds before initialising the MDIO,
    +   *    to give the DP83630 time to latch-in hardware configuration pins and be ready for
    +   *    the first MDIO access.
    +   *    The datasheet parameters T2.1.1 "Post Power Up Stabilization time prior to MDC preamble for register
    +   *    accesses" T2.1.2 "Hardware Configuration Latch-in Time from power up" parameters
    +   *    are both 167 milliseconds.
    +   *
    +   * Prior to adding this code to reset the DP83630 Phy, on power-up of the LAUNCHXL2-570LC43
    +   * found that the following code would fail to read the Phy ID, and require the RESET or RSTPOR
    +   * button to be pressed to recover.
    +   */
    +  gioSetBit (gioPORTA, 4, 0);
    +  __delay_cycles (PLL1_FREQ * 5);
    +  gioSetBit (gioPORTA, 4, 1);
    +
    +  __delay_cycles (PLL1_FREQ * 167000);
    +
       /* device capabilities */
       /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */
       netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;
    
    

    在我 的 LAUNCHXL2-570LC43中、上述更改允许 PHY ID 在加电时读取、从而无需使用复位按钮(5次加电成功)。

    [引用 userid="521569" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1121389/tms570lc4357-getting-ethernet-mac-running - starting-with -loopback -test/4167001#4167001"]事实证明 LaunchPad 在使用 Launchpad/phy 时出现故障。]

    由于原始代码未重置 PHY、上述软件更改可能会使"有缺陷"的 Launchpad 正常工作。

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

    非常感谢您解决 PHY ID 问题。  我应用了您的修补程序,实际上,经过多次尝试,Run->Reset 似乎可以正常工作。  需要使用软件复位机制、因为在包含在某些方框中的电路板上、必须按下硬件按钮是不可行的。

    遗憾的是、我的第一块板不会通过此修复"恢复"。  它可能会永久或暂时(有东西卡住)损坏。  不知道运行回送项目是否对它有贡献、但我没有机会使用第二块板。

    您是否有机会了解为何无法完全/正确地访问网页?  我使用 Firefox 浏览器遇到了同样的问题。  虽然我并不十分关心 Web 浏览、但我想知道它是否是由底层发送/接收设备(hdkif)的某些问题/限制造成的。

    再次感谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="521569" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1121389/tms570lc4357-getting-ethernet-mac-running - starting-with -loopback -test/4167473#41674773"]您是否完全没有机会浏览到正确的网页?  [/报价]

    我一直在尝试调试原因。 首先尝试为 httpd.c 源文件启用 LWIP_DEBUGF 机制、该源文件被重新定向至串行输出。 该调试具有侵入性、因为它会减慢程序通过串行端口输出调试信息的速度(从中断处理程序调用 LWIP 函数)。 启用 httpd.c 调试发现 http_write()函数出错。

     随后禁用了 LWIP_DEBUGF 机制,并使用以下补丁将全局变量中的某些计数器添加到 http_write()函数:

    mr_halfword@DESKTOP-5DD8B6L MINGW64 ~/hercules_examples (master)
    $ git diff Application/LwIP/v00.04.00/lwip-1.4.1/apps/httpserver_raw/httpd.c
    diff --git a/Application/LwIP/v00.04.00/lwip-1.4.1/apps/httpserver_raw/httpd.c b/Application/LwIP/v00.04.00/lwip-1.4.1/apps/httpserver_raw/httpd.c
    index e53a5d3..04bdb45 100644
    --- a/Application/LwIP/v00.04.00/lwip-1.4.1/apps/httpserver_raw/httpd.c
    +++ b/Application/LwIP/v00.04.00/lwip-1.4.1/apps/httpserver_raw/httpd.c
    @@ -603,6 +603,10 @@ http_state_free(struct http_state *hs)
      * @param apiflags directly passed to tcp_write
      * @return the return value of tcp_write
      */
    +volatile unsigned int http_write_failures;
    +volatile unsigned int http_write_full_length;
    +volatile unsigned int http_write_partial_length;
    +
     static err_t
     http_write(struct tcp_pcb *pcb, const void* ptr, u16_t *length, u8_t apiflags)
     {
    @@ -631,7 +635,16 @@ http_write(struct tcp_pcb *pcb, const void* ptr, u16_t *length, u8_t apiflags)
    
        if (err == ERR_OK) {
          LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Sent %d bytes\n", len));
    +     if (len == *length)
    +     {
    +         http_write_full_length++;
    +     }
    +     else
    +     {
    +         http_write_partial_length++;
    +     }
        } else {
    +     http_write_failures++;
          LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Send failed with err %d (\"%s\")\n", err, lwip_strerr(err)));
        }
    
    

    当程序运行时、可以使用 CCS 调试器中的持续刷新功能来监视计数器。

    当使用 Windows 10 PC 查看正确服务的网页时、计数如下(即无故障):

    当使用 Linux PC 查看网页时, 如果/img/Hercules_block_diagram.gif 文件仅提供部分服务,则计数如下,其中有5次写入失败:

    在递增 http_write_failures 的行上设置断点。 回扫是:

    Texas Instruments XDS110 USB Debug Probe_0/CortexR5 (Suspended - HW Breakpoint)	
    	http_write(struct tcp_pcb *, void *, unsigned short *, int)() at httpd.c:647 0x000539F4	
    	http_send_data_nonssi(struct tcp_pcb *, struct http_state *)() at httpd.c:1,144 0x00053C74	
    	http_send(struct tcp_pcb *, struct http_state *)() at httpd.c:1,568 0x00053D20	
    	http_sent(void *, struct tcp_pcb *, int)() at httpd.c:2,258 0x000543D0	
    	tcp_input(struct pbuf *, struct netif *)() at tcp_in.c:333 0x00048B90	
    	ip_input(struct pbuf *, struct netif *)() at ip.c:575 0x0004E968	
    	ethernet_input(struct pbuf *, struct netif *)() at etharp.c:1,365 0x000506F8	
    	hdkif_rx_inthandler(struct netif *)() at hdkif.c:759 0x00051514	
    	lwIPRxIntHandler(unsigned int)() at lwiplib.c:283 0x00051EF8	
    	EMACCore0RxIsr() at lwip_main.c:244 0x0005A294	
    	<...more frames...>	
    

    发生的情况是,从 PC 接收到2920字节的 ACK 时,调用 http_write()以尝试发送更多字节。 pcb->sndbuf =的值  3080.由于 PC 连接的字节数小于发送缓冲区中的空间, http_write()尝试发送2920字节的文件。 但是 ,对于 所有尝试的大小,tcp_write()返回 ERR_MEM (内存不足错误)。 如果 tcp_write()因 ERR_MEM 而失败, http_write() 尝试将字节数减半,直到成功或甚至尝试发送1个字节时 ERR_MEM 失败。

    我尚未确定问题是在 lwip httpd 服务器还是 底层发送/接收设备(hdkif)。

    其他一些注意事项:

    1. TivaWare_C_Series-2.2.0.295和 Hercules 示例使用 lwip-1.4.1。 使用 TivaWare_C_Series-2.2.0.295 lwip_Enet 示例、我无法重复该故障。  TivaWare_C_Series-2.2.0.295 lwip_Enet 示例经过修改、可提供导致 Hercules 示例失败的相同/img/Hercules_block_diagram.gif 文件; TivaWare_C_Series-2.2.0.295 lwip_Enet 已成功地将该文件提供给 Linux PC。
    2. lwip httpd.c 具有 一个 http_poly()函数,该函数旨在从计时器调用,并检查是否有与打开的文件的连接,以尝试发送更多数据。 查看 Hercules 的 lwip-1.4.1端口、我看不到该端口中调用 lwip 计时器的任何代码。 而 TivaWare_C_Series-2.2.0.295端口具有此功能。

    后续步骤为:

    • 请尝试并确定 为什么 tcp_write()返回 ERR_MEM,此时应该有可用的发送缓冲区空间。
    • 尝试向 Hercules 端口添加代码以调用 lwip 计时器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢您对此进行后续跟进/直至了解。  尽管我无法了解 LwIP 的内部工作原理、但这里的清晰说明让我了解了如何更好地使用 CCS 下的调试。

    我将继续跟踪您的调查结果。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="91588" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1121389/tms570lc4357-getting-ethernet-mac-running - starting-with -loopback -test/4168085#4168085"]尝试并确定 应在 何时返回 tcp_emr_write buffer [引用免费的原因]。

      Hercules 示例\Application\LwIP\v00.04.00\lwip-1.4.1\src\core\memp.c 中的 memp_malloc 函数具有以下块、该块在出现内存分配错误时运行:

      } else {
        LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("memp_malloc: out of memory in pool %s\n", memp_desc[type]));
        MEMP_STATS_INC(err, type);
      }

    在上面设置一个断点、当使用 Linux PC 查看网页时发生第一个内存分配错误时、调用栈为:

    Texas Instruments XDS110 USB Debug Probe_0/CortexR5 (Suspended - HW Breakpoint)	
    	memp_malloc(int)() at memp.c:420 0x00044750	
    	pbuf_alloc(int, int, int)() at pbuf.c:326 0x00045174	
    	tcp_write(struct tcp_pcb *, void *, int, int)() at tcp_out.c:552 0x0004BBA8	
    	http_write(struct tcp_pcb *, void *, unsigned short *, int)() at httpd.c:622 0x00053A18	
    	http_send_data_nonssi(struct tcp_pcb *, struct http_state *)() at httpd.c:1,144 0x00053D44	
    	http_send(struct tcp_pcb *, struct http_state *)() at httpd.c:1,568 0x00053DF0	
    	http_sent(void *, struct tcp_pcb *, int)() at httpd.c:2,258 0x000544A0	
    	tcp_input(struct pbuf *, struct netif *)() at tcp_in.c:333 0x00048B90	
    	ip_input(struct pbuf *, struct netif *)() at ip.c:575 0x0004E968	
    	ethernet_input(struct pbuf *, struct netif *)() at etharp.c:1,365 0x000506F8	
    	hdkif_rx_inthandler(struct netif *)() at hdkif.c:759 0x00051514	
    	lwIPRxIntHandler(unsigned int)() at lwiplib.c:283 0x00051FC4	
    	EMACCore0RxIsr() at lwip_main.c:244 0x0005A364	

    MEMP_PBUF 类型发生了存储器分配错误 (6)

    有一个全局变量 lwip_stats、这是一个包含各种 lwip 统计信息的结构。

    Windows PC 成功查看网页后 、MEMP_PBUF 的内存统计信息如下。 这意味 着在任何时候、MEMP_PBUF 分配的最大数量都是48个中的5个:

    lwip_stats.memp[6] struct stats_mem{ava=48、used=0、max=5、err=0、ilicy=0}

    而当 Linux PC 无法查看网页时、内存统计信息为:

    lwip_stats.memp[6] struct stats_mem{ava=48、used=0、max=48、err=54、ilicable=0}

    即、在所有  MEMP_PBUF 被使用后、发生了存储器分配故障、但 MEMP_PBUF 最终确实被释放。

     MEMP_PBUF 的数量由  Hercules 示例\Application\LwIP\v00.04.00\examples\HDK\inc\lwips.h 中的 MEM_NUM_PBUF 值设置 已尝试将 MEMP_NUM_PBUF 从48增大到480。

    随着 MEMP_NUM_PBUF 的增加、Linux PC 可以在复位后成功查看网页一次。 但是、在查看网页后、launchad 不再响应以太网- ping 没有响应、Web 浏览器报告服务器不再响应。 在此故障状态下:

    1.  发送中断数量的计数器计数器计数器计数到高速率时增加- 10秒内增加1613344。  
    2. 如果调试可以看到 被调用的 hdkif_TX_inthandler ()、但看不到 EMAC_BUF_DESC_SOP 标志设置、因此认为没有要处理的开始数据包。 即、正在调用发送中断处理程序、但未清除中断源、导致软件在发送中断处理程序中花费大量时间。

    认为 hdkif.c 代码中存在一个与传输描述符处理相关的问题、从而导致:

    • 原始 MEMP_NUM_PBUF 值为48时、释放传输帧的 PBUF 会延迟、导致 TCP 发送停止、而没有空闲的 PBUF 来进一步传输。
    • 当 MEMP_NUM_PBUF 值增加480时、软件将进入无法为发送中断提供服务的正确数据包起始状态。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢您解决此问题。

    那么、在您的专家看来、这个 hdkif 问题是一个障碍、还是可以解决的问题?  更重要的是、硬件/FPGA 是否存在问题、或者只是围绕硬件包装的软件存在问题?

    感谢您的深入见解。