电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

563

主题

563

帖子

3387

积分

四级会员

Rank: 4

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

yx12ksqzpju64078633910.gif

yx12ksqzpju64078633910.gif

& j  z8 z2 `: X7 F$ J) S点击上方蓝色字体,关注我们
, e+ \! ~* ?9 o来源于粉丝提问。
0 q7 Z0 F  B, L4 r/ h+ y; H, W0 y0 K- c

d5yxkomrvpp64078634010.png

d5yxkomrvpp64078634010.png

5 N& P% M. U. M) ^/ F" e8 d; t9 t( d6 l1 Z5 x  I9 R. B
这位朋友的项目中采用了STM32F103芯片和ENC28J60网络适配器,通过SPI实现通信,目标是开发不依赖OS的裸机程序,实现TCP和UDP协议的支持。
- F+ E9 s+ J# w
4 y0 B0 X; X( v: n先说结论:HAL库不直接支持TCP/IP协议,因此需引入其他协议栈。
/ G6 g' q% A# l* i8 @  A8 R8 m/ y1/ E6 Z1 f1 [8 k% h8 m6 q: H
问题 1:HAL库是否支持TCP/IP?
% }7 o0 l, }2 f" D2 n4 ZSTM32的HAL库本身不直接支持TCP/IP协议。HAL库主要提供对STM32芯片外设(如GPIO、SPI、UART等)的基础控制接口,而不包含任何网络协议栈实现,因此无法直接用于TCP/IP通信。
1 M3 w( ]( |  S: t% H% B% f. @7 j
' ^5 m* A* e) m6 C3 {6 ~. j- ?HAL库的职责在于硬件层面上提供一种通用的、方便的硬件访问方法,但它并不涉及较高级别的通信协议,比如TCP/IP。& Q( U' H; C: Z4 B
2
" b1 ]: I$ B# C/ K问题 2:如果HAL不支持TCP/IP,那么用什么实现?
' U. |4 J2 W" z  N3 B$ x由于HAL库不支持TCP/IP协议,您需要引入一个适用于裸机环境的TCP/IP协议栈。以下是几种常用方法:4 G$ _' K/ P5 ?7 ~& A; |

- e- {! ^7 k0 d  g* _lwIP(Lightweight IP)协议栈$ V; |1 `. }' w5 v8 ?  f. O

0 a# F3 @' l+ E# l! k# g
  • 优点:相对成熟,文档丰富,易于移植;开源,社区支持度高。
  • 缺点:内存占用相对较大(对于STM32F103的20KB SRAM需严格优化),配置相对复杂。
  • 简介:lwIP是一款开源、轻量级的TCP/IP协议栈,设计专注于资源受限的嵌入式系统。它支持TCP、UDP、ICMP等基本协议,是很多嵌入式网络开发的首选。
  • 适用性:lwIP可以在裸机模式下运行,并且已经被广泛用于STM32平台中。其架构模块化,允许选择性的编译和裁剪,使得它可以适应STM32F103这种资源有限的芯片。
  • 与ENC28J60适配:lwIP本身不直接支持ENC28J60,因此需要实现一个网卡驱动,将ENC28J60通过SPI接口接入到lwIP中。这需要在lwIP配置中定义ENC28J60的SPI驱动,主要包括发送、接收、初始化等函数的实现。+ ]! f5 n2 r2 W4 x4 t
    [/ol]
    $ B7 n) f" g3 B4 ]% j! C1 p% o

    , k3 {% m: ]( D7 auIP协议栈3 U, R% ?7 f! y, `. u: j$ X

    * m* V5 s6 z+ z+ l$ A6 f
  • 优点:内存占用极低,代码量少,便于移植。
  • 缺点:不支持多连接,协议实现较为简化,性能较低,主要适用于低速率、单连接的简单应用。
  • 简介:uIP是由Adam Dunkels开发的极简TCP/IP协议栈,专为低内存的嵌入式系统设计,目标是在几KB的RAM中实现基本的TCP/IP功能。
  • 适用性:uIP的代码量更小,占用的内存和计算资源少,非常适合STM32F103这种RAM有限的环境。
  • 与ENC28J60适配:由于uIP体积小巧,通常需要自行编写与ENC28J60的驱动接口代码。
  • 和lwIP类似,需要编写ENC28J60的SPI驱动层,实现uIP的接口。' y( Q) A3 y2 r' J: [# D2 e
    [/ol]1 A- F1 M1 O: _( h3 W

    % D, F5 R* f' g+ \  r6 s* B自定义轻量级TCP/IP协议栈
    0 ~; J, R6 s% }4 J3 o* Z8 o, ^: o1 Q. M" Q0 Y* f# n
  • 优点:极大地节省内存和资源,简化特定功能的实现。
  • 缺点:开发周期长,维护困难,不适合较为复杂的网络通信需求。
  • 简介:针对非常特殊的应用场景,可以选择编写一个定制的、极简TCP/IP协议栈,专注于特定的功能(例如仅支持UDP或仅支持单连接的TCP)。
  • 适用性:在内存极其紧张的情况下,可以手动编写仅包含所需功能的简单协议栈。
  • 与ENC28J60适配:这种方式需要完整的驱动和协议栈的实现,并非通用方案,因此通常不建议初次尝试网络编程时使用。
    2 T4 }- ^  t7 Q/ j1 I8 v( Q
    [/ol]# V/ O7 k" G7 a
    3
    7 G: H& N6 T  u+ R. I具体实现建议; o/ l9 W% O7 g& P  C& y& s
    推荐方法
    ' M0 g8 y" E0 q6 U; }: ~& r7 a  G' G* ~+ Q3 N- M
    基于STM32F103的资源限制,lwIP是较为合适的选择,但需要对配置进行裁剪,关闭不必要的功能(如DNS、DHCP等),以减小内存占用。
    " o& b( r; c8 Q8 [' B+ D# d3 M( R& Y+ s/ H+ H# ?8 I9 U3 n' r: U
    同时,需自行实现ENC28J60的驱动代码,建立SPI接口通信,确保数据收发的效率和稳定性。9 T& Q( @; e& x

    5 X$ p* l9 b0 v5 \2 l

    ( S! [* z# h) c" L5 y# F调试工具
    ) x1 q+ \0 N  w; ~: v
    $ [1 w+ s7 `- D1 I; t9 T, h0 w在开发和调试过程中,“网络调试助手”可以用于PC端测试下位机的TCP和UDP通信。! o# `2 ~( H) j' b6 s4 I5 p
    2 j& S9 d/ L/ X5 k$ C
    可以通过这种方式测试lwIP或uIP栈的通信稳定性、数据吞吐量,并确保下位机的响应符合预期。1 q- z' y0 I* f0 c+ W! Q

    1 F0 y* s) C  q  \3 Q' L1 I

    anukql4ggvl64078634110.jpg

    anukql4ggvl64078634110.jpg

    3 v% a& M/ r7 x

    kcle00o0bke64078634210.gif

    kcle00o0bke64078634210.gif

    " o% _+ _/ h. F1 O点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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