1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ethernet-SPI IC ENC28J60 のデータシートを読んでみただけ

Last updated at Posted at 2023-10-22

実機動作確認は何もしておりません。解釈に誤りがあるかもしれません。

きっかけ

なんとなく秋月電子のページを覗いていたとき、この IC が目に入りました。商品説明を軽く見てみると、SPI の使えるマイコンで Ethernet に繋げられるらしい。

「そういや Arduino の Ethernet シールド地味に値段するよなぁ・・・この IC 使えれば安めに Ethernet デバイス作れるんじゃね?」なんていう思いつきからデータシートを読んでみた。

せっかくなので、メモがてら記事に起こすことにしたのでした。

この IC でできること

  • この IC と SPI 通信すると、IC から Ethernet 信号を入出力することができる
    • つまり、SPI インターフェイスのあるマイコンで Ethernet 通信できる
  • ただしスピードは 10base-T
    • 映像とか大規模なものは厳しい

とりあえずさっさと動かしたいなら

すでに先人がライブラリを作ってくれてあるようです。それを使いましょう。

ライブラリ抜きで動かすなら、下に示す前提知識に加え、ネットワークパケットの知識まで必要になってきます。本記事はフルスクラッチ実装を試みる猛者な人に向けて贈るものになります。そうでない方はブラウザバック推奨です。(この言葉ってもう古い?)

でも猛者だったら自分でデータシートぜんぶ読んでいける・・・?

前提知識

  • マイコンの基礎は OK
  • 2進数が分かる, 10進数-2進数変換ができる
  • SPI 通信のやり方が分かる
  • レジスタ、およびレジスタマップが何なのか分かる
    • 「IC のレジスタに値を書くことで、IC の各種設定ができる」というのを知っている

必要なパーツ

データシートから抜粋

enc28j60-sample-scheme.png

主なパーツとしては:

  • この Ethernet IC - 600円
  • パルストランス内蔵 RJ45 コネクタ - 300円
    • ユニバーサル基盤やブレッドボード上の実装を想定して DIP 化キットを選定
  • 他、レベルシフト用パーツや抵抗など

価格はいずれも記事執筆時点

だいたい 1000円程度の見積もりになりそうですね。配線もそこまで難しい要素もなさそうです。回路図右側のトランスは、RJ45 コネクタに内蔵されているタイプを選べば心配なし。

あるいは、このように基盤実装済みのモジュールを使ってしまえばより確実。

SPI 通信のフォーマット

IC のレジスタの書き方などを確かめます。

またデータシート抜粋

enc28j60-spi-list.png

主に使いそうなものをチェック。

IC リセット

enc28j60-spi-reset.png

全て 1 を 1byte、つまり 0xff を送れば全設定やレジスタをリセットできます。

設定レジスタの書き込み

enc28j60-spi-ctrl-write.png

Opcode は固定、Address は設定する対象 (レジスタ) によって決まり、Data Byte はレジスタにセットする値になります。1byte目は C コード的に書くと 0b01000000 & address というようになります。

Address がどうなるか、詳しくは後述

送信バッファの書き込み

enc28j60-spi-buf-write.png

1byte目は固定で 0b01111010。それ以降は、実際に送りたい byte 列を書き続けていきます。最後まで書いたら、CS の立ち上がりによって書き込み完了となります。

受信バッファの読み込み

データシートにタイミングチャートの記載はありませんが、送信バッファ書き込みの流れと TABLE 4-1 から次のようになると思われます。

0b00111010 を送ったあとは、CS が立ち上がるまでデータが送られてきます。

設定レジスタの構造

上の「設定レジスタの書き込み」のタイミングチャートの通り、5bit のレジスタアドレスで、どこのレジスタに書き込むかを指定します。ところで、設定レジスタの構造を見てみると?

enc28j60-register-map.png

レジスタいっぱいありますね。あと Bank というのに分かれています。

この IC のレジスタは:

  1. Bank を選択する
  2. レジスタアドレスを指定して書き込む

という 2段階でレジスタを選択することになっています。

画像横方向 Bank 0~3 の選択について、ECON1 というレジスタに注目すると・・・

enc28j60-econ1-1.png

enc28j60-econ1-2.png

BSEL1 BSEL0 でバンクの指定ができるのがわかります。また全バンクに ECON1 があるのもわかります。まずはこれによって「1. Bank を選択する」ができます。

ところで「設定レジスタの書き込み」で 5bit のアドレス指定がありました。(画像再掲)

enc28j60-spi-ctrl-write.png

これによって「2. レジスタアドレスを指定して書き込む」ができます。

送信・受信バッファの構造

またデータシート抜粋

enc28j60-eth-buffer.png

送信バッファと受信バッファは共用で、どこからどこまでがそれぞれの領域かをレジスタで設定するようです。

送信バッファの書き込み」と「受信バッファの読み込み」を見て分かる通り、通信自体にはどこから書く・読むかのアドレス指定がありません。(画像再掲)

enc28j60-spi-buf-write.png

通信をすると、毎回 'Buffer Write Pointer' 'Buffer Read Pointer' から書き込み・読み込みが始まるという形のようです。

受信検知

INT というピンがあり、そこから割り込み信号を出す (指定のイベント発生通知をする) ことができるようです。

enc28j60-interrupt.png

PKTIF PKTIE という信号に注目してみると?

受信があると PKTIF というレジスタが 1 になるようです。

enc28j60-interrupt-pktif-1.png

enc28j60-interrupt-pktif-2.png

上の回路図と合わせて見ると、PKTIE1 にセットすることで、受信時に INT が立ち下がるようにできるようです。

enc28j60-interrupt-pktie-1.png

enc28j60-interrupt-pktie-2.png

それから、INTIE というレジスタが出力の大元となっているので、これを 1 にセットするのを忘れず。

おわり

すごくざっくりと、必要そうなところを探してつまみました。何気にここまでしっかりデータシート読み込んだのは初めてかもしれん・・・。

まぁ初めに貼ったライブラリ使えばこれも読まずに済むんですけど。

そのうち実機チェックやれたらやりたい。(典型的なやらないフラグ)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?