首页 > 其他分享 >ethcat开发记录 二

ethcat开发记录 二

时间:2023-01-28 18:12:32浏览次数:42  
标签:MACAddr HAL heth 记录 Init PHY 开发 ethcat ETH

SOEM移植到stm32f407+LAN8720硬件上的注意点

1、LAN8720的PHY地址问题。

2、LAN8720芯片在上电后要对复位引脚操作。

3、使能LAN8720的混杂模式,在新的HAL库里,这个设置包含在 ETH_MACFilterConfigTypeDef 结构体里,通过 HAL_ETH_SetMACFilterConfig函数配置。

完整代码:

/* ETH init function */
void MX_ETH_Init(void)
{

  /* USER CODE BEGIN ETH_Init 0 */
    //复位芯片
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET);
    HAL_Delay(10);
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);
  /* USER CODE END ETH_Init 0 */

   static uint8_t MACAddr[6];

  /* USER CODE BEGIN ETH_Init 1 */

  /* USER CODE END ETH_Init 1 */
  heth.Instance = ETH;
  MACAddr[0] = 0x00;
  MACAddr[1] = 0x80;
  MACAddr[2] = 0xE1;
  MACAddr[3] = 0x00;
  MACAddr[4] = 0x00;
  MACAddr[5] = 0x00;
  heth.Init.MACAddr = &MACAddr[0];
  heth.Init.MediaInterface = HAL_ETH_RMII_MODE;
  heth.Init.TxDesc = DMATxDscrTab;
  heth.Init.RxDesc = DMARxDscrTab;
  heth.Init.RxBuffLen = 1524;

  /* USER CODE BEGIN MACADDRESS */

  /* USER CODE END MACADDRESS */

  if (HAL_ETH_Init(&heth) != HAL_OK)
  {
    Error_Handler();
  }

  memset(&TxConfig, 0 , sizeof(ETH_TxPacketConfig));
  TxConfig.Attributes = ETH_TX_PACKETS_FEATURES_CSUM | ETH_TX_PACKETS_FEATURES_CRCPAD;
  TxConfig.ChecksumCtrl = ETH_CHECKSUM_IPHDR_PAYLOAD_INSERT_PHDR_CALC;
  TxConfig.CRCPadCtrl = ETH_CRC_PAD_INSERT;
  /* USER CODE BEGIN ETH_Init 2 */
      ETH_MACFilterConfigTypeDef pFilterConfig;
    HAL_ETH_GetMACFilterConfig(&heth, &pFilterConfig);
    pFilterConfig.PromiscuousMode=ENABLE;//使能混杂模式
    HAL_ETH_SetMACFilterConfig(&heth, &pFilterConfig);

    HAL_ETH_SetMDIOClockRange(&heth);
    
    //判断lan8720芯片是否连接
    uint32_t regvalue;
         if(HAL_ETH_ReadPHYRegister(&heth, PHY_ADDR, PHY_SPECIAL_MODES_REG, &regvalue) != HAL_OK)
         {
             /* Can't read from this device address continue with next address */
             return;
         }

//         if((regvalue & PHY_BASIC_STATUS_REG) == PHY_ADDR)
//         {
//             LOG_D("Found a phy, address:0x%02X", PHY_ADDR);
//         }
    //软复位
     if(HAL_ETH_WritePHYRegister(&heth, PHY_ADDR, PHY_BCR, PHY_RESET) == HAL_OK)
     {
         HAL_ETH_ReadPHYRegister(&heth, PHY_ADDR, PHY_SPECIAL_MODES_REG, &regvalue);

         uint32_t tickstart = HAL_GetTick();

         /* wait until software reset is done or timeout occured  */
         while(regvalue & PHY_RESET)
         {
           if((HAL_GetTick() - tickstart) <= 500)
           {
             if(HAL_ETH_ReadPHYRegister(&heth, PHY_ADDR, PHY_BCR, &regvalue) != HAL_OK)
             {
               return;
             }
           }
         }
     }

        //读lan8720工作模式,设置mac模块
     if(HAL_ETH_ReadPHYRegister(&heth, PHY_ADDR, PHY_BCR, &regvalue) == HAL_OK)
     {
         regvalue |= PHY_FULLDUPLEX_100M;
         HAL_ETH_WritePHYRegister(&heth, PHY_ADDR, PHY_BCR, regvalue);

         //eth_device_linkchange(&stm32_eth_device.parent, RT_TRUE);
               ETH_MACConfigTypeDef macconfig;
         HAL_ETH_GetMACConfig(&heth, &macconfig);
         macconfig.DuplexMode = ETH_FULLDUPLEX_MODE;
         macconfig.Speed = ETH_SPEED_100M;
         HAL_ETH_SetMACConfig(&heth, &macconfig);

     }
