草庐IT

【lwIP(第一章)】lwIP入门

Eiker_3169 2023-09-20 原文

lwIP是一个小型开源的TCP/IP协议栈(阉割的TCP/IP协议)
lwIP适用于:云台接入、无线网关、远程模块、工控控制器、嵌入式NAT无线路由器、网络摄像头………


目录

一、TCP/IP协议栈

1. TCP/IP协议栈结构体


2. TCP/IP协议栈的数据封装与解封装

封装:数据添加各层协议的首部;解封装:在各层间除去自层的首部


二、lwIP结构


三、MAC简介

1. MAC内核的特性:

 ① 传输速率:支持外部PHY接口实现10/100Mbit/s数据传输速率

 ② 协议标准:符合IEEE802.3/3u的MII和RMII接口与快速以太网PHY通信

 ③ 工作模式:支持全双工和半双工操作

 ④ 站管理接口:支持通过MDIO接口配置和管理PHY设备

 ⑤ 其他特性


2. ST的ETH框架

STM32自带有10/100Mbit/s的以太网MAC内核,它提供地址及媒体访问的控制方式


2.1 SMI站管理接口

允许应用程序通过时钟线和数据线访问任意PHY寄存器,最多支持32个PHY访问

● MDC:周期时钟引脚(最大频率为:2.5MHz)

● MDIO:数据输入/输出比特流


2.1.1 SMI帧格式


● PADDR:PHY地址(00_1F)

● RADDR:寄存器地址(00_1F)

● 数据位:16位数据位(PHY寄存器都是16位的)


2.2 介质接口MII、RMII

用于MAC与外接的PHY互联,支持10/100Mbit/s数据传输模式



2.2.1 MII、RMII比较

● 相同的特性:

​  ① 支持外部PHY接口实现10/100Mbit/s数据传输速率

​  ② 符合IEEE802.3协议标准

● 不同的特性:

​  ① 引脚数量

​  ② 参考时钟

​  ③ 发送的位宽


2.2.2 MII、RMII引脚


● 介质MII接口所需要引脚数量为16个,而RMII接口所需要的引脚数量为9个

● MII介质接口的TX_CLK和RX_CLK由PHY芯片提供,它们会让MAC内核以这个时钟采集收发数据

● RMII介质接口的REF_CLK, MAC内核以这个时钟采集收发数据

注意:RX_ER和RX_DV是用来检测以太网帧是否有效性,而CRS和COL以及CRS_DV在全双工模式下无效


2.2.3 MII、RMII参考时钟


● 介质MII的参考时钟来源有两个:MCO输出25MHz以及外部晶振输出25MHz

● 介质RMII的参考时钟来源有两个:MCO经过倍频PLL输出50MHz以及外部晶振输出50MHz(必须同时提供PHY和MAC)

注意:MII接口中的TX_CLK和RX_CLK时钟是根据数据传输速率挂钩,10Mbit/s:2.5MHz;100Mbit/s:25MHz


2.2.4 MII、RMII介质接口收发位宽

介质MII接口一个周期收发位宽为4位数据,而接口一个周期RMII收发位宽为2位数据


四、PHY简介

从硬件上来说,一般的PHY芯片为模数混合电路,负责接收电、光这类模拟信号,经过解调和A/D转换后通过MII/RMII接口将信号交给MAC内核处理。


1. LAN8720A与YT8512C

它们都是低功耗的10/100M以太网PHY层芯片,支持MII以及RMII接口与以太网MAC层通信。
支持Auto MDIX自动翻转功能,无需更换网线即可将连接更改为直连或交叉连接。

主要特性:

 ① 自动翻转:支持Auto MDIX自动翻转功能,例如:对等线与交叉线连接。

 ② 多种接口:支持MII和RMII介质访问接口。

 ③ 传输速率:支持10/100Mbit/s的传输速率。

 ④ 低功耗:支持低功耗运行。


2. PHY地址的设置

过PHY地址访问指定的PHY芯片,简称:PHY芯片的标识。


2.1 LAN8720A的PHY地址设置



PHYAD0默认的引脚为低电平,所以PHY地址为0x00


2.2 YT8512C的PHY地址设置



3. RMII模式选择

LAN8720A和YT8512C在RMII介质接口下延伸出两个连接方式。



3.1 RMII模式设置(LAN8720A)

这两种模式是由PHY的2号引脚电平决定,为0:Out模式(REF_CLK输出时钟),为1:In模式(中断)


3.2 RMII模式设置(YT8512C)

