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; }