@ITで「S08ではじめるマイコン制御プログラミング」という連載がはじまっています。S08って何だっけと思ったらフリースケールのHCS08のことみたいです。DEMOQE128ボードとCodeWarriorを使うみたいです。と思ったら著者の方はフリースケールの方です。
AVRイーサネットを作ってみましたの続きです。
前回はキットをはんだづけして、最初から書き込まれているファームウェアで遊んでみました。今回は初期ファームウェアを改造してENC28J60のリビジョン番号を表示してみます。
写真のようにAVRライターをつないでみました。ライターはいつものトラ技8月号付録の78K0基板で、書き込みソフトはでんし研さんのです。いつもはジャンプワイヤーでつないでいますが、AVRイーサ基板にはISP用のソケットがあるので、オスとメスが逆になります。そこで秘密兵器というか共立エレショップで売っているAVRWRT用ブレッドボードISPケーブル/QII6SQI(註7C1412)を逆さまにつなぎました(ISPケーブルの写真ページへのリンク)。
してみたことを列挙します。
- 元のAVRの中身を吸い出して、別のAVRにクローンを作って、元のAVRを予備にしました。これで壊しても平気です。
- クローンもオリジナルと同じ動作をすることを確認しました。
- スイッチサイエンスさんが公開されている初期ファームウェアのソースをダウンロードしてきました(キットの説明ページ)。
- AVR Studioで新しいプロジェクトを作って、ダウンロードした.hと.cを放り込んでコンパイルしてみました。
- eeprom用のhexファイルの作り方がわからなかったので、元のeepromを吸い出した.hexファイルを直接書き換えてIPアドレスを設定しました。1f0と1f1番地がMACアドレスの下位2バイト、1f2~1f5の4バイトがIPアドレスです。チェックサムは電卓で計算しなおしました。
- 今作ったファームを書き込んでみてオリジナルと同じ動作をするかどうか確認しました。
- ここまでは、ISPではなく、AVRを抜き差ししながらしていました。ここでAVRライターをISPコネクタにつないで書き込みができるかどうか確認しました。ここまでISPにしていなかったのは、うまくいかなかったときに原因の切り分けができるようにと考えました。
- ソースを読み始めました。ソース中fill_data_pという関数を使って、送信したい内容をパケットに追加しています。この関数のパラメータを変えることでブラウザが表示する文字が変わります。
- まだ全部読み終わったわけではありませんが、気になっていたチップのリビジョンを表示してみました。print_webpageという関数の最初のfill_tcp_data_pの後に以下のコードを追加しました。
enc28j60getrev()はENC28J60のリビジョンを読み出す関数です。fill_tcp_dataは文字列をパケット用のバッファに追加する関数です。fill_tcp_data_pはROM上の文字列を追加します。_pのない方はSRAM上の文字列です(このあたりはAVRがハーバードアーキテクチャなせいですね)。
- 結果としてリビジョンはB4であることが分かりました。ENC28J60の表面を見ると年コードが07週コードが29になっています。
してみたことは、ここまでです。
microchipのENC28J60のページから日本語データシートがダウンロードできます(リンク)。Errataも同じページからダウンロードできます。
チップのリビジョン番号を気にしていたのはhamayanさんの昔の記事を見つけたからです(2006年9月27日の記事)。この記事ではENC28J60のリビジョンB4の不具合に関する解説があります。リビジョンB4ではSPIに不具合があって、回避方法として8~10MHzで通信を行うのだそうです。Errataには「When the SPI clock from the host microcontroller is run at frequencies of less than 8 MHz, reading or writing to the MAC registers may be unreliable.」と書かれています。hamayanさんも触れられているオプティマイズさんの記事にも同様の注意が書かれています(リンク)。AVRイーサネット基板ではAVRは3.3Vで動作していて動作クロックは内蔵クロックの8MHzです。SPIの速度は最高で動作クロックの半分なので、4MHzで通信していることになります。これでは上のErrataにひっかかってしまうはずですが、なぜか動いています。unreliableと書かれているので、常に間違うわけでなく、たまに間違うということなのでしょうか。
Errataでは回避方法として2つの方法をあげています。一つは8MHzより速く通信することで、もう一つはSPIのクロックをENC28J60に入力している25MHzを分周したクロックにすることです。今回で言うとSPIを8MHzより速くするにはAVRのクロックを16MHz以上にする必要がありますが、そのためには動作電圧を5Vで動作させる必要があります。また、内部発振は8MHzまでなので外部にクロックを設ける必要があります。後の回避方法は、ENC28J60のCLKOUTからAVRのクロックをもらうことが考えられます。ただしENC28J60とAVRのリセットが共通なのでAVRをISPしようとして、リセットがLになるとENC28J60からのクロックも止まってしまうので、ISPできなくなってしまいます。
3.3VのATMega168は13.3MHzまで動作するはずなので、25MHzの半分の12.5MHzを入力するのがよさそうです。
一番速いのは、もっとリビジョンの新しいENC28J60を入手することです。Errataを見るとB7というリビジョンもあるみたいです。こちらではB6のENC28J60を売っています。
後でJUN猫さんがどうしているのか調べてみるつもりです。
なんか色々思い悩んでいますが、とりあえず動いてるからいいのかな。
前回はキットをはんだづけして、最初から書き込まれているファームウェアで遊んでみました。今回は初期ファームウェアを改造してENC28J60のリビジョン番号を表示してみます。
写真のようにAVRライターをつないでみました。ライターはいつものトラ技8月号付録の78K0基板で、書き込みソフトはでんし研さんのです。いつもはジャンプワイヤーでつないでいますが、AVRイーサ基板にはISP用のソケットがあるので、オスとメスが逆になります。そこで秘密兵器というか共立エレショップで売っているAVRWRT用ブレッドボードISPケーブル/QII6SQI(註7C1412)を逆さまにつなぎました(ISPケーブルの写真ページへのリンク)。
してみたことを列挙します。
- 元のAVRの中身を吸い出して、別のAVRにクローンを作って、元のAVRを予備にしました。これで壊しても平気です。
- クローンもオリジナルと同じ動作をすることを確認しました。
- スイッチサイエンスさんが公開されている初期ファームウェアのソースをダウンロードしてきました(キットの説明ページ)。
- AVR Studioで新しいプロジェクトを作って、ダウンロードした.hと.cを放り込んでコンパイルしてみました。
- eeprom用のhexファイルの作り方がわからなかったので、元のeepromを吸い出した.hexファイルを直接書き換えてIPアドレスを設定しました。1f0と1f1番地がMACアドレスの下位2バイト、1f2~1f5の4バイトがIPアドレスです。チェックサムは電卓で計算しなおしました。
- 今作ったファームを書き込んでみてオリジナルと同じ動作をするかどうか確認しました。
- ここまでは、ISPではなく、AVRを抜き差ししながらしていました。ここでAVRライターをISPコネクタにつないで書き込みができるかどうか確認しました。ここまでISPにしていなかったのは、うまくいかなかったときに原因の切り分けができるようにと考えました。
- ソースを読み始めました。ソース中fill_data_pという関数を使って、送信したい内容をパケットに追加しています。この関数のパラメータを変えることでブラウザが表示する文字が変わります。
- まだ全部読み終わったわけではありませんが、気になっていたチップのリビジョンを表示してみました。print_webpageという関数の最初のfill_tcp_data_pの後に以下のコードを追加しました。
{ char s[3]; s[0] = '0' + enc28j60getrev(); s[1] = ' '; s[2] = 0x00; plen = fill_tcp_data(buf, plen, s); }
enc28j60getrev()はENC28J60のリビジョンを読み出す関数です。fill_tcp_dataは文字列をパケット用のバッファに追加する関数です。fill_tcp_data_pはROM上の文字列を追加します。_pのない方はSRAM上の文字列です(このあたりはAVRがハーバードアーキテクチャなせいですね)。
- 結果としてリビジョンはB4であることが分かりました。ENC28J60の表面を見ると年コードが07週コードが29になっています。
してみたことは、ここまでです。
microchipのENC28J60のページから日本語データシートがダウンロードできます(リンク)。Errataも同じページからダウンロードできます。
チップのリビジョン番号を気にしていたのはhamayanさんの昔の記事を見つけたからです(2006年9月27日の記事)。この記事ではENC28J60のリビジョンB4の不具合に関する解説があります。リビジョンB4ではSPIに不具合があって、回避方法として8~10MHzで通信を行うのだそうです。Errataには「When the SPI clock from the host microcontroller is run at frequencies of less than 8 MHz, reading or writing to the MAC registers may be unreliable.」と書かれています。hamayanさんも触れられているオプティマイズさんの記事にも同様の注意が書かれています(リンク)。AVRイーサネット基板ではAVRは3.3Vで動作していて動作クロックは内蔵クロックの8MHzです。SPIの速度は最高で動作クロックの半分なので、4MHzで通信していることになります。これでは上のErrataにひっかかってしまうはずですが、なぜか動いています。unreliableと書かれているので、常に間違うわけでなく、たまに間違うということなのでしょうか。
Errataでは回避方法として2つの方法をあげています。一つは8MHzより速く通信することで、もう一つはSPIのクロックをENC28J60に入力している25MHzを分周したクロックにすることです。今回で言うとSPIを8MHzより速くするにはAVRのクロックを16MHz以上にする必要がありますが、そのためには動作電圧を5Vで動作させる必要があります。また、内部発振は8MHzまでなので外部にクロックを設ける必要があります。後の回避方法は、ENC28J60のCLKOUTからAVRのクロックをもらうことが考えられます。ただしENC28J60とAVRのリセットが共通なのでAVRをISPしようとして、リセットがLになるとENC28J60からのクロックも止まってしまうので、ISPできなくなってしまいます。
3.3VのATMega168は13.3MHzまで動作するはずなので、25MHzの半分の12.5MHzを入力するのがよさそうです。
一番速いのは、もっとリビジョンの新しいENC28J60を入手することです。Errataを見るとB7というリビジョンもあるみたいです。こちらではB6のENC28J60を売っています。
後でJUN猫さんがどうしているのか調べてみるつもりです。
なんか色々思い悩んでいますが、とりあえず動いてるからいいのかな。