//****************************************************** // パケットフォーマット //****************************************************** 1命令単位を udpl パケットと呼ぶことにする。 udpl パケット = [header][payload] 先頭1バイトはヘッダで、ペイロード長を示す。残りがペイロードで、命令内容を示す payload = [command][option] ペイロードの先頭1バイトで命令の種類を示す。残りが命令の詳細を示す 最小の udpl パケットは以下のものになる。受信側は何もしない。 0x00 最大の udpl パケットは以下のようになり、このときの長さは 256 バイトとなる 0xFF, PAYLOAD[0], ... PAYLOAD[254] 応答も、上記のパケットフォーマットに従う --------------------- 命令仕様 命令種類 command 1) レジスタ書き込み 0x00 2) ウェイト 0x01 3) バス書き込み 0x02 4) レジスタ読み込み 0x04 5) クロック設定 0x08 6) インターフェイス確認 0x80 7) インターフェイスリセット 0x90 8) 設定読み出し 0x40 9) 設定書き込み 0x50 10) I2C 読み出し 0x20 11) I2C 書き込み 0x30 ●レジスタ書き込み A0 と WRを制御し、アドレスとデータを書き込む [packet] 0x06, 0x00, 0xnm, ADDR, DATA, WAIT1, WAIT2 (7byte 固定) n(ハーフバイト)= スロット番号を指定 -> CS に反映される m(ハーフバイト)= bit で A0-A3を指定 [A3][A2][A1][A0] : [A0]は無視され、アドレスを書き込む時は A0=0、データ書き込み時は A0=1 となる。 ADDR = アドレス出力 DATA = データ 出力 WAIT1 = アドレス書き込み後のウェイト[us] WAIT2 = データ書き込み後のウェイト[us] [no reply] ●ウェイト 指定時間処理を停止する [packet] 0x04, 0x01, m, (byte0), (byte1) (5byte固定) m = mode : 0 us単位 1 ms単位 byte[1..0] = ウェイト時間[us/ms] (リトルエンディアン) [no reply] ●バス書き込み WR = 0 を実行する [packet] 0x04, 0x02, 0xnm, DATA, WAIT (5byte 固定) n(ハーフバイト)= スロット番号を指定 -> CS に反映される m(ハーフバイト)= bit で A0-A3を指定 [A3][A2][A1][A0] DATA = D0-D7 出力 WAIT = WR=0 でアサートする時間を [us] で指定する。 [no reply] ●レジスタ読み出し A0 と WR, RDを制御し、アドレスを書き込んでデータを読み込む [packet] 0x04, 0x04, 0xnm, ADDR, WAIT (5byte 固定) n(ハーフバイト) = スロット番号を指定 -> CS に反映される。 m(ハーフバイト) = bit で A0-A3を指定 [A3][A2][A1][A0] : アドレス書き込み時は A0=0 となる。RD=0 のときには [A0] で指定された値が反映される。 ADDR = アドレス出力 WAIT = アドレス書き込み後のウェイト[us] [reply] 0x03, 0x04, n, DATA n = 対象のスロット番号 DATA = 読みだしたデータ ●クロック設定 指定スロットのクロックを設定する [packet] 0x06, 0x08,0xwn, (byte0), (byte1), (byte2), (byte3) (7byte 固定) w(ハーフバイト)= PLL のロックを待つかどうか... 0x8 = 待たない, 0x0 = 待つ n(ハーフバイト)= スロット番号 byte[3..0] = 設定するクロック (リトルエンディアン) [no reply] ●インターフェイス確認 応答を返す [packet] 0x01, 0x80 (2byte 固定) [reply] 0x03, 0x80, 'W', 'P' ●リセット 指定されたスロットに対して IC = 0 を実行する [packet] 0x02, 0x90, 0x0m (3byte 固定) m = bit でスロットを指定する [slot3][slot2][slot1][slot0] [reply] 0x03, 0x90, 'O', 'K' ●設定読み出し ボードに保存されている設定を読み出す [packet] 0x03+k , 0x40, n, m, PARAMETER[0]..PARAMETER[k-1] (可変長) n = 0 : ボードの設定 1 : SLOT0 の設定 2 : SLOT1 の設定 3 : SLOT2 の設定 4 : SLOT3 の設定 n == 0 の時 m = 0 : ファームウェアバージョン 1 : スロットの物理数 2 : ボードの有効・無効 3 : UDP 受信ポート 4 : コマンド遅延 5 : バッファサイズ 6 : 名前 7 : IPv4 アドレス 8 : IPv6 アドレス 9 : MDNS 有効・無効 10 : UDP 送信ポート 11 : ハートビート間隔 12 : I2C デバイス検知 ... PARAMTER[0] = I2C アドレス n != 0 の時 m = 0 : スロット有効・無効 1 : PLL 有効・無効 2 : ハードウェアリセット要求有効・無効 3 : 初期クロック 4 : 名前 5 : 追加情報 [reply] k + 3, 0x40, n, m, DATA[0] ... DATA[k-1] (可変長) n = command で指定された n m = command で指定された m k = 読みだしたデータ長 DATA = 読みだしたデータ(数値はリトルエンディアン) ●設定書き込み ボードの設定をする。設定の変更は動作中のみ有効で、eeprom には保存されない。 [packet] k + 3, 0x50, n, m, DATA[0]..DATA[k-1] (可変長) 現在は以下のみ設定可能 n = 0 : ボードの設定 m =10 : UDP 送信ポート k = 2 : 書き込むデータ長 DATA[1..0] = 設定するポート番号。0 の時、eeprom に設定された初期値に戻す(リトルエンディアン) [reply] 0x05, 0x50, 0x00, 10, DATA[0], DATA[1] DATA[1..0] 設定したポート番号。command で指定した値が 0 の時、それまで設定されていたポートに応答する。0 以外の時、新しく設定したポートに応答を返す。 ●I2C読み出し 外部I2C を読み出す。 [packet] k + 3, 0x20, addr, n, DATA[0]...DATA[k-1] (可変長) addr = スレーブアドレス n = 読み出すバイト数。プロトコル仕様上、最大値は 254 k = 書き込むバイト数。プロトコル仕様上、最大値は 252 DATA[0..k-1] = k >= 1 の時、DATA を書き込んで STOP する。その後読み出しを実行する [reply] n + 1, 0x20, DATA[0] .. DATA[n-1] DATA[0..n-1] 読みだしたデータ ●I2C書き込み 外部I2C に書き込む [packet] k + 2, 0x30, addr, DATA[0]...DATA[k-1] (可変長) addr = スレーブアドレス k = 書き込むバイト数。プロトコル仕様上、最大値は 253 DATA[0..k-1] = 書き込むテータ [no reply]