2010年10月11日月曜日

UARTとI2C モジュールの作成

カメラは再度購入することにした。
カメラコントローラのデバッグ時にI2Cコントローラが必要になる。また、その制御は最初のうちはUART経由でPCから行うことになる。そこで、物が入手できるまでこれらコントローラの作成を行うことにした。

- 通信フレーム
  PC - FPGA間の通信は以下のような通信フレームで行う。
  FPGAはcommand frameに対してACK(受信成功時), NAK(受信失敗時)応答を返す。


   // UART I/F
   //
   // [frame format]
   // 
   // *command frame (PC -> FPGA)
   //   +---+---+---+---+---+---+---+---+
   //   |STX|CMD| B3| B2| B1| B0|ETX|SUM|
   //   +---+---+---+---+---+---+---+---+
   // 
   //   command_frame := {STX, CMD, B3, B2,
   //                         B1, B0, ETX, SUM}
   //   STX   := 0x02
   //   CMD   := {cmd_rw, cmd_addr[6:0]}
   //   B3    := cmd_data[31:24] 
   //   B2    := cmd_data[23:16] 
   //   B1    := cmd_data[15: 8] 
   //   B0    := cmd_data[ 7: 0] 
   //   ETX   := 0x03
   //   SUM   := sum[7:0]
   //            sum = STX + CMD + B3 + B2
   //                           + B1 + B0 + ETX
   //
   // *response data (FPGA -> PC)


   //   response := ACK | NAK
   //   ACK   := 0x06
   //   NAK   := 0x15
   //
   // *readback frame (FPGA -> PC)

   //   +---+---+---+---+---+---+---+---+
   //   |STX|TYP| B3| B2| B1| B0|ETX|SUM|
   //   +---+---+---+---+---+---+---+---+
   // 
   //   response_frame := {STX, TYP, B3, B2,
   //                          B1, B0, ETX, SUM}
   //   STX   := 0x02
   //   TYPE  := rd_typ[7:0]
   //   B3    := rd_data[31:24] 
   //   B2    := rd_data[23:16] 
   //   B1    := rd_data[15: 8] 
   //   B0    := rd_data[ 7: 0] 
   //   ETX   := 0x03
   //   SUM   := sum[7:0]
   //            sum = STX + CMD + B3 + B2
   //                           + B1 + B0 + ETX
   // 


I2Cコントローラはシングルアクセスのみサポートとしたが、連続アクセスにも容易に変更できる構造にした。
出来上がったUART, I2Cコントローラと以下のプログラムでSpartan3A Starter Kitの電源IC  LP3906のレジスタ(LDO1VCR, LDO2VCR)をリードしてみた。
Starter Kitの回路図によればLDO1は3.3V(レジスタ値はデータシートによれば0x17), LDO2は1.8V(同0x08)なので、正しくリードできている。
(今回作成したI2CとUARTモジュールはここで公開している。)















0 件のコメント:

コメントを投稿

自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...