udrv の仕様(qfn32samples-13 版) BUS版と SPI版 HOST とのインターフェイスは 2 種類ある。LCD で良く使われる 8080 バス仕様と SPI 仕様。 BUS 版。自作モジュールのピン配置を示す。 // XO2-256 UDRV XO2-256 // 27 DP 1 24 VCC // 28 DM 2 23 ENABLE 25 // 29 nRD 3(TMS) 22 nBUSY 23 // 30 nWR 4(TCK) 21 CLK_OUT 21 // 32 DB0 5(TDI) 20 CLK_4X 20 // 1 DB1 6(TDO) 19 nDATA_ERR 17 // 4 DB2 7 18 nIRQ 16 // 5 DB3 8 17 N.C. (JTAGENB) // 8 DB4 9 16 nDATA_RDY 14 // 9 DB5 10 15 nCS 13 // 10 DB6 11 14 RS 12 // GND 12 13 DB7 11 (JTAGENBを除いて)1つのピンも余らない。コンフィグデータを書き込むときには、JTAGENB を H にして、JTAG ポートから書き込む。 // _ ____________________________________ _____ // RS _><____________________________________><_____ // // _____ _______ // nCS |________________________________| // // ______________ _____________ // nWR/nRD |_____________| // // WRITE: _________________ // DB[7:0] ----------------<_________________>-------- // |---| CLK_4X (MAX) // |---------------------| CLK_4X x 2 (MIN) // // READ: _____________ // DB[7:0] --------------<_____________>---------- // // |-| gate level delay アクセスのタイミング。こう定義はしたが、RS は、nWR/nRD を L にしたときに 確定していれば良い。nCS は、単なる出力コントロールなので、nRD と 同時に 変化させても構わない。 nWR は、普通 posedge で採取するものなのだが、内部クロックに同期して採取 しているので無理。negedge から間をおいて採取になる。negedge から CLK_4X の 1T (Full-speed なら 20.8 ns) 以内に WRITE データを確定させないといけ ない。そこから 最小 1T 確定させておかなければならない。 Low-Speed なら 1T が 167 ns にもなる。注意が必要。 RS は、A0 とも表記される レジスタ選択。L:データ/H:コントロール BUS 版を 一応は作ってみたが、実際に使うことは想定していない。 実際に使うのは、SPI 版 // XO2-256 UDRV SPI XO2-256 // 27 DP 1 24 VCC // 28 DM 2 23 ENABLE 25 // 29 nCS(2) 3(TMS) 22 nBUSY 23 // 30 SCK(2) 4(TCK) 21 CLK_OUT 21 // 32 MOSI(2) 5(TDI) 20 CLK_4X 20 // 1 MISO(2) 6(TDO) 19 nDATA_ERR 17 // 4 7 18 nIRQ 16 // 5 8 17 N.C. (JTAGENB) // 8 9 16 nDATA_RDY 14 // 9 MISO 10 15 nCS 13 // 10 MOSI 11 14 RS 12 // GND 12 13 SCK 11 ピン配置は、こうした。(2) と書いてあるのは、第二の選択。 JTAG のポートを空けるならば、オリジナルのピン配置にする。ただ、SPI を通してコンフィグもやりたい(できる)なら、(2) の方が便利。 SPI自体のビットレートには制限はあまりない。FIFO とのハンドシェークが制限 になるだけ。SPI では、FIFO を CLK (12MHz) で駆動している。ハンドシェーク に 4 CLK かけるとすると 24 MHz が上限。FIFO のクロックを CLK_4X にすれば、 96 MHz までいく。(FPGA の SCK の上限はもっと高い) 共通のピンの説明 DP/DM USB の D+/D- 。Low-Speed デバイスは、DMを 1.5 K でプルアップする。 Full-Speed デバイスは DP の方。FPGA の ピン設定では、抵抗値が高く 役に立たないので注意。 HOST 向けでは、両方をプルダウンする。こちらは、FPGA の ピン設定で良い。 現状では、Low-Speed/Full-Speed の両方には対応できない。 CLK_4X/CLK_OUT Full-Speed では、48 MHz , Low-Speed では 6MHz を CLK_4X に入力する。 CLK_OUT は、反転出力で水晶を直付け可能なように配慮。 nDATA_RDY 受信データがあるときに L になる。受信ハンドシェーク用。 nIRQ 割り込み線として使う。フロー制御付き。(後ろで説明) ENABLE プルアップ制御用。 Full-Speed では、DP - 1.5K - ENABLE Low-Speed では、 DM - 1.5K - ENABLE とする。 nBUSY/nDATA_ERR RS=1 で READ すれば、同じ情報が読めるので必須ではない。これらは、     LED とかでのモニタ用として一応 残してある。 nBUSY は、送信・受信がまさに動作しているとき L 。 nDATA_ERR は、CRC_ERROR か FIFO_FULL が起きたとき L 。 define と parameter 変更可能だと思っているものについて説明しておく。 (define) USE_SPI SPI にするか BUS にするかの選択。( USE_BUS は常に define で構わない ) (define) SUPPORT_ENABLE DP/DM の pull-up 制御用出力。 (parameter) SUPPORT_CRC5S=0 デバイスでは、CRC-5 を使う トークンパケットを出さないので、 CRC-5 生成は不要。 ホストでも CRC-5 込みの トークンパケットを出すことで不要になる。 SUPPORT_CRC5S=1 とすると CRC-5 データを付加するが、僅かに規模が増える。 Full-Speed 用 (parameter) FS=1 (parameter) FIFO_DEPTH = 5 Low-Speed 用 (parameter) FS=0 (parameter) FIFO_DEPTH = 4 Low-Speed では、SOP のみの送信をサポートする。規模が増えるので、 FIFO を減らすことで対処する。 Full-Speed 用の FIFO は 32 バイト。最大パケットサイズ 32 を想定しているが、 MCU 側の 応答時間+転送速度によっては、もっと大きなパケットにも対応可能。 逆に 32バイトのパケット全部は FIFO に入らない。送信時にちょっと細工 がいる。 データ送受信 BUS 版では、 RS=0 としてデータを書けば FIFO に入り、読めば FIFO のデータを読める。 FIFO が溢れれば nDATA_FULL が L になり、FIFO をリセットするまで FULL 状態が維持される。 データがないのに読めば、前のデータが読める。nDATA_RDY を見ての ハンドシェークが必要。 SPI では、 (送受信モード = 0 のとき) RS=0 として データを書けば FIFO に入る。 DATA_FULL の動作は同じ。 (送受信モード = 1 のとき) RS=0 として データを読めば FIFO のデータ を読める。nDATA_RDY との関係は同じ。 送受信モード, FIFO リセット については、次で説明する。 コントロールレジスタ RS=0 にして書き込むことで 以下の状態を制御する。 0x83 送受信モードを 1 (受信モード) 0x80 送受信モードを 0 (送信モード) 0x81 送信要求を 1 (送信モード+送信スタート) 0x84 プルアップを OFF (ENABLE = L) (切断するときに使用する) RS=0 にして読み込むと以下の状態が読める。 bit7: CRC_ERROR bit6: DATA_FULL bit5: UNDER_HALF bit4: DATA_RDY bit3: BUSY (送受信 動作中) bit2: IRQ bit1: 送受信モード (0: 送信 / 1: 受信)  bit0: 送受信要求 (1: スタート / 0: 完了) 送信では、送受信モード=0 にしてから、FIFO にデータを送る。ある程度 送ったら 送信要求=1 。残りのデータを FIFO にデータを送る。 UNDER_HALF が フロー制御用 FIFO データ量が 約1/2 以下だと 1。 IRQ は、割り込み用の信号。     受信では、FIFO のデータ量が 1/2 を超えるか、送信完了で L 。     送信スタート前では、データ量が 1/2 を超えると L     送信スタート後では、データ量が 1/2 以下になると L     ( 送信スタート時に データ量が 1/2 以下だと L )   CRC_ERROR は、受信時のエラーで CRC-5 / CRC-16 に対応   次の受信が始まるとリセットされる。 DATA_FULL は、FIFO 溢れエラーで、 送受信モードを送信に切り替えるたときと、次の受信が始まったときに リセットされる。 BUSY 正に 送信・受信をしているときに 1 。 エラー・データ採取の際に 1 になっていると期待した値ではなくなっている。 --------------------------------------------------------------------------