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
 

ethcat开发记录 二的更多相关文章

  1. Dokuwiki 二次开发记录

    Dokuwiki 二次开发记录 [转]http://www.syyong.com/other/Dokuwiki-Secondary-Development-Record.html DokuWiki 是 ...

  2. SQL开发技巧(二)

    本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列文章基于SQLServer系列,且版本为SQLServer2005及以上-- 文章系列目录 SQL开发技巧(一) SQL开 ...

  3. CozyRSS开发记录9-快速实现一个RSS解析器

    CozyRSS开发记录9-快速实现一个RSS解析器 1.再读RSS标准 既然需要自己实现一个RSS解析器,那自然需要仔细的读一读RSS的标准文档.在网上随便找了两份,一份英文一份中文: http:// ...

  4. ASP.NET MVC5 网站开发实践(二) Member区域 - 修改及删除文章

    上次做了显示文章列表,再实现修改和删除文章这部分内容就结束了,这次内容比较简单,由于做过了添加文章,修改文章非常类似,就是多了一个TryUpdateModel部分更新模型数据.   目录: ASP.N ...

  5. ASP.NET MVC5 网站开发实践(二) Member区域 - 全部文章列表

    显示文章列表分两块,管理员可以显示全部文章列表,一般用户只显示自己的文章列表.文章列表的显示采用easyui-datagrid.后台需要与之对应的action返回json类型数据   目录 ASP.N ...

  6. ASP.NET MVC5 网站开发实践(二) Member区域 - 添加文章

    上次把架构做好了,这次做添加文章.添加文章涉及附件的上传管理及富文本编辑器的使用,早添加文章时一并实现. 要点: 富文本编辑器采用KindEditor.功能很强大,国人开发,LGPL开源,自己人的好东 ...

  7. Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  8. MS CRM 2011的自定义和开发(11)——插件(plugin)开发(二)

    http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2339490.html MS CRM 2011的自定义和开发(11)——插件(plugin ...

  9. SQL开发技巧(二) 【转】感觉他写的很好

    本文转自: http://www.cnblogs.com/marvin/p/DevelopSQLSkill_2.html 本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列 ...

  10. Lucene.Net 2.3.1开发介绍 —— 二、分词(五)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(五) 2.1.3 二元分词 上一节通过变换查询表达式满足了需求,但是在实际应用中,如果那样查询,会出现另外一个问题,因为,那样搜索,是只 ...

随机推荐

  1. mybatis中xml新增一条数据获取自增id

    在insert的标签里加两个属性:useGeneratedKeys="true"         keyProperty="patentId"   ,这个key ...

  2. 利用XtraBackup实现PXC数据库的热备份

    PXC 容器中安装XtraBackup apt-get updata 1.在宿主机创建数据库卷,将数据卷映射到某个数据库的节点上 docker volume create backup 2.暂停nod ...

  3. css 卡片hover效果

    .card { height: 430px; width: 100%; background:#ffffff; border:1px solid #eaeefb; border-radius:5px; ...

  4. python_test_0001_base_string

    #!/usr/bin/python # -*- coding: UTF-8 -*- from lib_001_decorator_log_funcname import decorator_log_f ...

  5. path.resolve和path.resolve的用法

    前言:要搞清楚path.join()和path.resolve的具体作用,最好自己搞个文件,用node跑一遍去测试一下.只有自己亲自动手实践了,才知道具体是怎么回事,才能真正的理解 一.path.jo ...

  6. xss-labs

    level1 <h1 align=center>欢迎来到level1</h1> <h2 align=center>欢迎用户te111</h2><c ...

  7. 微信小程序-自定义tabbar配置及注意事项

    1.选中要创建tabbar组件的目录,右键选定新建Componen 2.然后编写wxml代码和wxss样式 <cover-view class="tab-bar"> & ...

  8. git切换到某个tag

    git checkout tags/some_tag_name -b a_new_branch_name

  9. C++并发编程实战(第2版)

    这本书翻译的烂,写的也不好. 甚至不如看cppreference. 这本书英文叫C++ Concurrency in Action, Second Edition 英文原版也是垃圾,C++实在没有写得 ...

  10. (K8s学习笔记七)Pod的升级和回滚

    1.Deployment的升级 示例:滚动升级busybox-deployment容器 apiVersion: apps/v1 kind: Deployment metadata: name: bus ...