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:以太网

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1513740/tms570lc4357-ethernet

器件型号:TMS570LC4357

工具/软件:

我们目前正在研究两个 TMS570LC43X 之间的以太网通信、但我们无法接收数据包。 我附上传输和接收代码以供参考。

/// Transmission code  /////
#include "HL_sys_common.h"
#include "HL_system.h"

/* USER CODE BEGIN (1) */
#include "HL_emac.h"
#include "HL_hw_reg_access.h"
#include "string.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) */

//#include "HL_emac.h"
//#include "HL_sys_common.h"
//#include "string.h"

// MAC Address of MCU-A
uint8 emacAddress_A[6U] = {0x00U, 0x08U, 0xEEU, 0x03U, 0xA6U, 0x6CU};
uint32 emacPhyAddress_A = 1U;

// Descriptor Data Structures
extern hdkif_t hdkif_data[1];
pbuf_t tx_pack[5];                     // Array for multiple packets
uint8 tx_data[5][100];                 // Data storage for each packet
uint32 packet_count = 5;               // Number of packets to transmit
uint32 tx_size = 100;

void create_tx_packet(uint32 index, const char *message) {
    int j;
    tx_pack[index].tot_len = tx_size;
    tx_pack[index].len = tx_size;

    // Destination MAC (Broadcast FF:FF:FF:FF:FF:FF)
    for(j = 0; j < 6; j++) {
        tx_data[index][j] = 0xFFU;
    }

    // Source MAC (MCU-A MAC Address)
    for(j = 0; j < 6; j++) {
        tx_data[index][j + 6] = emacAddress_A[j];
    }

    // Type/Length (0x0800 for IPv4 or any custom value)
    tx_data[index][12] = 0x08;
    tx_data[index][13] = 0x00;

    // Payload Data (Send the message)
    memcpy(&tx_data[index][14], message, strlen(message) + 1);  // +1 for null terminator

    // Assign the payload and clear the next pointer
    tx_pack[index].payload = &tx_data[index][0];
    tx_pack[index].next = NULL;
}

void main(void) {
    volatile int i;
    _enable_IRQ();
    EMACHWInit(emacAddress_A);  // Initialize EMAC

    // Create multiple packets
    create_tx_packet(0, "Hello Packet 1");
    create_tx_packet(1, "Hello Packet 2");
    create_tx_packet(2, "Hello Packet 3");
    create_tx_packet(3, "Hello Packet 4");
    create_tx_packet(4, "Hello Packet 5");
    int p;
    // Transmit the packets sequentially
    for ( p = 0; p < packet_count; p++) {
        EMACTransmit(&hdkif_data[0], &tx_pack[p]);
        for (i = 0; i < 5000000; i++);  // Small delay between transmissions
    }

}

////// Reception code /////
#include "HL_sys_common.h"
#include "HL_system.h"
#include "HL_emac.h"
//#include "HL_emac_ctrl.h"      // For hdkif_t and PHY functions
#include "stdio.h"
#include "string.h"
volatile int i = 0;
// ---------------------- EMAC Setup ----------------------
#define MAX_PACKET_SIZE   1500U
#define EMAC_SUCCESS      0
#define EMAC_FAILURE     -1

// ---------------------- MAC Address & Phy Addr ----------------------
uint8 emacAddress_A[6U] = {0x00U, 0x08U, 0xEEU, 0x03U, 0xA6U, 0x6CU}; // configured in HALCoGen
uint32 emacPhyAddress_A = 1U;  // matches PHY setup in HALCoGen

// ---------------------- Buffers & Data ----------------------
uint8 rx_data[MAX_PACKET_SIZE];     // Buffer for received data
extern hdkif_t hdkif_data[1];       // Provided by HALCoGen EMAC driver

// ---------------------- Receive Packet ----------------------
int receive_packet(void)
{
    EMACReceive(&hdkif_data[0]);  // Trigger reception handler

    rxch_t *rxch = &(hdkif_data[0].rxchptr);
    volatile emac_rx_bd_t *curr_bd = rxch->active_head;

    // Check if descriptor is owned by CPU
    if ((EMACSwizzleData(curr_bd->flags_pktlen) & EMAC_BUF_DESC_OWNER) != EMAC_BUF_DESC_OWNER)
    {
        uint32 length = EMACSwizzleData(curr_bd->flags_pktlen) & 0xFFFFU;
        uint8 *packet_data = (uint8 *)EMACSwizzleData((uint32)curr_bd->bufptr);

        memcpy(rx_data, packet_data, length);
        rx_data[length] = '\0';  // Null-terminate for print

        printf("Packet received (Len %d): %s\n", length, rx_data);
        return EMAC_SUCCESS;
    }

    return EMAC_FAILURE;
}

// ---------------------- Main ----------------------
void main(void)
{
    _enable_IRQ();

    printf("Initializing EMAC...\n");

    // Use user-defined MAC address
    EMACHWInit(emacAddress_A);

    // Update MDIO and PHY address info
    hdkif_data[0].phy_addr  = emacPhyAddress_A;
    hdkif_data[0].mdio_base = MDIO_BASE;   // MDIO_BASE is defined in HL_emac.h
    hdkif_data[0].emac_base = EMAC_BASE;   // EMAC_BASE is defined in HL_emac.h

    // Try to establish link up to 5 times
    uint32 retries = 5;
    while ((EMACLinkSetup(&hdkif_data[0]) != EMAC_ERR_OK) && (retries-- > 0))
    {
        printf("Link not up, retrying...\n");
        for (i = 0; i < 10000000; i++) { }  // Delay
    }

    if (retries == 0)
    {
        printf("Failed to establish Ethernet link.\n");
        while (1);  // Halt
    }

    printf("Ethernet link established.\n");
    printf("Waiting for packets...\n");

    while (1)
    {
        if (receive_packet() == EMAC_SUCCESS)
        {
            printf("Handled received packet.\n");
        }
        else
        {
            printf("No packet available.\n");
        }

//        for (volatile int i = 0; i < 5000000; i++) // delay
    }
}