ethcat开发记录 二
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, ®value) != 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, ®value); 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, ®value) != HAL_OK)
{
return;
}
}
}
} //读lan8720工作模式,设置mac模块
if(HAL_ETH_ReadPHYRegister(&heth, PHY_ADDR, PHY_BCR, ®value) == 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监视网络,可以收到开发板的数据。
ethcat开发记录 二的更多相关文章
- Dokuwiki 二次开发记录
Dokuwiki 二次开发记录 [转]http://www.syyong.com/other/Dokuwiki-Secondary-Development-Record.html DokuWiki 是 ...
- SQL开发技巧(二)
本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列文章基于SQLServer系列,且版本为SQLServer2005及以上-- 文章系列目录 SQL开发技巧(一) SQL开 ...
- CozyRSS开发记录9-快速实现一个RSS解析器
CozyRSS开发记录9-快速实现一个RSS解析器 1.再读RSS标准 既然需要自己实现一个RSS解析器,那自然需要仔细的读一读RSS的标准文档.在网上随便找了两份,一份英文一份中文: http:// ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 修改及删除文章
上次做了显示文章列表,再实现修改和删除文章这部分内容就结束了,这次内容比较简单,由于做过了添加文章,修改文章非常类似,就是多了一个TryUpdateModel部分更新模型数据. 目录: ASP.N ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 全部文章列表
显示文章列表分两块,管理员可以显示全部文章列表,一般用户只显示自己的文章列表.文章列表的显示采用easyui-datagrid.后台需要与之对应的action返回json类型数据 目录 ASP.N ...
- ASP.NET MVC5 网站开发实践(二) Member区域 - 添加文章
上次把架构做好了,这次做添加文章.添加文章涉及附件的上传管理及富文本编辑器的使用,早添加文章时一并实现. 要点: 富文本编辑器采用KindEditor.功能很强大,国人开发,LGPL开源,自己人的好东 ...
- Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
- MS CRM 2011的自定义和开发(11)——插件(plugin)开发(二)
http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2339490.html MS CRM 2011的自定义和开发(11)——插件(plugin ...
- SQL开发技巧(二) 【转】感觉他写的很好
本文转自: http://www.cnblogs.com/marvin/p/DevelopSQLSkill_2.html 本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列 ...
- Lucene.Net 2.3.1开发介绍 —— 二、分词(五)
原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(五) 2.1.3 二元分词 上一节通过变换查询表达式满足了需求,但是在实际应用中,如果那样查询,会出现另外一个问题,因为,那样搜索,是只 ...
随机推荐
- VS Code编写stm32
说明 virtual code实现编辑功能,其有强大的代码提示.代码阅读功能. 通过bat文件,通过cmd编译.下载,具体下载器设置仍需在keil软件中设置 具体代码调试仍需在keil软件下 项目配置 ...
- 个人css样式
<style> .div1{ width:200px; height:100px; border:1px solid #dddddd; transition:all 0.5s linear ...
- Delphi中Stringlist的自定义排序(将函数地址做为参数)
近日,在编制一个程序过程,因为数据量较小,就使用了stringlist来暂存数据.在使用过程中,遇到了一个问题.Stringlist字符串列表的默认排序方法是按ASCII码的方式进行排序,如3,10, ...
- CoreText学习笔记
CoreText是Apple系统的文字渲染引擎. 我们先看一个字符的字形图,了解一下一个字形包含的部分: 它的坐标系为窗口的左下角为视图的原点(跟Mac系统一样的坐标系),而iOS系统的坐标系为窗口的 ...
- 使用FormData上传图片
document.querySelector('.file').addEventListener('change', function(e) { //1.可以通过this拿到这个file的DOM元素 ...
- 内存参数kernel.shmmax和kernel.shmall的含义
安装oracle数据库的时候,都要设置这个内核参数 vi /etc/sysctl.conf kernel.panic_on_oops = 1 1:程序出错,不继续运行 0:程序出错,继续运行 kern ...
- 关于邮箱怎么验证是不是真实的企业邮箱(java汉字和英文呼唤)
企业邮箱的域名一般都是zhangsan@公司域名,或者zhang_san@公司域名这种形式.这里我只列举zhangsan@公司域名这种形式. 公司要我做一个企业邮箱的模糊匹配和验证,刚接到以为很难.结 ...
- Excel下载乱码
1.前端:一定不可以以ajax的请求方式,不然会弹出乱码. 要使用<a href="../Ajax/AjaxPrint.ashx?action=PrintClick&Tid=& ...
- jmeter取样器之KafkaProducerSampler(往kafka插入数据)
项目背景 性能测试场景中有一个业务场景的数据抽取策略是直接使用kafka队列,该场景需要准备的测试数据是kafka队列里的数据,故需要实现插入数据到kafka队列,且需要实现控制每分钟插入多少条数据. ...
- curl:(6) Could not resolve host: baidu.com; Unknown error
问题描述 有段时间没操作CentOS了,然后启动Virtualbox中的CentOS之后,发现网络不通,ping baidu.com 出现错误 curl:(6) Could not resolve h ...