极海APM32F107V6 + DP83848CVV驱动网口(一)

一、实现目标

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

相关推荐
硬汉嵌入式5 小时前
国产新品:乐鑫推出三频ESP32-E22,兆易创新推出750MHz的GD32H7型号,极海推出M52内核的G32R430
乐鑫·兆易创新·极海
辰尘_星启1 天前
解决幽灵容器
linux·docker·容器·机器人·嵌入式
changzehai1 天前
Rust + VSCode + probe-rs搭建stm32-rs嵌入式开发调试环境
vscode·后端·stm32·rust·嵌入式·probe-rs
CQ_YM2 天前
ARM--SDK、led、beep与链接脚本
c语言·arm开发·嵌入式硬件·嵌入式
Jason_zhao_MR2 天前
YOLO5目标检测方案-基于米尔RK3576开发板
linux·人工智能·嵌入式硬件·目标检测·计算机视觉·目标跟踪·嵌入式
断水客2 天前
搭建ARM LINUX 内核 QEMU 仿真调试环境
linux·运维·arm开发·嵌入式
半条-咸鱼2 天前
C语言基础语法+STM32实践学习笔记 | 指针/寄存器核心应用
c语言·stm32·学习·嵌入式
明洞日记2 天前
【软考每日一练013】解析嵌入式网络数据库(NDB)架构
数据库·5g·嵌入式·软考·嵌入式实时数据库
乔碧萝成都分萝3 天前
二十四、Linux如何处理中断
linux·驱动开发·嵌入式