Skip to content

[Recuration] w5500-rs Rust Support for W5500

Embedded rust support for the Wiznet W5500 SPI internet offload chip.

josephsr

Published September 04, 2023 · © MIT license (MIT)

Original author: Alex Martens · CanadaOriginal source (new tab)

[Recuration] w5500-rs Rust Support for W5500

Components

Hardware components Software Apps and online services

x 1

Rust


WIZnet parts

Project description

Embedded rust support for the Wiznet W5500 SPI internet offload chip.

functions in the W5500-LL library:

W5500::reset(&mut self): Resets the W5500 chip.
W5500::configure(&mut self, config: &Configure) -> Result<(), Error>: Configure Ethernet settings. You can set IP address, subnet mask, gateway address and MAC address.
W5500::set_mac(&mut self, mac: [u8; 6]): Sets the MAC address.
W5500::set_ip(&mut self, ip: IpAddress): Sets the IP address.
W5500::set_subnet_mask(&mut self, mask: IpAddress): Sets the subnet mask.
W5500::set_gateway_ip(&mut self, gateway: IpAddress): Sets the gateway address.

functions in the W5500-HL library:

W5500::set_mode(&mut self, mode: SocketMode) -> Result<(), Error>: Sets the socket mode. Usually choose TCP or UDP.
Socket::new(w5500: &mut W5500) -> Result<Socket, Error>: Creates a new socket.
Socket::listen(&mut self, port: u16) -> Result<(), Error>: Listens for a connection on the specified port.
Socket::connect(&mut self, remote_ip: IpAddress, remote_port: u16) -> Result<(), Error>: Connect to the remote host.
Socket::send(&mut self, data: &[u8]) -> Result<usize, Error>: Send data.
Socket::receive(&mut self, buffer: &mut [u8]) -> Result<usize, Error>: Receive data.

functions in the W5500-RegSim library:

Simulator::new() -> Simulator: Creates a simulator instance.
Simulator::set_mac(&mut self, mac: [u8; 6]): Sets the MAC address.
Simulator::set_ip(&mut self, ip: [u8; 4]): Sets the IP address.
Simulator::set_subnet_mask(&mut self, mask: [u8; 4]): Sets the subnet mask.
Simulator::set_gateway_ip(&mut self, gateway: [u8; 4]): Sets the gateway address.

 

example

use w5500_ll::{W5500, Configure, IpAddress, Error};
use std::error::Error as StdError;
use std::thread::sleep;
use std::time::Duration;

fn main() -> Result<(), Box<dyn StdError>> {
    // SPI 및 다른 하드웨어 설정을 초기화합니다.
    let spi = setup_spi(); // 본 예제에서는 실제 SPI 설정을 가정합니다.
    let cs = setup_cs();   // CS 핀 설정
    let reset = setup_reset(); // Reset 핀 설정

    // W5500을 초기화합니다.
    let mut w5500 = W5500::new(spi, cs, reset);
    w5500.configure(|c| {
        c.mac_address([0x00, 0x01, 0x02, 0x03, 0x04, 0x05])
         .ip_address(IpAddress::new(192, 168, 1, 100))
         .subnet_mask(IpAddress::new(255, 255, 255, 0))
         .gateway_ip(IpAddress::new(192, 168, 1, 1))
    })?;

    // TCP 서버 소켓을 엽니다.
    let server_socket = w5500.socket(0, Tcp)?;
    server_socket.listen(80)?;

    loop {
        if let Ok(mut client_socket) = server_socket.accept() {
            // 클라이언트와 연결된 경우, 데이터를 수신하고 다시 보냅니다.
            let mut buffer = [0u8; 512];
            let bytes_received = client_socket.receive(&mut buffer)?;
            if bytes_received > 0 {
                // 수신한 데이터를 화면에 출력
                println!("Received: {:?}", &buffer[..bytes_received]);

                // 클라이언트에게 데이터를 다시 보냅니다.
                client_socket.send(&buffer[..bytes_received])?;
            }
        }
        
        // 간격을 두고 루프를 실행 (실제로는 무한 루프에서 종료 조건을 설정해야 함)
        sleep(Duration::from_secs(1));
    }
}

Documents

  • w5500-rs

    w5500 Rust Support

Comments

Comments