OpenEdv-开源电子网

标题: 107以太网DMA发送描述符问题 [打印本页]

作者: 以枫之名    时间: 2016-10-17 20:18
标题: 107以太网DMA发送描述符问题
本帖最后由 以枫之名 于 2016-10-17 20:22 编辑

描述符定义:

typedef struct _ETH_DMA_Desc
{
  unsigned int DES0;
  unsigned int DES1;
  unsigned int DES2;
  unsigned int DES3;
}ETH_DMA_Desc;

__align(4) ETH_DMA_Desc TxDes[2];

单个描述符发送正常,代码:

void ETH_Tx_Des_Init(void)
{
    int i;
    TxDes[0].DES0 = (0<<31) |
                    (0<<30)        |
                    (1<<29)        |
                    (1<<28)        |
                    (0<<27)        |
                    (0<<26)        |
                    (0<<25)        |
                    (3<<22)        |
                   (1<<21)        |
                    (1<<20)        ;
        TxDes[0].DES1 = 0;
        TxDes[0].DES2 = (unsigned int)TxBuffer[0];
        TxDes[0].DES3 = (unsigned int)&TxDes[1];        


    TxDes[1].DES0 = (0<<31) |
                    (0<<30)        |
                    (1<<29)        |
                    (1<<28)        |
                    (0<<27)        |
                    (0<<26)        |
                    (0<<25)        |
                    (3<<22)        |
                    (0<<21)        |
                    (1<<20)        ;
        TxDes[1].DES1 = 0;
        TxDes[1].DES2 = (unsigned int)TxBuffer[1];
        TxDes[1].DES3 = (unsigned int)&TxDes[0];

}


int ETH_Tx(unsigned char *Buffer,unsigned int Length)
{
    unsigned int i;
    if(!PhyLinkUp)
        return -1;
    for(i = 0; i < 1; i++)
    {
        if(!(TxDes.DES0 & ETH_DMATxDesc_OWN))
        {
            TxDes.DES1 = (Length & ETH_DMATxDesc_TBS1);
            Jmemcpy(TxBuffer, Buffer, Length);
            TxDes.DES0 |= ETH_DMATxDesc_OWN;
            break;
        }
    }
    if(ETH->DMASR & ETH_DMASR_TBUS)
    {
        ETH->DMASR = ETH_DMASR_TBUS;
        ETH->DMATPDR = 0;
    }

    return 0;
}


以上代码正常工作,但当把描述符改为2个循环,即上面的代码不变,把第描述符的21位清零
void ETH_Tx_Des_Init(void)
{
    int i;
    TxDes[0].DES0 = (0<<31) |
                    (0<<30)        |
                    (1<<29)        |
                    (1<<28)        |
                    (0<<27)        |
                    (0<<26)        |
                    (0<<25)        |
                    (3<<22)        |
                   (0<<21)        |
                    (1<<20)        ;
        TxDes[0].DES1 = 0;
        TxDes[0].DES2 = (unsigned int)TxBuffer[0];
        TxDes[0].DES3 = (unsigned int)&TxDes[1];        


    TxDes[1].DES0 = (0<<31) |
                    (0<<30)        |
                    (1<<29)        |
                    (1<<28)        |
                    (0<<27)        |
                    (0<<26)        |
                    (0<<25)        |
                    (3<<22)        |
                    (0<<21)        |
                    (1<<20)        ;
        TxDes[1].DES1 = 0;
        TxDes[1].DES2 = (unsigned int)TxBuffer[1];
        TxDes[1].DES3 = (unsigned int)&TxDes[0];

}

这样就不能正常工作了,抓包发现STM32没有发送成功,这是为什么?


作者: 以枫之名    时间: 2016-10-17 21:19
int ETH_Tx(unsigned char *Buffer,unsigned int Length)
{
    unsigned int i;
    if(!PhyLinkUp)
        return -1;
    printf("ETH->DMASR:%x\n\r",ETH->DMASR);
    printf("TxDes[0].DES0:%x\n\r",TxDes[0].DES0);
    printf("TxDes[0]:%x\n\r",(unsigned int)&TxDes[0]);
    printf("ETH->DMATDLAR:%x\n\r",ETH->DMATDLAR);
......

一些调试信息

ETH->DMASR:660004
TxDes[0].DES0:30d00000
TxDes[0]:200009c8
ETH->DMATDLAR:200009c8

ETH->DMASR:670444
TxDes[0].DES0:30d00000
TxDes[0]:200009c8
ETH->DMATDLAR:200009c8

ETH->DMASR:670444
TxDes[0].DES0:b0d00000
TxDes[0]:200009c8
ETH->DMATDLAR:200009c8

ETH->DMASR:670444
TxDes[0].DES0:b0d00000
TxDes[0]:200009c8
ETH->DMATDLAR:200009c8

ETH->DMASR:660404
TxDes[0].DES0:b0d00000
TxDes[0]:200009c8
ETH->DMATDLAR:200009c8




作者: 以枫之名    时间: 2016-10-18 08:57
顶一下
作者: 正点原子    时间: 2016-10-18 21:30
帮顶




欢迎光临 OpenEdv-开源电子网 (http://47.111.11.73/) Powered by Discuz! X3.4