//     else
//     {
//         status = RT_ERROR;
//     }
    
    
    //以太网模块开始工作
    HAL_ETH_Start(&heth);
    
  /* USER CODE END ETH_Init 2 */

}

 

4、底层数据读写函数

//读写以太网数据的函数,被soem的nicdrv.c中的函数调用
int EthWrPacket(uint8_t* pBuff, int Len)
{
    uint32_t curidx=heth.TxDescList.CurTxDesc;
    HAL_StatusTypeDef HalStatus;
    TxBuffer.buffer=pBuff;
    TxBuffer.len=Len;
    TxConfig.TxBuffer=&TxBuffer;
    TxConfig.Length=Len;
    HalStatus = HAL_ETH_Transmit(&heth,&TxConfig,100);
    if (HalStatus == HAL_OK)  return Len;   // return the number of bytes readelse return -1;       // no packet received
} 

int EthRdPacket(void* pBuff)
{
    HAL_StatusTypeDef HalStatus; 
    HalStatus=HAL_ETH_ReadData(&heth,&pBuff);
    if (HalStatus == HAL_OK) return 1;else return -1;
}   

测试方法:调用 EthWrPacket 函数,发送任意数据,连接开发板与电脑,使用wireshark监视网络,可以收到开发板的数据。

LAN8720  

标签:MACAddr,HAL,heth,记录,Init,PHY,开发,ethcat,ETH
From: https://www.cnblogs.com/xxp918/p/17071035.html

相关文章

  • 1.1 移动开发技术简介
    本节将主要介绍一下移动开发技术的进化历程,了解一下Flutter技术出现的背景。笔者认为,了解一门新技术出现的背景是非常重要的,因为只有了解之前是什么样的,才能理解为什么会......
  • 记录解决方案(sqlserver篇)
    一个月的补卡次数不超过三次(即统计一个月内某人的补卡次数)表结构是某人一天内的四次打卡状态,这样是统计当月补卡的天数了(错误)selectcount(*)from[Proc_HR_Punch]wher......
  • Huaweicloud for 开发语言
    连续参加过几次华为云第三方满意度调研,我对华为云对开发者最不满意的一点就是对Top10常用语言的支持上很差,特别是对.NET的支持。经过连续多年(至少有3年了)的不断反馈,今天很......
  • WPF开发经验-实现一种机械泵控件
    一引入考虑实现一种机械泵控件。机械泵是工业中通常用来制造真空的一类设备,我们在绘制界面UI时希望可以生动形象地来表述一个机械泵,下面讲述了一种简单的实现。二 Me......
  • ISM Web组态软件的组态应用开发之组态界面简介
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录​​前言​​​​一、组件样式​​​​二、组件的事件​​​​三、组件的动作​​​​四、组件的动画......
  • 第二节 使用ISM Web组态软件利用采集到的Modbus设备数据开发组态应用
    系列文章目录​​第一节使用ISMWeb组态软件采集Modbus设备数据​​第二节使用ISMWeb组态软件利用采集到的Modbus设备数据开发组态应用文章目录​​系列文章目录​​​​......
  • 【网关开发】6.lua绑定委托(delegate)实现多播调用
    目录背景实现原理实现细节应用测试思考与总结背景在程序开发过程中有时会遇到事件流的问题,某一个结果会触发A、B、C等一系列动作。需要将各种事件注册给委托类(Delegate)。......
  • 测试开发之流量录制回放,压测有道
    1、JVM-sandbox-repeater介绍2、可以应用到哪些场景?3、安装部署《本文由测试开发攻城狮王月明投稿》一、JVM-sandbox-repeater介绍JVM-sandbox(沙箱)是阿里提供的开源......
  • linux yum 命令错误常见记录
    [root@localhost~]#wget-O/etc/yum.repos.d/CentOS-Base.repohttps://mirrors.aliyun.com/repo/Centos-7.repo......
  • 上古神兵,先天至宝,Win11平台安装和配置NeoVim0.8.2编辑器搭建Python3开发环境(2023最
    毫无疑问,我们生活在编辑器的最好年代,Vim是仅在Vi之下的神级编辑器,而脱胎于Vim的NeoVim则是这个时代最好的编辑器,没有之一。异步支持、更好的内存管理、更快的渲染速度、更......