请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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 } }