ch9120搭載基板、有線LAN通信ができるRP2040-ETHを使う

コンピュータ、組み込み

RP2040搭載基板にch9120を合体させた基板、RP2040-ETHを入手しました。
UART感覚でEthernet通信ができます。
ch9120のネットワーク設定と、Arduino環境でのEthernet通信をしてみます。

紹介するもの

Waveshare RP2040-ETH

特徴

RP2040搭載基板にch9120を合体させた基板です。
初期化処理以外はUART感覚でEthernet通信ができます。

RP2040-ETH
CPURP2040 ARM Cortex M0+ 133MHz
接続Type C
USB1.1 ホスト/デバイス両対応
MemorySRAM 264KB
フラッシュメモリ 4MB
ロジックレベル3.3V
GPIO14
PWM14(8bit 0 ~ 255, 3.3V)
ADC3 (10bit 0 ~ 1023, 3.3V)
UART2
I2C2
SPI2
LEDWS2812
そのほかリセットボタン
ch9120 Ethernet
入手性※Ali Expres
送料込み \2,100~\2,500
※入手性、価格は参考です。
情勢、為替などにより変動します。

ch9121の記事

Raspberry Pi Pico の記事

ピン配置

RaspberryPi Picoを半分で切り離したようなピン配置になっています。
その切り離された、GPIO17, 18, 19, 20を使ってch9120をコントロールしています。
そのため、スルーホールのGPIOはch9120と重複することなく使用することができますが、UART2はがch9120と通信するために使用できません。

外観

RP2040-ETH(画像左)とch9121モジュール(画像右)を比べました。
ch9121モジュールはRaspberryPi Picoと合体させるためにRaspberry Pi Picoが搭載される大きさです。
ch9121にはRaspberryPi Picoを合体させるので2階層の基板になることで完成形ですが、RP2040-ETHはRP2040チップが搭載されるだけの面積があるだけなのでコンパクトな基板です。

RP2040-ETH(画像左)とW5100S-EVB-Pico(画像右)と比べてみました。
2枚の基板ともに完成系の状態ですが、W5100S-EVB-PicoはRaspberryPi Picoとのピン互換があるため基板サイズでは2倍ほどの大きさです。
ピンを多く使いたいか、コンパクトに使いたいかは用途に応じて選択することになります。

この基板を側面からみると、RP2040-ETHでは高さも低くなるようにRJ45コネクタを基板に沈めています。
概ね4mmほどの差異がありました。

使ってみて

RP2040とch9120の一体基板がコンパクトなサイズで使用することができます。
以前にch9121モジュールを紹介しましたが初期化以外の使い方は同じです。

注意したいのが、ネットワーク設定を変更するためのアプリケーションがそれぞれ専用です。
アプリケーションの画面はch9121もch9120全く同じなので混在しないよう注意してください。
インストール不要の実行ファイルなので、フォルダ名で識別するなどの工夫ができます。

ch9121での紹介ではアプリケーションであらかじめモジュールに対してネットワーク設定をして使用していましたが、今回のサンプルではスケッチ上からネットワーク設定を変更することができます。
その場合アプリケーションで設定した内容が上書きされます。

実行中に流動的にネットワークの設定を変更するスケッチでも、アプリケーションを使ってネットワーク設定を変更する使い方でもできます。
アプリケーションからネットワーク設定を変更する場合、Server/Clientの情報が無いので同じスケッチでServerでもClientでも使用することができます。
ServerとClientの関係がなくなり、まさにUART感覚でEthenet通信ができます。

準備

初めにRP2040-ETHにCircuitPythonを書き込み、Arduino環境でシリアルからスケッチの書き込みができるように初期化します。

次にアプリケーションを使ったネットワーク設定を行います。

基板の初期化

1.RP2040-ETH のBOOT SELボタンを押しながら、USBケーブルをパソコンに接続します。

2.パソコンの画面では、RP2040-ETH をストレージとして認識します。

3.UF2ファイルを以下のサイトからダウンロードします。

