Transmission Problem in MPC 5777M FEC


Transmission Problem in MPC 5777M FEC

702 次查看
Contributor V

Hi All, I am developing the Ethernet driver  for MPC 5777M, My driver (FEC) is not clearing the Ready bit ,when I call Eth_tx function shown below.

void Eth_Tx(u16_t len)
    au32TxBDs[0U] = 0x8C000000U | len;
    Reg32Write(FEC_TDAR, 0x01000000U);
    while(0x80000000U == (au32TxBDs[0U] & 0x80000000U));

    au32TxBDs[0] = 0x00000000U;  // Clear the Ready bit, the rest will be set later
    au32TxBDs[1] = (u32_t)au8TxBuff;  //Data pointer
    au32TxBDs[0] = 0x20000000U; // Set the Empty bit and the Wrap bit

And my buffer descriptors are

/* Buffer sizes and counts */
#define RX_BUFF_SIZE (1536u)
#define TX_BUF_SIZE (1536u)

/* Buffer descriptors: */
__attribute__(( aligned(16) ))
volatile u32_t au32RxBDs[2U]= {0u};
__attribute__(( aligned(16) ))
volatile u32_t au32TxBDs[2U] = {0u};

/* Buffers: */
__attribute__(( aligned(64) ))
u8_t au8RxBuffs[RX_BUFF_SIZE] = {0u};
__attribute__(( aligned(64) ))
u8_t au8TxBuff[TX_BUF_SIZE] = {0u};

Can anyone help me how to sort out this problem ?

2 回复数

357 次查看
NXP TechSupport
NXP TechSupport


It seems you do not have Tx BD properly configured. I understand you have 1 Tx and 1 Rx BD defined.

However you should have at least 2 Tx BDs to ensure that there is always at least one TxBD with the R bit cleared in the Tx BD ring.

The last (here second) TxBD in a ring must have Wrap bit set. Once you will prepare BD for transmission you will swap between Tx BDs.


One example is posted for example here

BR, Petr

357 次查看
Contributor V

Hi PetrS  , Thank you for the reply. I have Disabled  the cache(Removed D_CACHE Flag from settings in the IDE) with single TxDesc and RxDesc , it is resending(Two times) the frames for a  udp/tcp/arp request messages. Currently I am modifying my code to two descriptors for both Txdesc and Rxdesc.

I have doubt in your example code that  why we need two rxbuffers and only one txbuf as you already using two descriptors both tx and rx.

uint8_t txBuf[1536] __attribute__ ((aligned (16)));
uint8_t rxBuf[2][1536] __attribute__ ((aligned (16)));

Can you please help me how to disable cache region only for those buffers instead of removing for whole ??

0 项奖励