MAC与PHY初识

现在我们从事嵌入式产品设计,要接触到很多网络的概念,例如以太网、wifi网、485网络、MBUS网络、CAN网络、Zigbee网络等等。我们在进行项目的深入研发过程中,就会注意到一个非常重要而且突出的问题,就是“单一网络中的主机的数目是有一定限制的,不能够无限增大”。
 图片
    在单一网络中,过多的主机会导致如下问题:
    a、带宽资源耗尽;
    b、每台设备都会浪费很多时间处理无关的广播数据;
    c、网络变的无法管理,任何错误都可能导致整个网络瘫痪;
    d、每台主机都可以监听到其它设备的通信。
图片

物理层主要定义物理介质性质,MAC子层负责与物理层进行数据交接,这两部分是与硬件紧密联系的,就嵌入式控制芯片来说,很多都内部集成了MAC控制器,完成MAC子层功能,所以依靠这部分功能是可以实现两个设备数据交换,而直接传输的数据就是MAC数据包,发送端封装好数据包,接收端则解封数据包得到可用数据,这样的一个模型与使用USART控制器实现数据传输是非常类似的。但如果将以太网运用在如此基础的功能上,完全是大材小用,因为以太网具有传输速度快、可传输距离远、支持星型拓扑设备连接等等强大功能。


                               TCP/IP混合参考模型

DP83848-PHY 以太网控制器 (网卡)(一个RMII/MII一个AUTO MDI/MDIX


DP83848配置图

KSZ8864交换机(2个AUTO MDI/MDIX  2个-MII/RMII)AUTO MDI/MDIX=MAC + PHY ;


交换机的工作原理
     当交换机收到数据时,它会检查它的目的MAC地址,然后把数据从目的主机所在的接口转发出去。交换机之所以能实现这一功能,是因为交换机内部有一个MAC地址表MAC地址表记录了网络中所有MAC地址与该交换机各端口的对应信息。某一数据帧需要转发时,交换机根据该数据帧的目的MAC地址来查找MAC地址表,从而得到该地址对应的端口,即知道具有该MAC地址的设备是连接在交换机的哪个端口上,然后交换机把数据帧从该端口转发出去

1.交换机根据收到数据帧中的源MAC地址建立该地址同交换机端口的映射,并将其写入MAC地址表中。
2.交换机将数据帧中的目的MAC地址同已建立的MAC地址表进行比较,以决定由哪个端口进行转发。
3.如数据帧中的目的MAC地址不在MAC地址表中,则向所有端口转发。这一过程称为泛洪(flood)。
4.
广播帧和组播帧向所有的端口转发


关于Lwip如何实现单网卡设置多IP 

 
在接口配置函数 static void ethernet_configure_interface(void)  再添加一个netif(我做的双ip,添加了一个): 
 

netif_add(&gs_net_if1, &x_ip_addr, &x_net_mask, &x_gateway, NULL,ethernetif_init, tcpip_input); 

netif_set_status_callback(&gs_net_if1, status_callback); netif_set_up (&gs_net_if1); 
 

因为是单个网卡ethernetif_init不用做改动,关键改动在 tcpip_input里调用的ethernet_input(p, inp);

ethernet_input(p, inp)完成对接收到的arp和ip包的处理; 

在ethernet_input(p, inp)添加一个filter 让接收到的每个包找到正确的netif; 
 

filter添加位置就是下面三行中红色的部分,这个filter需要自己写: 

#if LWIP_ARP_FILTER_NETIF 
  netif = LWIP_ARP_FILTER_NETIF_FN(p, netif, htons(type)); #endif /* LWIP_ARP_FILTER_NETIF*/
 
 

代码没在这个电脑上也比较简单就不贴了,这里说下我的思路: 

1. p->payload为 pbuf里存放有效数据的指针,也就是ip包和arp包的位置; 

2. ethhdr = (struct eth_hdr *)p->payload; ethhdr 是以太网头,14字节分别是目的mac、源mac 和包类型

type;type值0806为arp包, 0800

为ip包;要根据type类型对两种包分别处理,可以用switch语句;

 3. arp包和ip包 里面都包含了远端的目的ip,(参考arp包跟ip包的帧结构)拿这个远端的目的ip与自己建立的

两个netif的ip分别进行比较; 

switch (type){ case  0x0800: 

for (netif = netif_list; netif != NULL; netif = netif->next)  {if 

(netif_is_up(netif)) //可以不判断 

{ if (ip_addr_netcmp(dest, &(netif->ip_addr), &(netif->netmask))) break; }             } 

Break; 

case  0x0800: 

for (netif = netif_list; netif != NULL; netif = netif->next)  {if (netif_is_up(netif)) //可以不判断 

{if (ip_addr_netcmp(dest, &(netif->ip_addr), &(netif->netmask))) break; }             } 

Break; 

default: netif = netif_list; break; } 



找到在一个段内的IP就跳出循环,这样就找到了正确的netif;  改动完成ping两个ip都没问题,数据通讯也OK。 同样的方法可以再添加多个IP,也应该没问题的。


STM32F107+DP83848+KSZ8864(lwip协议栈)相当于:路由+交换机

要实现STM32F107与多路MII/RMII通讯需要解决IP冲突问题(lwip协议栈:路由)解决

物理地址MAC冲突问题(交换机)

MII/RMII接口 对接 MII/RMII接口

以太网接口(网卡接口) 对接 以太网接口(网卡接口)

可以不需要DP83848,ksz8864交换机有RMII接口直接对接STM32F107的RMII接口;加入

DP83848就给KSZ8864预留出两个RMII接口对接其他芯片。



  • 3
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值