硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1499|回复: 8
收起左侧

[以太网] H743使用非中断方式发送数据包一直超时错

[复制链接]

12

主题

26

回帖

62

积分

初级会员

积分
62
发表于 2021-11-4 16:52:09 | 显示全部楼层 |阅读模式
启用HAL_ETH_Start_IT函数后(注释掉发送中断),使用中断模式发送,发现有丢包的现象。原因是没有一个检测机制,检查数据包是否发送完成。
想使用非中断方式发送,却一直提示超时错,原因是DESC3的OWN位一直没能复位为0。没搞明白为什么,请大家指教。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107463
QQ
发表于 2021-11-5 08:24:06 | 显示全部楼层
Cache处理了吗
回复

使用道具 举报

12

主题

26

回帖

62

积分

初级会员

积分
62
 楼主| 发表于 2021-11-5 08:58:18 | 显示全部楼层
处理了,用注释掉的中断模式发送函数正常,只是偶尔会有丢包现象。函数如下:
err_t low_level_output(struct netif *netif, struct pbuf *p)
{
    uint32_t i=0;
    struct pbuf *q;
    err_t errval=ERR_OK;
    ETH_BufferTypeDef Txbuffer[ETH_TX_DESC_CNT];
    memset(Txbuffer, 0 , ETH_TX_DESC_CNT*sizeof(ETH_BufferTypeDef));
  
    for(q=p;q!=NULL;q=q->next)
    {
        if(i>=ETH_TX_DESC_CNT)       
            return ERR_IF;
   
        Txbuffer[i].buffer=q->payload;
        Txbuffer[i].len=q->len;
                                 
        if(i>0)
        {
            Txbuffer[i-1].next=&Txbuffer[i];
        }
   
        if(q->next == NULL)
        {
            Txbuffer[i].next=NULL;
        }
        i++;
    }

    TxConfig.Length = p->tot_len;
    TxConfig.TxBuffer=Txbuffer;
                       
    SCB_CleanInvalidateDCache();    //无效化并清除Dcache
       
    // errval = HAL_ETH_Transmit_IT(&ETH_Handle,&TxConfig);
    errval = HAL_ETH_Transmit(&ETH_Handle,&TxConfig, 20);
    if(HAL_OK != errval )
   {
        printf("low_level_output error: %d\r\n",errval);
    }

    return errval;
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107463
QQ
发表于 2021-11-5 11:25:55 | 显示全部楼层
szttg 发表于 2021-11-5 08:58
处理了,用注释掉的中断模式发送函数正常,只是偶尔会有丢包现象。函数如下:
err_t low_level_output(str ...

MPU配置和ETH的描述符和收发缓冲地址代码分享下
回复

使用道具 举报

12

主题

26

回帖

62

积分

初级会员

积分
62
 楼主| 发表于 2021-11-5 11:43:54 | 显示全部楼层
static void MPU_Config(void)
{
  MPU_Region_InitTypeDef MPU_InitStruct;

  /* Disable the MPU */
  HAL_MPU_Disable();

  /* Configure the MPU attributes as Device not cacheable
     for ETH DMA descriptors */
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.BaseAddress = 0x30040000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.SubRegionDisable = 0x00;  // 8 subregions enable
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);

  /* Enable the MPU */
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}

ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".ARM.__at_0x30040000"))); // 4 * 24
ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".ARM.__at_0x30040100"))); // 4 * 24
uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_RX_BUFFER_SIZE] __attribute__((section(".ARM.__at_0x30041000")));// 4 * 1536
回复

使用道具 举报

12

主题

26

回帖

62

积分

初级会员

积分
62
 楼主| 发表于 2021-11-5 12:28:37 | 显示全部楼层
eric2013 发表于 2021-11-5 11:25
MPU配置和ETH的描述符和收发缓冲地址代码分享下

找到问题了,是MPU的SIZE设置小了,没有包括发送描述符在内。现在改成4KB就可以了。
回复

使用道具 举报

2

主题

63

回帖

69

积分

初级会员

积分
69
发表于 2021-11-5 13:22:29 | 显示全部楼层
MPU_InitStruct.Size = MPU_REGION_SIZE_256B;  
这个位置要覆盖你接收buf以及发送buf
回复

使用道具 举报

12

主题

26

回帖

62

积分

初级会员

积分
62
 楼主| 发表于 2021-11-5 13:40:26 | 显示全部楼层
heluo1985 发表于 2021-11-5 13:22
MPU_InitStruct.Size = MPU_REGION_SIZE_256B;  
这个位置要覆盖你接收buf以及发送buf

应该是只把收发描述符覆盖在内就可以了。不能把接收buf放在里面。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107463
QQ
发表于 2021-11-6 09:19:26 | 显示全部楼层
szttg 发表于 2021-11-5 13:40
应该是只把收发描述符覆盖在内就可以了。不能把接收buf放在里面。

好的,后面还有什么问题再交流。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-2 23:30 , Processed in 0.288026 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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