OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3905|回复: 3

107以太网DMA发送描述符问题

[复制链接]

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
发表于 2016-10-17 20:18:53 | 显示全部楼层 |阅读模式
100金钱
本帖最后由 以枫之名 于 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没有发送成功,这是为什么?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2016-10-17 21:19:18 | 显示全部楼层
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



回复

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
 楼主| 发表于 2016-10-18 08:57:57 | 显示全部楼层
顶一下
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-10-18 21:30:40 | 显示全部楼层
帮顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 22:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表