这两种模式是由PHY的8和12号引脚电平决定,如果8号引脚拉高以及12号引脚拉低,则硬件电路选择RMII2模式。


4. PHY寄存器

LAN8720A和YT8512C都具有32个寄存器,每一个寄存器都是16位


● 前16个寄存器用于配置PHY,而后16个寄存器是使用判断网络参数的(双工、网速)

● 因为前16个寄存器都是类似的,所以ST已经把主要框架搭建好了,用户只负责设置双工和网速参数即可


4.1 特殊功能寄存器

通过确认网速及双工模式来设置BCR寄存器的bit8和bit13

/* stm32f4/f7/h7xx_hal_conf.h */
#define PHY_SR 			  ((uint16_t)0x0010) 		/*!< PHY status register Offset */ 
#define PHY_SPEED_STATUS  ((uint16_t)0x0002) 		/*!< PHY Speed mask */ 
#define PHY_DUPLEX_STATUS ((uint16_t)0x0004)		/*!< PHY Duplex mask */

每一个PHY的特殊功能寄存器都不一样,需要根据相关的手册来确定


4.1.1 LAN8720A特殊功能寄存器


4.1.2 YT8512C特殊功能寄存器


5. 选择PHY芯片

有关【lwIP(第一章)】lwIP入门的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  3. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  4. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  5. ruby-on-rails - CarrierWave - PDF - 只选择第一页 - 2

    我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful

  6. ruby - 如何跳过 CSV 文件的第一行并将第二行作为标题 - 2

    有没有办法跳过CSV文件的第一行,让第二行作为标题?我有一个CSV文件,第一行是日期,第二行是标题,所以我需要能够在遍历它时跳过第一行。我尝试使用slice但它会将CSV转换为数组,我真的很想将其读取为CSV,以便我可以利用header。 最佳答案 根据您的数据,您可以使用另一种方法和skip_lines-option此示例跳过所有以#开头的行require'csv'CSV.parse(DATA.read,:col_sep=>';',:headers=>true,:skip_lines=>/^#/#Markcomments!)do|

  7. arrays - 在一行中选择数组的第一个和最后一个元素 - 2

    我的任务是从数组中选择最高和最低的数字。我想我很清楚我想做什么,但只是努力以正确的格式访问信息以满足通过标准。defhigh_and_low(numbers)array=numbers.split("").map!{|x|x.to_i}array.sort!{|a,b|ba}putsarray[0,-1]end数字可能看起来像"80917234100",要通过,我需要输出"9234"。我正在尝试putsarray.first.last,但一直无法弄明白。 最佳答案 有Array#minmax完全满足您需要的方法:array=[80,

  8. ruby-on-rails - Ruby 或 Rails 有只将第一个字符大写的方法吗? - 2

    或者好像我必须自己写方法?(保持DHA不变):ruby-1.9.2-p180:001>s='omega-3(DHA)'=>"omega-3(DHA)"ruby-1.9.2-p180:002>s.capitalize=>"Omega-3(dha)"ruby-1.9.2-p180:003>s.titleize=>"Omega3(Dha)"ruby-1.9.2-p180:005>s[0].upcase+s[1..-1]=>"Omega-3(DHA)" 最佳答案 如果我的回答只是垃圾,我深表歉意(我不做ruby)。但我相信我已经为您找到了答

  9. ruby - gsub 删除第一个逗号前的所有内容 - 2

    我有这个字符串:auteur="comtedeFlandreetHainaut,Baudouin,Jacques,Thierry"我想删除第一个逗号之前的所有内容,即在这种情况下保留“Baudouin,Jacques,Thierry”试过这个:nom=auteur.gsub(/.*,/,'')但这会删除最后一个逗号之前的每个逗号,只保留“Thierry”。 最佳答案 auteur.partition(",").last#=>"Baudouin,Jacques,Thierry" 关于rub

  10. ruby-on-rails - Order Hash 并删除第一个键值对 - 2

    我有一个以时间戳为键的哈希。hash={"2016-05-31T22:30:58+02:00"=>{"path"=>"/","method"=>"GET"},"2016-05-31T22:31:23+02:00"=>{"path"=>"/tour","method"=>"GET"},"2016-05-31T22:31:05+02:00"=>{"path"=>"/contact_us","method"=>"GET"}}我订购了这个系列并得到了第一双这样的:hash.sort_by{|k,_|k}.first.first但是我该如何删除它呢?删除方法requiresyou知道key的准确

随机推荐