极海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一下开发板,是连通的。

相关推荐
K成长日志2 天前
BLE链路层空口包--LE Uncoded PHY
物联网·嵌入式·蓝牙·iot·ble·无线·通信
凉、介2 天前
Virtio(三):Virtqueue 建立与 Buffer 提交
笔记·学习·嵌入式·arm·虚拟化·virtio
dddwjzx2 天前
嵌入式Linux C应用编程——Framebuffer应用编程
linux·嵌入式
国产化创客3 天前
Kindle完整越狱改造:从闲置泡面盖到Linux开发与智能家居终端
linux·运维·物联网·嵌入式·智能家居·智能硬件
浅止菌3 天前
嵌入式Linux崩溃分析实战:没有JTAG,怎么"空手"定位死机问题?
嵌入式
dddwjzx3 天前
嵌入式Linux C应用编程——tslib库的使用
linux·嵌入式
潘潘的嵌入式日记4 天前
CMIS的Alarm和Warning
嵌入式·翻译·告警·通信协议·英文·cmis
天空'之城4 天前
C 语言工业级通用组件 02:通用内存池
c语言·嵌入式·内存管理·内存池
浅止菌4 天前
说嵌入式不能用C++的,你们写过超过10万行的嵌入式项目吗?
嵌入式
dddwjzx4 天前
嵌入式Linux C应用编程——GPIO
linux·嵌入式