物理层主要定义物理介质性质,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 ;
1.交换机根据收到数据帧中的源MAC地址建立该地址同交换机端口的映射,并将其写入MAC地址表中。
2.交换机将数据帧中的目的MAC地址同已建立的MAC地址表进行比较,以决定由哪个端口进行转发。
3.如数据帧中的目的MAC地址不在MAC地址表中,则向所有端口转发。这一过程称为泛洪(flood)。
4.广播帧和组播帧向所有的端口转发。
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_NETIF1. 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接口对接其他芯片。