一、实现目标

首先目标先是跟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一下开发板,是连通的。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