电子产业一站式赋能平台

PCB联盟网

搜索
查看: 354|回复: 0
收起左侧

STM32F103驱动ENC28J60实现裸机TCP/UDP通信方案

[复制链接]

1001

主题

1001

帖子

8805

积分

高级会员

Rank: 5Rank: 5

积分
8805
发表于 2024-11-2 08:01:00 | 显示全部楼层 |阅读模式

yx12ksqzpju64078633910.gif

yx12ksqzpju64078633910.gif

- |7 H! U5 Q! D9 f% b点击上方蓝色字体,关注我们
* s" Y3 P9 y3 h- C. Y- i' I8 f( g来源于粉丝提问。
! ?# O' l0 ]- i* G' {9 F* Q7 y# A: x8 J

d5yxkomrvpp64078634010.png

d5yxkomrvpp64078634010.png
" |' j* S8 ~9 L! B& [5 |
+ ^1 Y2 v- Z' r, i/ g$ O
这位朋友的项目中采用了STM32F103芯片和ENC28J60网络适配器,通过SPI实现通信,目标是开发不依赖OS的裸机程序,实现TCP和UDP协议的支持。
7 p3 |0 z5 \1 \5 v8 V! l
* l0 @6 R0 C2 `4 [  T  w' d, ^4 }0 N先说结论:HAL库不直接支持TCP/IP协议,因此需引入其他协议栈。
, p7 Q( |% X, v3 g7 ]7 s9 l1* k: w8 J" l2 g
问题 1:HAL库是否支持TCP/IP?
5 W$ u+ r/ {! Y  pSTM32的HAL库本身不直接支持TCP/IP协议。HAL库主要提供对STM32芯片外设(如GPIO、SPI、UART等)的基础控制接口,而不包含任何网络协议栈实现,因此无法直接用于TCP/IP通信。
% U; k; \& J5 F; n9 Y8 g2 b3 T! C" l+ O5 ^" V: k
HAL库的职责在于硬件层面上提供一种通用的、方便的硬件访问方法,但它并不涉及较高级别的通信协议,比如TCP/IP。7 I# X7 \, l2 p! a0 e, j- M
2
6 [0 r) z: g4 \7 _! c) z* O问题 2:如果HAL不支持TCP/IP,那么用什么实现?
6 f* G  ~! e% B/ o7 U0 y# Y6 Y' O, N由于HAL库不支持TCP/IP协议,您需要引入一个适用于裸机环境的TCP/IP协议栈。以下是几种常用方法:
% [: X' y) q& U" \4 D. G
& f5 m( q" [2 v: ?  M# BlwIP(Lightweight IP)协议栈
8 e/ L" M* |. w+ }+ O& F, @& Y9 o  A" }, e) |. P# W- H1 o
  • 优点:相对成熟,文档丰富,易于移植;开源,社区支持度高。
  • 缺点:内存占用相对较大(对于STM32F103的20KB SRAM需严格优化),配置相对复杂。
  • 简介:lwIP是一款开源、轻量级的TCP/IP协议栈,设计专注于资源受限的嵌入式系统。它支持TCP、UDP、ICMP等基本协议,是很多嵌入式网络开发的首选。
  • 适用性:lwIP可以在裸机模式下运行,并且已经被广泛用于STM32平台中。其架构模块化,允许选择性的编译和裁剪,使得它可以适应STM32F103这种资源有限的芯片。
  • 与ENC28J60适配:lwIP本身不直接支持ENC28J60,因此需要实现一个网卡驱动,将ENC28J60通过SPI接口接入到lwIP中。这需要在lwIP配置中定义ENC28J60的SPI驱动,主要包括发送、接收、初始化等函数的实现。
    0 \5 J0 A: r" d0 `" {% _; S$ l
    [/ol]. t9 p4 ~2 L; K5 x3 y

    / |7 J( P/ U: d* M* `uIP协议栈9 ?& y8 x# V/ X+ ]  P; U

    6 u2 P7 V: _  ]' t
  • 优点:内存占用极低,代码量少,便于移植。
  • 缺点:不支持多连接,协议实现较为简化,性能较低,主要适用于低速率、单连接的简单应用。
  • 简介:uIP是由Adam Dunkels开发的极简TCP/IP协议栈,专为低内存的嵌入式系统设计,目标是在几KB的RAM中实现基本的TCP/IP功能。
  • 适用性:uIP的代码量更小,占用的内存和计算资源少,非常适合STM32F103这种RAM有限的环境。
  • 与ENC28J60适配:由于uIP体积小巧,通常需要自行编写与ENC28J60的驱动接口代码。
  • 和lwIP类似,需要编写ENC28J60的SPI驱动层,实现uIP的接口。
    3 w. k- ], |% Q, X
    [/ol]
    $ y8 e- t9 c  F3 c$ q1 g
    3 V7 k1 c+ Y% ^& g
    自定义轻量级TCP/IP协议栈) M5 D# \! i7 p% |* W
    9 o3 x/ S3 v, q  m* l- ~( p7 R
  • 优点:极大地节省内存和资源,简化特定功能的实现。
  • 缺点:开发周期长,维护困难,不适合较为复杂的网络通信需求。
  • 简介:针对非常特殊的应用场景,可以选择编写一个定制的、极简TCP/IP协议栈,专注于特定的功能(例如仅支持UDP或仅支持单连接的TCP)。
  • 适用性:在内存极其紧张的情况下,可以手动编写仅包含所需功能的简单协议栈。
  • 与ENC28J60适配:这种方式需要完整的驱动和协议栈的实现,并非通用方案,因此通常不建议初次尝试网络编程时使用。
    ( ^$ F8 P4 C4 y+ W
    [/ol]( c( {8 I/ b& g/ w
    3. z5 Y' K6 N1 q+ x  {* s
    具体实现建议) `  ?1 o7 o. y; K5 ?1 v( v" h- q
    推荐方法8 L0 [4 y; ?( P+ R
    9 z* S5 U0 Y6 V3 r8 a1 ]
    基于STM32F103的资源限制,lwIP是较为合适的选择,但需要对配置进行裁剪,关闭不必要的功能(如DNS、DHCP等),以减小内存占用。
    $ q" Q5 l$ x0 I) w) j9 Q  m% e  ]8 T& T' N# R
    同时,需自行实现ENC28J60的驱动代码,建立SPI接口通信,确保数据收发的效率和稳定性。
    8 p2 q2 ^* U, t$ o& t' M2 F0 [0 a8 V4 Z+ }# m8 S; w, a
    * ~# C  y9 H! n8 s6 A$ h, }& {) c
    调试工具, E; s+ l1 g3 h, K3 G

    + S+ M) A2 D. z+ n: q& E2 K在开发和调试过程中,“网络调试助手”可以用于PC端测试下位机的TCP和UDP通信。
    # T0 ?7 a6 t" W* N: j1 e5 d% \
    4 y. d0 Q5 G( l# O" s可以通过这种方式测试lwIP或uIP栈的通信稳定性、数据吞吐量,并确保下位机的响应符合预期。
    ; F# p) h* K- Q- j
    8 S6 C) ~# J( Z" l* d

    anukql4ggvl64078634110.jpg

    anukql4ggvl64078634110.jpg

      l# e, q0 Q* G% L9 v9 D

    kcle00o0bke64078634210.gif

    kcle00o0bke64078634210.gif
    : y( g  s. h) r8 `) Y7 O
    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表