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