#ethernet #spi-interface #stm32 #stm32f4xx #micro-controller #eth

无需std enc424j600

适用于ENC424J600以太网控制器(具有SPI接口)的嵌入式Rust以太网驱动程序

3个版本 (有破坏性)

0.4.0 2024年7月5日
0.3.0 2023年7月3日
0.1.0 2021年1月18日

#451 in 嵌入式开发

每月25次下载
用于 booster

BSD-2-Clause

63KB
599

ENC424J600 驱动程序

一般说明

ENC424J600以太网控制器模块支持以下接口之一进行操作:串行外设接口(SPI)或并行从端口(PSP)。此Rust库支持所有与Rust embedded-hal crate兼容的嵌入式系统使用SPI。

在ENC424J600上,INTn/SPISEL引脚与一个中断功能(INTn)和一个接口选择功能(SPISEL)复用。在上电期间,为了选择SPI作为接口,INTn/SPISEL需要将逻辑高电平保持1-10微秒,由ENC424J600外部驱动。在ENC424J600初始化后,同一个引脚可以由ENC424J600驱动,用来指示中断发生(逻辑低电平)或空闲(逻辑高电平)。因此,在微控制器一侧,应该根据设计选择引脚的驱动模式:如果启用中断,则应将其设置为三态,否则设置为推挽

为了帮助用户,我们提供了一个nix-shell环境和一系列Shell脚本,用于执行某些任务,例如创建用于调试STM32微控制器的tmux会话,以及编译和运行基于STM32的示例。

STM32F407示例说明

目前,提供的示例适用于使用Rust stm32f4xx-hal crate的STM32F4xx微控制器。这些示例假设SPI1端口连接到以太网模块,且GPIO PA1引脚连接到其SPISEL引脚。由于不涉及中断,GPIO PA1被配置为推挽输出,以仅初始化控制器。程序输出通过ITM激励端口0记录。

示例

无限ping - tx_stm32f407

此程序演示了STM32F407板上的以太网TX功能。一旦加载和初始化,每100毫秒发送(广播)一个特定的ping包。此类包具有以下属性

  • 目标MAC地址:ff-ff-ff-ff-ff-ff
  • 源MAC地址:08-60-6e-44-42-95
  • 目标IP地址:192.168.1.231
  • 源IP地址:192.168.1.100
  • 帧长度(字节):64

如何操作

  1. 将STM32F407设备连接到计算机。无需更改任何代码,您可以使用STLink V2调试器。

  2. 创建一个用于调试的tmux会话

    $ nix-shell
    [nix-shell]$ run-tmux-env
    
  3. tmux会话准备就绪时,在右上角面板中编译并运行示例程序

    [nix-shell]$ tx_stm32f407
    
  4. 观察左面板的输出。如果您想手动调试,运行run-help以查看所有可用命令的列表。

预期输出

(注意:MAC地址仅作为示例。)

Eth TX Pinging on STM32-F407 via NIC100/ENC424J600
Ethernet initialised.
MAC Address = 04-91-62-3e-fc-1e
Promiscuous Mode ON
Sending packet (len=64): dest=ff-ff-ff-ff-ff-ff src=08-60-6e-44-42-95 data=08060001 08000604 ...
Packet sent
Sending packet (len=64): dest=ff-ff-ff-ff-ff-ff src=08-60-6e-44-42-95 data=08060001 08000604 ...
Packet sent
...

TCP回显与问候 - tcp_stm32f407

此程序演示了在STM32F407板上使用smoltcp实现TCP连接。一旦加载并初始化,将在特定的IPv4地址上打开两个TCP套接字。这些套接字是

  1. 回显端口 - 1234
    • 该套接字接收所有传入TCP数据包的原始数据,并将其打印到输出中。
    • 请注意,此套接字的超时时间为10秒。
  2. 问候端口 - 4321
    • 该套接字在该端口上等待单个传入TCP数据包,并发送包含问候文本的TCP数据包到该端口。
    • 请注意,一旦发送了问候,套接字将立即关闭。直到发起者从端口断开连接,控制器接收到的进一步数据包将被丢弃。

如何操作

  1. 将STM32F407设备连接到计算机。无需更改任何代码,您可以使用STLink V2调试器。

  2. 创建一个用于调试的tmux会话

    $ nix-shell
    [nix-shell]$ run-tmux-env
    
  3. tmux会话准备就绪时,在右上角面板中编译并运行示例程序。默认IP地址是192.168.1.77,您可以在源文件examples/tcp_stm32f407.rs中编辑它。

    [nix-shell]$ tcp_stm32f407
    
  4. 要测试TCP端口,切换到底右面板(使用Ctrl+B,然后按箭头键)并使用NetCat(nc)等工具

    $ nc <ip> <port-number>
    

    可以运行多个Netcat实例以同时使用所有端口。使用Ctrl+C手动断开端口(特别是对于问候端口)。

  5. 观察左面板的输出。如果您想手动调试,运行run-help以查看所有可用命令的列表。

预期输出

(注意:下面的MAC地址和时间戳仅作为示例。)

初始状态下的ITM输出

Eth TCP Server on STM32-F407 via NIC100/ENC424J600
Ethernet initialised.
Timer initialised.
MAC Address = 04-91-62-3e-fc-1e
TCP sockets will listen at 192.168.1.77/24
[0.0s] Listening to port 1234 for echoing, time-out in 10s
[0.0s] Listening to port 4321 for greeting, please connect to the port

用户连接到端口1234并使用以下命令发送两个数据包

$ nc 192.168.1.77 1234
Hello World!
Bye World!

以下内容附加到ITM输出

[12.950s] Received packet: Ok("Hello world!\n")
[19.0s] Received packet: Ok("Bye world!\n")

用户然后使用以下命令连接到端口4321,并立即在其控制台收到以下消息

$ nc 192.168.1.77 4321
Welcome to the server demo for STM32-F407!

以下内容附加到ITM输出

[24.200s] Greeting sent, socket closed

用户在10秒内没有在端口1234上发送任何更多数据包后,以下内容附加到ITM输出;同时,套接字由nc为用户关闭

[29.0s] Listening to port 1234 for echoing, time-out in 10s

用户现在可以再次连接到端口1234。

对于端口4321,在退出nc关闭端口之前,用户可以继续使用工具发送任何数据包。由于以太网控制器已经关闭了套接字,因此这些新数据包将被丢弃,并在ITM输出中附加以下错误消息

[35.950s] Poll error: Dropped
[36.150s] Poll error: Dropped
...

用户然后通过退出nc断开与端口4321的连接,并以下内容附加到ITM输出

[40.200s] Listening to port 4321 for greeting, please connect to the port

用户现在可以再次连接到端口4321。

依赖项

~0.3–0.8MB
~18K SLoC