circuit python UF2 Download

4.ダウンロードしたファイル[adafruit-circuitpython-raspberry_pi_pico-ja-7.3.0.uf2]※をストレージ認識したRP2040-ETH にドラッグ&ドロップする。

以上の作業でRP2040-ETH はCOM認識されます。

今回ダウンロードしたuf2ファイルは、保存しておいてください。
RP2040-ETH を初期化したいとき(今何のファームウエアが書かれているかわからなくなったとき)には、BOOTSELボタンを押しながら再起動することでやり直しができます。

※2022/Jun 時点ではVersion 7.3.0

ライブラリ

ボードライブラリ

Arduino IDEのボードマネージャからRP2040-A用のライブラリのインストールとボードの選択をし
ます。

コンパイルを行う前にボードを選択しますが、Generic RP2040を選択します。

追加のボードマネージャのURLhttps://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
検索RP2040
ボードライブラリRaspberry Pi RP2040 Boards(x.x.x)※
選択するボードRaspberry Pi RP2040 Boards(x.x.x) > Generic RP2040
※動作確認はバージョン 3.1.0です

使うもの

名称(型番)用途入手
RP2040-ETHLAN通信に使用電子部品
ネットショップ
Ali Expressなど
W5100S-EVB-PicoLAN対向通信に使用マルツ、Switchscience
Ali Expressなど
LANケーブル(クロス)ネットワーク設定
LAN通信をする
ダイソー
USB-LAN変換アダプタ
(メーカー不問)
アプリケーションからの設定
パソコンとモジュールの通信
をする場合必要
Amazonなど

RP2040-ETHを2枚用意できなかったので、マイコン同士のLAN通信の相手にW5100S-EVB-Picoを使います。
当サイトでは他にも以下のネットワークモジュールを紹介しています。
すべてTCP Sever/ TCP Clientの記事が書かれているのでどの組み合わせでも使用できます。

アプリケーションを使ったネットワーク設定

説明

