硬汉嵌入式论坛

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

[以太网] H7的新版CMSIS-Driver以太网驱动全速94Mbps左右,比我之前修改的慢那么一丢丢

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115668
QQ
发表于 2019-10-12 01:23:21 | 显示全部楼层 |阅读模式

V7配套的CMSIS-Driver驱动,将对下面的两个函数做个条件编译,可以选择官方的,也可以选择我修正的。

下面是官方的,速度94Mbps
  1. /**
  2.   \fn          int32_t ReadFrame (uint8_t *frame, uint32_t len)
  3.   \brief       Read data of received Ethernet frame.
  4.   \param[in]   frame  Pointer to frame buffer for data to read into
  5.   \param[in]   len    Frame buffer length in bytes
  6.   \return      number of data bytes read or execution status
  7.                  - value >= 0: number of data bytes read
  8.                  - value < 0: error occurred, value is execution status as defined with \ref execution_status
  9. */
  10. static int32_t ReadFrame (uint8_t *frame, uint32_t len) {

  11.   if ((frame == NULL) && (len != 0U)) {
  12.     /* Invalid parameters */
  13.     return ARM_DRIVER_ERROR_PARAMETER;
  14.   }

  15.   if ((Emac.flags & EMAC_FLAG_POWER) == 0U) {
  16.     /* Driver not yet powered */
  17.     return ARM_DRIVER_ERROR;
  18.   }

  19.   if ((frame != NULL) && (Emac.rx_buf.buffer != NULL)) {
  20.     memcpy (frame, Emac.rx_buf.buffer, len);
  21.     Emac.rx_buf.buffer = NULL;
  22.   }
  23.   /* Return block back to EMAC-DMA */
  24.   HAL_ETH_BuildRxDescriptors (Emac.h);

  25.   return (len);
  26. }

  27. /**
  28.   \fn          uint32_t GetRxFrameSize (void)
  29.   \brief       Get size of received Ethernet frame.
  30.   \return      number of bytes in received frame
  31. */
  32. static uint32_t GetRxFrameSize (void) {
  33.   uint32_t len = 0;

  34.   /* Clean and invalidate data cache */
  35.   SCB_CleanInvalidateDCache();

  36.   if(HAL_ETH_GetRxDataBuffer(Emac.h, &Emac.rx_buf) == HAL_OK) {
  37.     if (HAL_ETH_GetRxDataLength (Emac.h, &len) == HAL_OK) {
  38.       return (len);
  39.     }
  40.   }
  41.   /* No data available */
  42.   return (0);
  43. }
复制代码



下面是我修改的,99Mbps
  1. /**
  2.   \fn          int32_t ReadFrame (uint8_t *frame, uint32_t len)
  3.   \brief       Read data of received Ethernet frame.
  4.   \param[in]   frame  Pointer to frame buffer for data to read into
  5.   \param[in]   len    Frame buffer length in bytes
  6.   \return      number of data bytes read or execution status
  7.                  - value >= 0: number of data bytes read
  8.                  - value < 0: error occurred, value is execution status as defined with \ref execution_status
  9. */
  10. ETH_BufferTypeDef rx_buf;
  11. static int32_t ReadFrame (uint8_t *frame, uint32_t len) {

  12.   if ((frame == NULL) && (len != 0U)) {
  13.     /* Invalid parameters */
  14.     return ARM_DRIVER_ERROR_PARAMETER;
  15.   }

  16.   if ((Emac.flags & EMAC_FLAG_POWER) == 0U) {
  17.     /* Driver not yet powered */
  18.     return ARM_DRIVER_ERROR;
  19.   }
  20.   
  21.    if (frame != NULL) {
  22.           SCB_CleanInvalidateDCache();
  23.       memcpy (frame, rx_buf.buffer, len);
  24.          
  25.   }

  26.   return (len);
  27. }

  28. /**
  29.   \fn          uint32_t GetRxFrameSize (void)
  30.   \brief       Get size of received Ethernet frame.
  31.   \return      number of bytes in received frame
  32. */
  33. static uint32_t GetRxFrameSize (void) {
  34.   uint32_t len;
  35.         
  36.   if(HAL_ETH_GetRxDataBuffer(Emac.h, &rx_buf) == HAL_OK)
  37.   {
  38.     HAL_ETH_GetRxDataLength(Emac.h, &len);

  39.     /* Build Rx descriptor to be ready for next data reception */
  40.     HAL_ETH_BuildRxDescriptors(Emac.h);
  41.          
  42.         return (len);
  43.   }
  44.   /* No data available */
  45.   return (0);
  46. }
复制代码



评分

参与人数 1金币 +10 收起 理由
龙之谷 + 10 很给力!

查看全部评分

回复

使用道具 举报

680

主题

3479

回帖

5544

积分

论坛元老

积分
5544
发表于 2019-10-12 10:25:17 | 显示全部楼层
貌似我还没有搞到这一步卧
回复

使用道具 举报

1

主题

380

回帖

383

积分

高级会员

积分
383
发表于 2019-10-12 10:31:00 | 显示全部楼层
&#160;&#160;/* Return block back to EMAC-DMA */
&#160;&#160;HAL_ETH_BuildRxDescriptors (Emac.h);

&#160;&#160;/* Clean and invalidate data cache */
&#160;&#160;SCB_CleanInvalidateDCache();
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2019-10-12 10:49:32 | 显示全部楼层
硬汉哥,咨询下,这个代码跑满速一帧数据是多少?如果一帧30byte,能到达这么高的传数速率?还有想问下是否测试过上位机下发到下位机,而后将数据返回。这个一个周期时间是多少吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115668
QQ
 楼主| 发表于 2019-10-12 12:26:37 | 显示全部楼层
yenext 发表于 2019-10-12 10:49
硬汉哥,咨询下,这个代码跑满速一帧数据是多少?如果一帧30byte,能到达这么高的传数速率?还有想问下是否 ...

30字节的周期的话,使用这个小软件可以方便的测试速度

分享个ping专用小软件ATKKPing,非常不错
http://www.armbbs.cn/forum.php?mod=viewthread&tid=95181



下面是我刚刚的测试,设置30个字节,测试1万多次

1.jpg
回复

使用道具 举报

11

主题

37

回帖

70

积分

初级会员

积分
70
发表于 2019-10-17 09:37:09 | 显示全部楼层
H7的网速确实很快啊。F4的网速不知道能达到多少啊?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-11 04:03 , Processed in 0.257834 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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