一、实现目标
首先目标先是跟4G模块一样,数据上云吧,接着再看看其他功能。其次是通过这块开发板的外设,了解一下lwIP这个协议栈。对tcp/ip通信加深理解吧。
二、lwIP
1、简介
LwIP(Lightweight IP) 是一个为嵌入式系统设计的完整TCP/IP协议栈,它的特点是:
内存占用小:RAM使用可低至几十KB
模块化设计:可按需裁剪功能
无操作系统要求:可在裸机或RTOS上运行
支持主要协议:TCP、UDP、IPv4、DHCP、DNS等
2、编程接口
①、Raw/Callback API - 性能最优
设计理念 :事件驱动,基于回调机制
特点 :
内存占用最低,性能最好
与协议栈在同一线程中运行
编程复杂度较高
典型应用 :资源极其受限的系统,如无操作系统环境
②、NETCONN API - RTOS环境推荐
设计理念 :提供阻塞式的读写接口,类似标准socket API
特点 :
官方文档中称为:higher-level "sequential" API
特点:基于消息传递、阻塞式操作模型、更易于使用
适用场景:多线程RTOS环境、需要更清晰程序结构的应用
优势:提供open-read-write-close范式,应用程序可在独立线程中运行
③、Socket API - 标准兼容
设计理念 :兼容传统BSD套接字API
特点 :
基于Sequential API构建
为现有应用程序提供兼容性
便于端口现有代码
然后我看例程用的是Socket API,适合我这种初学吧,就是占用资源比较大
三、底层驱动
1、驱动芯片
DP83848CVV是德州仪器(TI)生产的一款单端口10/100Mbps以太网物理层(PHY)收发器。它充当着微控制器(如APM32F107内部的以太网MAC)与物理网络(如RJ-45接口和网线)之间的桥梁,负责将数字信号和网络上的模拟信号进行相互转换。
支持网络标准:兼容10BASE-T与100BASE-TX以太网标准
MAC接口:支持MII(Media Independent Interface,媒体独立接口,共16根数据信号线)、RMII(Reduced Media Independent Interface,精简媒体独立接口,共6根数据信号线)以及SNI(Serial Network Interface)接口,提供了与不同微控制器连接的灵活性。在资源紧张的嵌入式系统中,RMII因其引脚数量少而被广泛使用
2、使用引脚
看看原理图,我们用RMII的方式,用到哪几个引脚

上边有个虚框写得很清晰,不用RMII的时候,还需要用到虚框里边的几个。
引脚作用:
官方sdk里的好像跟原理图的引脚分配好像不太一样,稍后再确定。


3、数据传输过程:
①、发送数据过程 (MCU → PHY → 网络)
应用层数据 → Socket API → lwIP协议栈 → ETH MAC → RMII引脚 → PHY → 网络线缆
RMII发送时序
时钟周期: T1 T2 T3 T4 T5 T6 T7 T8
REF_CLK: ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
TX_EN: ────────────────────────────────────────
TXD1: D1 D3 D5 D7 D9 D11 D13 D15
TXD0: D0 D2 D4 D6 D8 D10 D12 D14
组合数据: D1D0 D3D2 D5D4 D7D6 D9D8 D11D10 D13D12
②、接收数据过程 (网络 → PHY → MCU)
网络线缆 → PHY → RMII引脚 → ETH MAC → lwIP协议栈 → Socket API → 应用层
时钟周期: T1 T2 T3 T4 T5 T6 T7 T8
REF_CLK: ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
CRS_DV: ────────────────────────────────────────
RXD1: D1 D3 D5 D7 D9 D11 D13 D15
RXD0: D0 D2 D4 D6 D8 D10 D12 D14
③、关键时序特性
时钟频率 :50MHz(RMII标准)
数据位宽 :2位并行
有效数据率 :100Mbps
时钟同步 :所有信号同步于REF_CLK上升沿
双工通信 :发送和接收可同时进行
四、例程

我看的是freertos的。
1、main函数

一个led任务一个驱动网口的任务
初始化硬件的io和以太网的MAC和DMA配置接口,还有lwip库的初始化
2、lwip库初始化
分4步,我加了注释

初始化完成后的框架:
应用层 → tcp_client_test.c
↓
Socket API → lwIP Socket接口
↓
协议栈层 → TCP/IP协议栈(tcpip_thread)
↓
网络接口 → ethernetif (netif结构体)
↓
硬件驱动 → DP83848 + APM32F107 MAC
↓
物理层 → 以太网硬件
3、tcp任务
这个例程是实现tcp回声客户端,测试可靠的数据传输
我加了一些注释看看


五、验证程序
我是路由器分别直连开发板和我的电脑,打开cmd ipconfig一下

其中ETH_IP_ADDR为开发板的ip地址,改成和路由器在同一网段就好了(需要选择这个网段中未被占用的ip,我设了123)
ETH_NET_MASK是子网掩码,直接复制
ETH_GATEWAY是网关地址,设成路由器的ip,即上边的默认网关

然后修改tcp_client_test.c中的服务器IP改为电脑的ip,即上边看到的ipv4地址

然后用网络调试助手,设置tcp Server 设好电脑的主机地址,端口跟例程一样用5005
打开串口
然后开发板的调试串口最后会打印连接成功

输出hello world 接收成功

再cmdping一下开发板,是连通的。
