Part Number: TMS570LC4357
Tool/software:
I am trying to transmit and receive data using emac module of TMS570LC4357 via ethernet cable , I am unable to transmit and receive data using Emac module . I am using two Dsp one for transmission and another for reception. Help me to resolve this issue. I have attached my transmission and reception code below.
#include "HL_emac.h"
#include "HL_mdio.h"
#include "HL_emac_phyConfig.h"
#include <stdio.h>
#include <stdint.h>
#include <string.h>
// Define MAC addresses
uint8_t myMac[6] = {0x00, 0x08, 0xEE, 0x03, 0xA6, 0x6C}; // DSP1 MAC address
uint8_t destMac[6] = {0x00, 0x08, 0xEE, 0x03, 0xA6, 0x6D}; // DSP2 MAC address
int main() {
// Add 167ms delay for PHY stabilization
volatile uint32_t delay = 167000; // Assuming 1us per loop
while (delay--);
// Initialize hdkif structure
hdkif_t hdkif = {
.mac_addr = {0x00, 0x08, 0xEE, 0x03, 0xA6, 0x6C},
.emac_base = EMAC_0_BASE,
.emac_ctrl_base = EMAC_CTRL_0_BASE,
.emac_ctrl_ram = EMAC_CTRL_RAM_0_BASE,
.mdio_base = MDIO_0_BASE,
.phy_addr = EMAC_PHYADDRESS,
.phy_autoneg = NULL,
.phy_partnerability = NULL,
.txchptr = {NULL, NULL, NULL},
.rxchptr = {NULL, NULL, NULL}
};
// Initialize MDIO and EMAC
MDIOInit(MDIO_0_BASE, MDIO_FREQ_INPUT, MDIO_FREQ_OUTPUT);
EMACInit(EMAC_CTRL_0_BASE, EMAC_0_BASE);
EMACInstConfig(&hdkif); // Configure instance
EMACDMAInit(&hdkif); // Initialize DMA
// Set up transmit buffer
static uint8_t txBuffer[1518]; // Ethernet MTU size
// Construct Ethernet frame
memcpy(txBuffer, destMac, 6); // Destination MAC
memcpy(txBuffer + 6, myMac, 6); // Source MAC
uint16_t etherType = 0x0800; // EtherType (e.g., IPv4)
memcpy(txBuffer + 12, ðerType, 2); // Corrected typo
uint8_t payload[] = "Hello from DSP1!";
memcpy(txBuffer + 14, payload, sizeof(payload));
// Set up pbuf structure
pbuf_t pbuf = {
.next = NULL,
.payload = txBuffer,
.tot_len = 14 + sizeof(payload),
.len = 14 + sizeof(payload)
};
// Set up transmit descriptor
static emac_tx_bd_t txDesc;
txDesc.next = NULL;
txDesc.bufptr = (uint32_t)txBuffer;
txDesc.bufoff_len = (0U << 16U) | 1518 ;// Offset 0, length
txDesc.flags_pktlen = EMAC_BUF_DESC_SOP | EMAC_BUF_DESC_EOP | EMAC_BUF_DESC_OWNER;
// Link descriptor to hdkif
hdkif.txchptr.free_head = &txDesc;
// Start transmission
boolean result = EMACTransmit(&hdkif, &pbuf);
if (result == EMAC_ERR_OK) {
// Wait for transmission to complete (polling)
while ((txDesc.flags_pktlen & EMAC_BUF_DESC_OWNER) != 0);
printf("Transmission complete.\n");
} else {
printf("Transmission failed.\n");
}
return 0;
}
#include "HL_emac.h"
#include "HL_mdio.h"
#include "HL_emac_phyConfig.h"
#include <stdio.h>
#include <stdint.h>
#include <string.h>
// Define MAC address for DSP2
uint8_t myMac[6] = {0x00, 0x08, 0xEE, 0x03, 0xA6, 0x6C}; // DSP2 MAC address
int a=99;
int b = 99;
int main() {
// Add 167ms delay for PHY stabilization
volatile uint32_t delay = 167000; // Assuming 1us per loop
while (delay--);
// Initialize hdkif structure
hdkif_t hdkif = {
.mac_addr = {0x00, 0x08, 0xEE, 0x03, 0xA6, 0x6C},
.emac_base = EMAC_0_BASE,
.emac_ctrl_base = EMAC_CTRL_0_BASE,
.emac_ctrl_ram = EMAC_CTRL_RAM_0_BASE,
.mdio_base = MDIO_0_BASE,
.phy_addr = EMAC_PHYADDRESS,
.phy_autoneg = NULL,
.phy_partnerability = NULL,
.txchptr = {NULL, NULL, NULL},
.rxchptr = {NULL, NULL, NULL}
};
// Initialize MDIO and EMAC
MDIOInit(MDIO_0_BASE, MDIO_FREQ_INPUT, MDIO_FREQ_OUTPUT);
EMACInit(EMAC_CTRL_0_BASE, EMAC_0_BASE);
EMACInstConfig(&hdkif); // Configure instance
EMACDMAInit(&hdkif); // Initialize DMA
// Enable receive interrupts for channel 0
EMACRxIntPulseEnable(EMAC_0_BASE, EMAC_CTRL_0_BASE, EMAC_INT_CORE0_RX, EMAC_CHANNEL_0);
// Set up receive buffer
static uint8_t rxBuffer[1518]; // Ethernet MTU size
// Set up receive descriptor
static emac_rx_bd_t rxDesc;
rxDesc.next = NULL;
rxDesc.bufptr = (uint32_t)rxBuffer;
rxDesc.bufoff_len = (0U << 16U) | 1518; // Offset 0, buffer length
rxDesc.flags_pktlen = EMAC_BUF_DESC_OWNER; // Mark as owned by EMAC
// Link descriptor to hdkif
hdkif.rxchptr.free_head = &rxDesc;
hdkif.rxchptr.active_head = &rxDesc;
hdkif.rxchptr.active_tail = &rxDesc;
// Write descriptor to hardware
EMACRxHdrDescPtrWrite(EMAC_0_BASE, (uint32_t)&rxDesc, EMAC_CHANNEL_0);
// Enable receiving
EMACRxEnable(EMAC_0_BASE);
// Poll for received packet
printf("Waiting for packet...\n");
a =4;
while ((rxDesc.flags_pktlen ) != 0); // Wait until EMAC clears OWNER flag
b =4;
// Process received packet
EMACReceive(&hdkif);
// Check if packet was received
if ((rxDesc.flags_pktlen & EMAC_BUF_DESC_SOP) && (rxDesc.flags_pktlen & EMAC_BUF_DESC_EOP)) {
uint32_t pktLen = rxDesc.flags_pktlen & 0xFFFFU; // Extract packet length
if (pktLen >= 14) { // Minimum header size
// Verify source MAC (DSP1: 00:01:02:03:04:05)
uint8_t expectedSrcMac[6] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05};
if (memcmp(rxBuffer + 6, expectedSrcMac, 6) == 0) {
// Verify EtherType (0x0800)
uint16_t receivedEtherType;
memcpy(&receivedEtherType, rxBuffer + 12, 2);
if (receivedEtherType == 0x0800) {
// Extract and print payload
uint8_t *payload = rxBuffer + 14;
uint32_t payloadLen = pktLen - 14;
printf("Received packet from DSP1, payload: ");
uint32_t i;
for ( i = 0; i < payloadLen && i < 100; i++) { // Limit to 100 chars for safety
printf("%c", payload[i]);
}
printf("\n");
} else {
printf("Received packet with unexpected EtherType: 0x%04X\n", receivedEtherType);
}
} else {
printf("Received packet with unexpected source MAC\n");
}
} else {
printf("Received packet too short: %u bytes\n", pktLen);
}
} else {
printf("No valid packet received\n");
}
return 0;
}

