UPduino を昨年少し触っていてある程度使い勝手がわかったのですべて自分で設計した基板を動かしはじめました. いまのところは programming の部分で停滞しているのでその先の動作にはまだ至りません.
FT232H と ADbus
UPduino では FT232H を利用していましたので、秋月電子の AE-FT232HL を利用します. FT232H からは AD7:0 を ICE40 につなぎます.
ADbus と SPI flash
programmer は CRESET_B を制御し, ICE40 を停止し SPI で flash memory に書き込むことができます. 配線は下記となります.
AD 0 - SCK 1 - SDI 2 - SDO 3 - (未使用) 4 - SS 5 - (未使用) 6 - CDONE 7 - CRESET-B
ICE40 は restart 後に回路データを取りに行くために SPI で flash memory に読み込みます. SPI のピン番号は ICE40 から指定されているのでユーザーが自由に決められません. ユーザーの回路データを読み込んだあとは SPI のピンは自由に IO として利用できますが、flash memory の誤動作を防ぐために SS (CS) は完全に自由には利用できません.
ADbus と JTAG
ICE40 では内部ロジックアナライザ(reveral)を利用し JTAG にて通信ができます. ADbus の配線は下記となります.
AD 0 - TCK 1 - TDI 2 - TDO 3 - TMS 4 から 7 - 未使用
これらはユーザーの回路データを読み込んだあとに有効になります. JTAG のピンはユーザーが自由に決められます. 他種ではあまりみられない気がします.
内部ロジックアナライザは任意のもので、他の計測手段があり限界までピン数を使いたいとなればなしにできます.
SPI と JTAG の同居 (簡易版)
ここからが問題となります. この似たような2種類のピンで重複する xCK, xDI, xDO を同じピン番号に割り振ると1つの FT232H で両方利用できます. できますが、ユーザー回路で SPI flash memory が全く使えなくなります.
ADbus から SPI と JTAG の分離/結合
現在停滞している部分です. 1つの FT232H で自動に切り替える回路を模索中です. これらの回路は汎用ロジックを組み合わせるのが現状マシな状態です. GAL などの簡易PLDは開発環境が古すぎて動作が安定しないとか、供給側がまともなサポートをしておらずたぶん10年前のほうが便利でいまは逆に技術が退化している気がしています.
話がそれてしまいました. 3つのモードの切り替えは今の所下記を考えています.
FT232H から SPI bus を触る場合は下記とします.
- AD0 -> SCK, AD1 -> SDI, AD4 -> SS は tristate buffer で出力を制御
- AD2 <- SDO は selector で入力を選択
FT232H から JTAG を触る場合は下記とします.
- AD0 -> TCK, AD1 -> TDI は共有だが制御ゲートなしでいいと思う(まだ未確認)
- AD2 <- TDO は selector で入力を選択
- AD3 -> TMS は共有はないので直結
立ち上がり検出は register (74HC74)を注文中でそれが届き次第ブレッドボードに差し込んで確認しますが、 tristate buffer (74HC244) と selector (74HC157) は配線済みでそれら経由での SPI bus の制御はできています.
ただ 74HC series を Vcc = 3.3V で動作させてるので伝搬遅延が無視できなくなり TCK Divider Setting >= 2 で動作します.
このような状態で標準的なプログラマがないので自身がプログラマを開発しているのが現状です. 専用基板には 74HC series は使いませんけど、本来の回路の開発にできないのは楽しくありません. なぜだが知りませんが Radiant Programmer は PC から操作をして 10 秒から 15 秒の待機時間があるのも楽しくありません.