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