CH9120_Network_configuration_toolを使ったネットワーク設定について説明します。
サンプルプログラムは「アプリケーション設定を使うサンプル」を使ってください。
(「スケッチでのネットワーク設定サンプル」を使うとアプリケーションで設定した内容が上書きされます。

ここではTCP ServerとTCP Clientについての設定を記述します。

配線

RP2040-ETHとUSB-LANアダプタをLANケーブルで接続します。
RP2040-ETHとパソコンをUSBで接続します。

ネットワーク設定(RP2040-ETH側)

スケッチ上からネットワーク設定を行う場合は「ネットワーク設定(RP2040-ETH側)」の作業は不要です。

この作業はRP2040-ETHに搭載されているch9120の設定のために行います。
使用するアプリケーションはch9121モジュールとは違うので以下からダウンロードしてください。

RP2040-ETHの設定アプリケーションをダウンロードします。

アプリケーションを起動します。
アプリケーション起動、実行中にセキュリティメッセージが表示されますが、自身のセキュリティポリシーに従ってください。
アプリケーションを実行しない場合は、「スケッチでのネットワーク設定サンプル」での動作を行います。

①USB-LANアダプタが認識できていれば、Adapterリストボックスに表示されます。
 リストボックスになければUSB-LANアダプタを再度接続しなおして、Refreshボタンを押下します。

②Searchを押すことで、Adapterに接続されているRP2040-ETH端末を検索し、結果を「Module List」に表示します。

「Module List」にリストが表示されない場合、配線の確認をする。

③リストを選択しダブルクリックすると、個体の設定内容が「Basic」に表示されます。
画像はch9121モジュールの転用です。
表示されるNameはBasicで設定したNameが表示されます。

以下の作業はRP2040-ETHをTCP Serverとして使用するか、TCP Clientとして使用するかで使い分けてください。

④と⑤の※(x)は対向通信で通信相手を整合させるために同じ※(x)同士で設定を一致させます。

TCP Serverにする設定TCP Clientにする設定
DHCPレ点無しレ点無し
IP192.168.1.200※1192.168.1.100※2
Mask255.255.255.0255.255.255.0
GateWay192.168.1.100※2192.168.1.200※1
Serial Negoレ点無しレ点無し

引き続き⑤の設定内容です。

TCP Serverにする設定TCP Clientにする設定
ModeTCP SERVERTCP CLIENT
Local Port5000※35000
Conn TypeIPIP
Dest IP192.168.1.100192.168.1.200※2
Dest Port50005000※3
Baud115200115200
Data Bit88
Stop Bit11
ParityNoneNone
Conn Lostレ点有りレ点有り
Pack Len10241024
Pack TimeOut00
Reconnectレ点無しレ点無し
デフォルトからの重要な変更項目を赤で表記しています。

⑥ Set ALLを押下します。

通信設定(パソコン側)

RP2040-ETHをサーバー、パソコンをクライアントにして通信します。
この動作をしない場合、「通信設定(パソコン側)」の作業は不要です。

USBケーブルを使ったCOMからマイコンとの通信以外に、Ethernet経由でマイコンに命令を送ったりデータを読み取ったりできます。

RP2040-ETHにパソコンを接続させるために、パソコン側のLAN通信設定を変更します。
今回USB-LANアダプタを使用しています。

注意 : 設定の変更を間違えると、パソコンがネット接続できなくなるなどの問題が発生する可能性があります。

「ネットワーク設定(RP2040-ETH側)」の④、⑤の作業ではTCP Serverにする設定がされていることを前提にします。

ライブラリの入手と修正(必須作業)

Waveshare RP2040-ETHからサンプルライブラリを入手します。


解凍すると
[解凍先フォルダ]\RP2040_ETH_CODE\Arduino\RP2040-ETH-Demo フォルダに
CH9120.cpp
CH9120.h
RP2040-ETH-Demo.ino
があります。

RP2040-ETHのサンプルスケッチは、RP2040-ETH-Demo.inoと、CH9120.cppを修正して掲載します。

アプリケーション設定を使うサンプル

スケッチの説明

「ネットワーク設定(RP2040-ETH側)」の ④、⑤では「TCP Serverにする設定」を実施してください。

パソコンから受け取ったデータの大文字と小文字を入れ替えてUARTへ送信します。
UARTから受け取ったデータはそのままパソコンへ送信します。

このRP2040-ETHのスケッチには、TCP Server、TCP Clientの情報がありません。
どちらで使うときも同じスケッチを使います。
ServerかClientかはアプリケーションで行うネットワークの設定で決定します。

スケッチ

スケッチは、RP2040-ETH-Demo.ino と CH9120.cppの2つを編集します。

//ネットワーク設定をアプリケーションで行います。
// RP2040-ETH側設定
//
// Mode : TCP Server
// IP Address : 192.168.1.200
// Subnet Mask : 255.255.255.0
// Default Gateway : 192.168.1.100
// Local Port : 5000
//
// パソコン側設定または Client側のマイコン
// IP Address : 192.168.1.100
// Subnet Mask : 255.255.255.0
// Default Gateway : 192.168.1.200
// Target Port : 5000
//
// パソコン(COM)から読み取ったデータが英文字なら大文字と小文字を入れ替えてClientに送信します。
// Clientから読み取ったデータはそのままパソコン(COM)へ送信します。


#include "CH9120.h"


uint32_t i = 0;

void setup() 
{
  CH9120_init();                  //ETH-pico-CH9120の初期化
  
  Serial.begin(115200);           //パソコン側からの読み取りと書き込みに使用します。

}

void loop() 
{
  char buf = 0;

  //<<送信側としての処理>>
  //パソコンからの受信処理と受信側への送信
  if(Serial.available() == true)
  {
    buf = Serial.read();

    //ASCコード上で、0b1000 0000ビットが0の時、0b0111 0000 のいずれかが 1なら英文字(正確ではありません。)
    if(((buf & 0x80) != 0x80) && ((buf & 0x40) == 0x40))
    {
      //ASCコード上で 0b0010 0000 のビットを反転させることで、大文字と小文字を入れ替える。
      buf = buf ^ 0x20;
    }
    //受信側へデータを送信する。
    Serial2.write(buf);
  }  

  //<<受信側としての処理>>
  //送信側からの受信処理と、パソコンへの送信
  if(Serial2.available() == true)
  {
    buf = Serial2.read();
    Serial.write(buf);
  } 
}
#include "CH9120.h"

UCHAR CH9120_LOCAL_IP[4] = {192, 168, 1, 205};    // LOCAL IP
UCHAR CH9120_GATEWAY[4] = {192, 168, 1, 1};      // GATEWAY
UCHAR CH9120_SUBNET_MASK[4] = {255, 255, 255, 0}; // SUBNET MASK
UCHAR CH9120_TARGET_IP[4] = {192, 168, 1, 206};   // TARGET_IP
UWORD CH9120_PORT1 = 1000;                        // LOCAL PORT1
UWORD CH9120_TARGET_PORT = 2000;                  // TARGET PORT
UDOUBLE CH9120_BAUD_RATE = 115200;                // BAUD RATE

UCHAR tx[8] = {0x57, 0xAB};

/******************************************************************************
function:	Send four bytes
parameter:
    data: parameter
    command: command code
Info:  Set mode, enable port, clear serial port, switch DHCP, switch port 2
******************************************************************************/
void CH9120_TX_4_bytes(UCHAR data, int command)
{
    for (int i = 2; i < 4; i++)
    {
        if (i == 2)
            tx[i] = command;
        else
            tx[i] = data;
    }
    DEV_Delay_ms(10);
    for (int o = 0; o < 4; o++)
        UART_ID1.write(tx[o]);
    DEV_Delay_ms(10);
    for (int i = 2; i < 4; i++)
        tx[i] = 0;
}

/******************************************************************************
function:	Send five bytes
parameter:
    data: parameter
    command: command code
Info:  Set the local port and target port
******************************************************************************/
void CH9120_TX_5_bytes(UWORD data, int command)
{
    UCHAR Port[2];
    Port[0] = data & 0xff;
    Port[1] = data >> 8;
    for (int i = 2; i < 5; i++)
    {
        if (i == 2)
            tx[i] = command;
        else
            tx[i] = Port[i - 3];
    }
    DEV_Delay_ms(10);
    for (int o = 0; o < 5; o++)
        UART_ID1.write(tx[o]);
    DEV_Delay_ms(10);
    for (int i = 2; i < 5; i++)
        tx[i] = 0;
}
/******************************************************************************
function:	Send seven bytes
parameter:
    data: parameter
    command: command code
Info:  Set the IP address, subnet mask, gateway,
******************************************************************************/
void CH9120_TX_7_bytes(UCHAR data[], int command)
{
    for (int i = 2; i < 7; i++)
    {
        if (i == 2)
            tx[i] = command;
        else
            tx[i] = data[i - 3];
    }
    DEV_Delay_ms(10);
    for (int o = 0; o < 7; o++)
        UART_ID1.write(tx[o]);
    DEV_Delay_ms(10);
    for (int i = 2; i < 7; i++)
        tx[i] = 0;
}

/******************************************************************************
function:	CH9120_TX_BAUD
parameter:
    data: parameter
    command: command code
Info:  Set baud rate
******************************************************************************/
void CH9120_TX_BAUD(UDOUBLE data, int command)
{
    UCHAR Port[4];
    Port[0] = (data & 0xff);
    Port[1] = (data >> 8) & 0xff;
    Port[2] = (data >> 16) & 0xff;
    Port[3] = data >> 24;

    for (int i = 2; i < 7; i++)
    {
        if (i == 2)
            tx[i] = command;
        else
            tx[i] = Port[i - 3];
    }
    DEV_Delay_ms(10);
    for (int o = 0; o < 7; o++)
        UART_ID1.write(tx[o]);
    DEV_Delay_ms(10);
    for (int i = 2; i < 7; i++)
        tx[i] = 0;
}

/******************************************************************************
function:	CH9120_Eed
parameter:
Info:  Updating configuration Parameters
******************************************************************************/
void CH9120_Eed()
{
    tx[2] = 0x0d;
    for (int o = 0; o < 3; o++)
        UART_ID1.write(tx[o]);
    DEV_Delay_ms(200);
    tx[2] = 0x0e;
    for (int o = 0; o < 3; o++)
        UART_ID1.write(tx[o]);
    DEV_Delay_ms(200);
    tx[2] = 0x5e;
    for (int o = 0; o < 3; o++)
        UART_ID1.write(tx[o]);
}

/**
 * delay x ms
**/
void DEV_Delay_ms(UDOUBLE xms)
{
    delay(xms);
}

void DEV_Delay_us(UDOUBLE xus)
{
    delayMicroseconds(xus);
}

/******************************************************************************
function:	CH9120_init
parameter:
Info:  Initialize CH9120
******************************************************************************/
void CH9120_init(void)
{
    // Serial.begin(115200);
    // delay(1000);

    UART_ID1.setTX(UART_TX_PIN1);
    UART_ID1.setRX(UART_RX_PIN1);
    UART_ID1.begin(Inti_BAUD_RATE);
    
    pinMode(CFG_PIN,OUTPUT);
    pinMode(RES_PIN,OUTPUT);

//コメント箇所は、アプリケーションでネットワーク設定をするため
//    digitalWrite(CFG_PIN, 0);
    digitalWrite(RES_PIN, 1);

    
    // DEV_Delay_ms(100);
    // CH9120_TX_4_bytes(TCP_CLIENT, Mode1); //Mode
    // DEV_Delay_ms(100);
    // CH9120_TX_7_bytes(CH9120_LOCAL_IP, LOCAL_IP); //LOCALIP
    // DEV_Delay_ms(100);
    // CH9120_TX_7_bytes(CH9120_SUBNET_MASK, SUBNET_MASK); //SUBNET MASK
    // DEV_Delay_ms(100);
    // CH9120_TX_7_bytes(CH9120_GATEWAY, GATEWAY); //GATEWAY
    // DEV_Delay_ms(100);
    // CH9120_TX_7_bytes(CH9120_TARGET_IP, TARGET_IP1); //TARGET IP
    // DEV_Delay_ms(100);

    // CH9120_TX_5_bytes(CH9120_PORT1, LOCAL_PORT1); //Local port
    // DEV_Delay_ms(100);
    // CH9120_TX_5_bytes(CH9120_TARGET_PORT, TARGET_PORT1); //Target Port
    // DEV_Delay_ms(100);
    // CH9120_TX_BAUD(CH9120_BAUD_RATE, UART1_BAUD1);//Port 1 baud rate
    // DEV_Delay_ms(100);
    // CH9120_Eed();
    // DEV_Delay_ms(500);
     gpio_put(CFG_PIN, 1);

    UART_ID1.begin(Transport_BAUD_RATE);
    // while (UART_ID1.available())
    //     {
    //         UBYTE ch1 = UART_ID1.read();
    //     }
}


/******************************************************************************
function:	RX_TX
parameter:
Info:  Serial port 1 and serial port 2 receive and dispatch
******************************************************************************/
void RX_TX()
{

    while (1)
    {
        while (UART_ID1.available())
        {
            UCHAR ch1 = UART_ID1.read();
            UART_ID1.write(ch1);
//            Serial.print((char)ch1);

        }
    }
}

結果(パソコンとTCPサーバーの通信)

RP2040-ETHとパソコン(LANアダプタ)をLANケーブルで接続します。
Teraterm を2つ起動します。

・パソコン側(LANアダプタ)
ホストには192.168.1.200, TCPポートには5000、サービスは「その他」を選択して、「OK」をクリックします。

・RP2040-ETH側
シリアルを選択して、ポートにはRP2040-ETHのCOMポート番号を選択して、「OK」をクリックします。

・データの送受信
画像左側[192.168.1.200]はRP2040-ETHのTeratermで、右側[COM61]はパソコン側(LANアダプタ)です。
RP2040-ETH側に”ABC “と入力すると、パソコン側には”abc “と表示されます。
パソコン側に”tamanegi”+enterキーを入力すると、RP2040-ETH側には”tamanegi”と表示されます。

スケッチでのネットワーク設定サンプル

スケッチの説明

アプリケーションでのネットワーク設定は不要です。

パソコンから受け取ったデータの大文字と小文字を入れ替えてUARTへ送信します。
UARTから受け取ったデータはそのままパソコンへ送信します。

このスケッチには、CH9120.cppでTCP Server/TCP Clientの設定を行います。
このサンプルでは、TCP Serverとして設定をおこないます。

TCP Clientにする場合は[CH9120.cpp]の以下マクロ定義をコメントアウトします。
#define TCPServer

RP2040-ETH-Demo.inoは「アプリケーション設定を使うサンプル」と同じです。
Server/Cllientのどちらで使うときも同じスケッチを使います。

スケッチ

スケッチは、RP2040-ETH-Demo.ino と CH9120.cppの2つを編集します。

//ネットワーク設定をスケッチで設定します。
// RP2040-ETH側設定
//
// Mode : TCP Server
// IP Address : 192.168.1.200
// Subnet Mask : 255.255.255.0
// Default Gateway : 192.168.1.100
// Local Port : 5000
//
//
// パソコン側設定または Client側のマイコンは以下の設定でRP2040-ETHと接続
// IP Address : 192.168.1.100
// Subnet Mask : 255.255.255.0
// Default Gateway : 192.168.1.200
// Target Port : 5000
//
// パソコン(COM)から読み取ったデータが英文字なら大文字と小文字を入れ替えてClientに送信します。
// Clientから読み取ったデータはそのままパソコン(COM)へ送信します。


#include "CH9120.h"


uint32_t i = 0;

void setup() 
{
  CH9120_init();                  //ETH-pico-CH9120の初期化
  
  Serial.begin(115200);           //パソコン側からの読み取りと書き込みに使用します。

}

void loop() 
{
  char buf = 0;

  //<<送信側としての処理>>
  //パソコンからの受信処理と受信側への送信
  if(Serial.available() == true)
  {
    buf = Serial.read();

    //ASCコード上で、0b1000 0000ビットが0の時、0b0111 0000 のいずれかが 1なら英文字(正確ではありません。)
    if(((buf & 0x80) != 0x80) && ((buf & 0x40) == 0x40))
    {
      //ASCコード上で 0b0010 0000 のビットを反転させることで、大文字と小文字を入れ替える。
      buf = buf ^ 0x20;
    }
    //受信側へデータを送信する。
    Serial2.write(buf);
  }  

  //<<受信側としての処理>>
  //送信側からの受信処理と、パソコンへの送信
  if(Serial2.available() == true)
  {
    buf = Serial2.read();
    Serial.write(buf);
  } 
}
#include "cyw43_ll.h"
#include "CH9120.h"

//TCP Clientにする場合は、#define TCPServerをコメントアウト
#define TCPServer

//TCP Serverにする設定
#ifdef TCPServer
UCHAR CH9120_LOCAL_IP[4] = {192, 168, 1, 200};    // LOCAL IP
UCHAR CH9120_GATEWAY[4] = {192, 168, 1, 100};     // GATEWAY
UCHAR CH9120_SUBNET_MASK[4] = {255, 255, 255, 0}; // SUBNET MASK
UCHAR CH9120_TARGET_IP[4] = {192, 168, 1, 100};   // TARGET_IP
UWORD CH9120_PORT1 = 5000;                        // LOCAL PORT1
UWORD CH9120_TARGET_PORT = 2000;                  // TARGET PORT
UDOUBLE CH9120_BAUD_RATE = 115200;                // BAUD RATE

//TCP CLIENTにする設定
#else
UCHAR CH9120_LOCAL_IP[4] = {192, 168, 1, 100};    // LOCAL IP
UCHAR CH9120_GATEWAY[4] = {192, 168, 1, 200};     // GATEWAY
UCHAR CH9120_SUBNET_MASK[4] = {255, 255, 255, 0}; // SUBNET MASK
UCHAR CH9120_TARGET_IP[4] = {192, 168, 1, 200};   // TARGET_IP
UWORD CH9120_PORT1 = 1000;                        // LOCAL PORT1
UWORD CH9120_TARGET_PORT = 5000;                  // TARGET PORT
UDOUBLE CH9120_BAUD_RATE = 115200;                // BAUD RATE

#endif

UCHAR tx[8] = {0x57, 0xAB};

/******************************************************************************
function:	Send four bytes
parameter:
    data: parameter
    command: command code
Info:  Set mode, enable port, clear serial port, switch DHCP, switch port 2
******************************************************************************/
void CH9120_TX_4_bytes(UCHAR data, int command)
{
    for (int i = 2; i < 4; i++)
    {
        if (i == 2)
            tx[i] = command;
        else
            tx[i] = data;
    }
    DEV_Delay_ms(10);
    for (int o = 0; o < 4; o++)
        UART_ID1.write(tx[o]);
    DEV_Delay_ms(10);
    for (int i = 2; i < 4; i++)
        tx[i] = 0;
}

/******************************************************************************
function:	Send five bytes
parameter:
    data: parameter
    command: command code
Info:  Set the local port and target port
******************************************************************************/
void CH9120_TX_5_bytes(UWORD data, int command)
{
    UCHAR Port[2];
    Port[0] = data & 0xff;
    Port[1] = data >> 8;
    for (int i = 2; i < 5; i++)
    {
        if (i == 2)
            tx[i] = command;
        else
            tx[i] = Port[i - 3];
    }
    DEV_Delay_ms(10);
    for (int o = 0; o < 5; o++)
        UART_ID1.write(tx[o]);
    DEV_Delay_ms(10);
    for (int i = 2; i < 5; i++)
        tx[i] = 0;
}
/******************************************************************************
function:	Send seven bytes
parameter:
    data: parameter
    command: command code
Info:  Set the IP address, subnet mask, gateway,
******************************************************************************/
void CH9120_TX_7_bytes(UCHAR data[], int command)
{
    for (int i = 2; i < 7; i++)
    {
        if (i == 2)
            tx[i] = command;
        else
            tx[i] = data[i - 3];
    }
    DEV_Delay_ms(10);
    for (int o = 0; o < 7; o++)
        UART_ID1.write(tx[o]);
    DEV_Delay_ms(10);
    for (int i = 2; i < 7; i++)
        tx[i] = 0;
}

/******************************************************************************
function:	CH9120_TX_BAUD
parameter:
    data: parameter
    command: command code
Info:  Set baud rate
******************************************************************************/
void CH9120_TX_BAUD(UDOUBLE data, int command)
{
    UCHAR Port[4];
    Port[0] = (data & 0xff);
    Port[1] = (data >> 8) & 0xff;
    Port[2] = (data >> 16) & 0xff;
    Port[3] = data >> 24;

    for (int i = 2; i < 7; i++)
    {
        if (i == 2)
            tx[i] = command;
        else
            tx[i] = Port[i - 3];
    }
    DEV_Delay_ms(10);
    for (int o = 0; o < 7; o++)
        UART_ID1.write(tx[o]);
    DEV_Delay_ms(10);
    for (int i = 2; i < 7; i++)
        tx[i] = 0;
}

/******************************************************************************
function:	CH9120_Eed
parameter:
Info:  Updating configuration Parameters
******************************************************************************/
void CH9120_Eed()
{
    tx[2] = 0x0d;
    for (int o = 0; o < 3; o++)
        UART_ID1.write(tx[o]);
    DEV_Delay_ms(200);
    tx[2] = 0x0e;
    for (int o = 0; o < 3; o++)
        UART_ID1.write(tx[o]);
    DEV_Delay_ms(200);
    tx[2] = 0x5e;
    for (int o = 0; o < 3; o++)
        UART_ID1.write(tx[o]);
}

/**
 * delay x ms
**/
void DEV_Delay_ms(UDOUBLE xms)
{
    delay(xms);
}

void DEV_Delay_us(UDOUBLE xus)
{
    delayMicroseconds(xus);
}

/******************************************************************************
function:	CH9120_init
parameter:
Info:  Initialize CH9120
******************************************************************************/
void CH9120_init(void)
{
    // Serial.begin(115200);
    //delay(1000);

    UART_ID1.setTX(UART_TX_PIN1);
    UART_ID1.setRX(UART_RX_PIN1);
    UART_ID1.begin(Inti_BAUD_RATE);
    
    pinMode(CFG_PIN,OUTPUT);
    pinMode(RES_PIN,OUTPUT);

    digitalWrite(CFG_PIN, 0);
    digitalWrite(RES_PIN, 1);

    DEV_Delay_ms(1000);
#ifdef TCPServer
    CH9120_TX_4_bytes(TCP_SERVER, Mode1); //Mode
#else
    CH9120_TX_4_bytes(TCP_CLIENT, Mode1); //Mode
#endif

    DEV_Delay_ms(100);
    CH9120_TX_7_bytes(CH9120_LOCAL_IP, LOCAL_IP); //LOCALIP
    DEV_Delay_ms(100);
    CH9120_TX_7_bytes(CH9120_SUBNET_MASK, SUBNET_MASK); //SUBNET MASK
    DEV_Delay_ms(100);
    CH9120_TX_7_bytes(CH9120_GATEWAY, GATEWAY); //GATEWAY
    DEV_Delay_ms(100);
    CH9120_TX_7_bytes(CH9120_TARGET_IP, TARGET_IP1); //TARGET IP
    DEV_Delay_ms(100);

    CH9120_TX_5_bytes(CH9120_PORT1, LOCAL_PORT1); //Local port
    DEV_Delay_ms(100);
    CH9120_TX_5_bytes(CH9120_TARGET_PORT, TARGET_PORT1); //Target Port
    DEV_Delay_ms(100);
    CH9120_TX_BAUD(CH9120_BAUD_RATE, UART1_BAUD1);//Port 1 baud rate
    DEV_Delay_ms(100);
    CH9120_Eed();
    DEV_Delay_ms(500);
    gpio_put(CFG_PIN, 1);

    UART_ID1.begin(Transport_BAUD_RATE);
    // while (UART_ID1.available())
    //     {
    //         UBYTE ch1 = UART_ID1.read();
    //     }
}


/******************************************************************************
function:	RX_TX
parameter:
Info:  Serial port 1 and serial port 2 receive and dispatch
******************************************************************************/
void RX_TX()
{

    while (1)
    {
        while (UART_ID1.available())
        {
            UCHAR ch1 = UART_ID1.read();
            UART_ID1.write(ch1);
//            Serial.print((char)ch1);

        }
    }
}

結果(パソコンとTCPサーバーの通信)

RP2040-ETHとパソコン(LANアダプタ)をLANケーブルで接続します。
Teraterm を2つ起動します。

・パソコン側(LANアダプタ)
ホストには192.168.1.200, TCPポートには5000、サービスは「その他」を選択して、「OK」をクリックします。

・RP2040-ETH側
シリアルを選択して、ポートにはRP2040-ETHのCOMポート番号を選択して、「OK」をクリックします。

・データの送受信
画像左側[192.168.1.200]はRP2040-ETHのTeratermで、右側[COM61]はパソコン側(LANアダプタ)です。
RP2040-ETH側に”ABC “と入力すると、パソコン側には”abc “と表示されます。
パソコン側に”tamanegi”+enterキーを入力すると、RP2040-ETH側には”tamanegi”と表示されます

基本スケッチ

RP2040搭載基板でのサンプルは以下の記事を参考にしてください。

コメント

タイトルとURLをコピーしました