본문 바로가기

RaspberryPi/RP2350

[RP2350_ W6100 SM] Arduino - 내장 W6100 TCP Server 테스트

 

 

[RP2350_ W6100 SM]보드에는 W6100 이더넷 칩이 실장되어 있어 간단히 이더넷을 연결 할 수 있다. 이더넷 커넥터는 [W55RP20 SSM] 보드와 같이 Ethernet 커넥터를 교체 할 수 있는 커넥터 타입으로 제작 하여 탈 부착 하기 쉽다. 단독으로 사용하면 USB기능의 소형 테스트 보드로도 활용 가능하다.

 

W6100은 SPI 인터페이스로 연결되어 있고 W6100 CS핀을 GP2에 할당 하였다.

 

Arduino 환경에서 사용한다면 W6100 라이브러리가 많이 제공되고 있기때문에 아주 쉽고 빠르게 테스트 가능하다.

W6100라이브러리중 웹서버 기능이 탁월한 Ethernet_Generic 라이브러리로 테스트 해보자

 

 


Ethernet_Generic 라이브러리 기본 초기화 설정

// Ethernet Generic 라이브러리 사용 여부 정의
#define USE_ETHERNET_GENERIC  true 

// 다양한 보드를 위한 SPI SS(슬레이브 선택) 핀 정의
#define USE_THIS_SS_PIN                 2    //RP2350 SSM


// UIP Ethernet 사용 여부 정의 (false는 사용하지 않음)
#define USE_UIP_ETHERNET   false

// Ethernet 통신을 위한 SPI 설정: 속도, 비트 순서, SPI 모드
#define SPI_ETHERNET_SETTINGS SPISettings(37500000, MSBFIRST, SPI_MODE0)

// 사용할 Ethernet 컨트롤러 정의 (W5100 또는 W6100)
#define USE_W5100                           false  // W5100 Ethernet 칩 사용 안 함
#define USING_W6100                         true   // W6100 Ethernet 칩 사용

// SPI2 사용 여부 정의 (false는 기본 SPI1 사용)
#define USING_SPI2                          false 

// RP2040 Pico 사용 여부 정의 (true는 사용)
#define ETHERNET_USE_RPIPICO      true

// SPI 통신을 위한 전송 버퍼 활성화
#define SPI_HAS_TRANSFER_BUF      true

// Ethernet 통신을 위해 사용할 SPI 포트 정의 (여기서는 spi0 사용)
#define SPI_X spi0


// 필요한 라이브러리 포함 (SPI 통신 및 Ethernet)
#include <SPI.h>
#include "Ethernet_Generic.h"

// Ethernet 장치의 MAC 주소 정의 (네트워크에서 고유한 주소)
byte mac[] = {
  0x00, 0x08, 0xDC, 0x00, 0x00, 0x00
};

// 포트 5001에서 클라이언트를 기다리는 Ethernet 서버 생성
EthernetServer server(5001);

void setup() {
  // 시리얼 통신을 초기화 (115200 baud 속도)
  Serial.begin(115200);
  
  // 시리얼 포트가 연결될 때까지 대기
  while (!Serial) {
    // 시리얼 포트가 연결될 때까지 기다림
  }

  // 초기화 메시지를 시리얼 모니터에 출력
  Serial.println("RP2350 W6100 INIT");

  // Ethernet 칩을 위한 SS 핀을 출력 모드로 설정
  pinMode(USE_THIS_SS_PIN, OUTPUT);
  digitalWrite(USE_THIS_SS_PIN, 1); 

  pinMode(25, OUTPUT);
  digitalWrite(25, 1);

  // 선택된 SS 핀을 사용하여 Ethernet 장치 초기화
  Ethernet.init(USE_THIS_SS_PIN);

  // 정의된 MAC 주소를 사용하여 Ethernet 연결 시작
  Ethernet.begin(mac);
  Serial.println("...");

  // 서버를 시작하여 포트 5001에서 클라이언트 연결을 기다림
  server.begin();
  Serial.print("TCP Server address : ");
  // 장치의 로컬 IP 주소를 시리얼 모니터에 출력
  Serial.println(Ethernet.localIP());
}

void loop() 
{
}

 

 

프로그램 실행하면 DHCP에서 IP를 할당받는 것을 확인 할 수 있다.

 

 

 


TCP 서버로 설정하고 클라이언트에서 수신받은 데이터를 출력하는 예제

#define MAX_BUF_SIZE        1024      // 버퍼의 최대 크기 정의 (1024바이트)
byte buf[MAX_BUF_SIZE];              // 데이터 읽기/쓰기를 위한 버퍼 선언

void loop() 
{
  unsigned int len = 0;  // 데이터 길이 변수 초기화
  
  // 새로운 클라이언트가 연결될 때까지 대기:
  EthernetClient client = server.available();
  
  if (client) {   // 클라이언트가 있을 경우 처리
    Serial.println("client ready");
  
    // 클라이언트가 연결되어 있는 동안 계속 읽기:
    while (client.connected())  // 클라이언트가 연결되어 있는 동안
    {
      Serial.println("client disonnected");
      len = client.available();  // 클라이언트로부터 읽을 수 있는 데이터 길이 확인

      if (len)  // 데이터가 있을 경우
      {
        client.read(buf, len);  // 클라이언트로부터 데이터를 버퍼에 읽어들임

        String read_data = String(buf, len);  // 버퍼에 읽은 데이터를 문자열로 변환
        Serial.println(read_data);  // 읽은 데이터를 시리얼 모니터에 출력
      }
    }
    
    // 클라이언트와의 연결 종료:
    client.stop();  // 클라이언트 연결 종료

    Serial.println("client disconnected");  // 클라이언트 연결이 끊어졌다는 메시지 출력
  }
}

 

반응형