カメラコントローラのデバッグ時に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)
// +---+---+---+---+---+---+---+---+
// +---+---+---+---+---+---+---+---+
//
// 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モジュールはここで公開している。)
(今回作成したI2CとUARTモジュールはここで公開している。)
0 件のコメント:
コメントを投稿