I2C 32bit-DIO
32ビットデジタル入力・出力を備えたI2Cスレーブのサンプルコードです。
I2Cマスターによるバスアクセスを監視し、7ビットデバイスアドレスが自身のアドレス(外部から設定
可能)と一致すると、内部レジスタへのリードライトを行いつつ、I2Cスレーブとして応答します。
あくまでI2Cからリードライト可能なレジスタを複数構成する、というのが主眼のサンプルであり、DIO部
には特別な機能は付けていません。オマケ的なものです。
I2Cバススピードは、100kHz以下のスタンダードモードと400kHz以下のファストモードに対応
しています。内部レジスタは、アクセスするレジスタを選択するためのアドレスレジスタ、32ビット入力値
を読み出すための8ビットレジスタ4本、そして32ビット出力値を設定するための8ビットレジスタ4本の
合計9本で構成されています。これら内部レジスタにアクセスする際は、レジスタを複数持つI2Cスレーブ
でよく見られる通り、まずアドレスレジスタにライトしてアクセス対象のレジスタを指定し、その後で
ライトする・あるいはリードするという2段階のアクセスが必要です。
連続アクセス時にアドレスレジスタを自動的にインクリメント・またはデクリメントする機能は搭載して
いません。必要な方はご自身で追加下さい。
なお本コードでは、I2Cバスラインの負荷が大きく、信号の立ち上がり時間がデバイスの許容範囲を超えて
大きいこと(I2C規格上、立ち上がり時間はスタンダードモードで1usまで、ファストモードで300nsまで
許されており、条件によってはFPGA/CPLDに直結できないケースが多々あります)を想定し、I2Cの
SDA、SCLを外部のシュミットインバータで受け、その出力をFPGA/CPLDに接続する前提としています。
もし負荷が小さく、特にケアが必要ない場合には、I2Cバスと直結しつつ、コード中のSDA・SCLの
インバート部分を単なるバッファ回路へ変更してご使用下さい。
I2Cマスターによるバスアクセスを監視し、7ビットデバイスアドレスが自身のアドレス(外部から設定
可能)と一致すると、内部レジスタへのリードライトを行いつつ、I2Cスレーブとして応答します。
あくまでI2Cからリードライト可能なレジスタを複数構成する、というのが主眼のサンプルであり、DIO部
には特別な機能は付けていません。オマケ的なものです。
I2Cバススピードは、100kHz以下のスタンダードモードと400kHz以下のファストモードに対応
しています。内部レジスタは、アクセスするレジスタを選択するためのアドレスレジスタ、32ビット入力値
を読み出すための8ビットレジスタ4本、そして32ビット出力値を設定するための8ビットレジスタ4本の
合計9本で構成されています。これら内部レジスタにアクセスする際は、レジスタを複数持つI2Cスレーブ
でよく見られる通り、まずアドレスレジスタにライトしてアクセス対象のレジスタを指定し、その後で
ライトする・あるいはリードするという2段階のアクセスが必要です。
連続アクセス時にアドレスレジスタを自動的にインクリメント・またはデクリメントする機能は搭載して
いません。必要な方はご自身で追加下さい。
なお本コードでは、I2Cバスラインの負荷が大きく、信号の立ち上がり時間がデバイスの許容範囲を超えて
大きいこと(I2C規格上、立ち上がり時間はスタンダードモードで1usまで、ファストモードで300nsまで
許されており、条件によってはFPGA/CPLDに直結できないケースが多々あります)を想定し、I2Cの
SDA、SCLを外部のシュミットインバータで受け、その出力をFPGA/CPLDに接続する前提としています。
もし負荷が小さく、特にケアが必要ない場合には、I2Cバスと直結しつつ、コード中のSDA・SCLの
インバート部分を単なるバッファ回路へ変更してご使用下さい。
※特に注記のない限り、信号は全て正論理です。
本ソースコードはVerilogを用意しています。
詳細は下記の資料ダウンロードをクリックください。
詳細は下記の資料ダウンロードをクリックください。