This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

MCBSTM32C STM32F107VC Ethernet Driver Issue

Hey,,

I want to implement TCP/IP using no OS on MCBSTM32C (STM32F107VC). The driver ETH_STM32x.c file uses RTX functions in it's receiving part.
Therefore i wrote my own function for receiving a frame, everything else is similar to the driver.

But it is not working. After a lot of checking, i realised it gets stuck at a certain point(second if condition of loop).
The issue is , the DMA OWN bit in the descriptor is never reset. why is this problem arising.

Please Help !!!
my receiving function returns the packet length and it writes the data from address:packet .
it returns 0 otherwise.

U16 receive_packet( U8 * packet)
{

U32 i,RxLen;
U32 *sp;
i = RxBufIndex;

if      (ETH->DMASR &DSR_RS ==0)                                         // check if a packet has been received and buffered
{
        return 0;
}

if((Rx_Desc[i].Stat & DMA_RX_OWN) != 0)
{
        return 0;
}

if( (Rx_Desc[i].Stat & DMA_RX_ES ==0)       &&      ((Rx_Desc[i].Stat & DMA_RX_SEG_MASK) == DMA_RX_SEG_MASK))
{
        RxLen = ((Rx_Desc[i].Stat >> 16) & 0x3FFF) - 4;
        sp = (U32 *)(Rx_Desc[i].Addr & ~3);
        for (RxLen = (RxLen + 3) >> 2; RxLen; RxLen--)
          {
            *packet++ = *sp++;
          }

}
else
{
        RxLen=0;
}
Rx_Desc[i].Stat = DMA_RX_OWN;    // Set Own bit of the Rx descriptor Status: gives the buffer back to ETHERNET DMA

if (++i == NUM_RX_BUF) i = 0;  RxBufIndex = i;

if (ETH->DMASR & INT_RBUIE)
{       ETH->DMASR   = INT_RBUIE;                               // Rx DMA suspended, resume DMA reception.
        ETH->DMARPDR = 0;
}

ETH->DMASR = DSR_NIS | DSR_RS ;                      // Clear the interrupt pending bits

return(RxLen);

}

0