
MAX_IIでI2Cスレーブを試す
投稿日 2014/02/10
CPLD/FPGAを使用するに当たりI2Cは避けて通れません。(と、勝手に思ってます。)
今回はALTERAのCPLD MAX_IIにI2Cスレーブをインプリメントし、PSoC5LPをI2Cマスターにして動作を確認しました。

写真:MAX_II CPLDをI2CスレーブにしてPSoC5LPから制御する
といっても、MAX_II側はほとんど自作した部分はありません。
ALTERAのApplication Note 494を参考に、デザイン・ファイルをダウンロードしてコンパイルすれば、すぐに試すことができます。
I2Cマスター側は、今回PSoC5LPを使用しましたが、PIC等なんでも構いません。
AN494のデザイン・ファイルはI2CでGPIO_Input, GPIO_Outputをコントロールできるようになっていますが、今回はGPIO_Outputのみ確認しています。ちなみにプログラムはVerilog HDLで記述されています。
大まかな手順は、
1.MAX_II側に、デザインファイルのプログラムをピン配置を設定してコンパイルし、書き込む。
これでMAX_IIをI2Cスレーブにして起動しておく。
2.PSoC側でI2Cマスターを組込み、データを周期的にI2Cスレーブに送る
3.MAX_IIはデータを受け取ってGPIOに出力する。
GPIOには7seg LEDのようなものをつなぎたいところですが、今回はbit0にLEDを1個つないだだけのシンプルな実験です。
MAX_II側の手順は以下の通りです
①ALTERAのホームページからAN494のデザイン・ファイルをダウンロードして展開します。
②いくつかのフォルダーがありますがquartusフォルダーの内容を、適当なフォルダーにコピーします。
③Quartus_IIを立ち上げ、既存プロジェクトとしてquartusフォルダーに在るI2C_to_GPIO.qpfファイルを開きます。
④I2C_to_GPIO.vを開いて、15行目位にあるスレーブ・アドレスを設定します。
変更前 arameter slave_address = 7'h00; // can be changed as per the protocol
変更後 arameter slave_address = 7'hAA; // can be changed as per the protocol
今回は0xAAにしました。
⑤Pin PlannerでGPIO_output[0]にアサインされているピンを確認し、そこに電流制限抵抗を付けたLEDをGNDとの間に接続しておきます。今回使用したボードLC STUDIOはピン77にLEDが実装されていますのでピン77にしました。
⑥コンパイルし、Programmerで書き込みます。
⑦SCL, SDA, GNDを接続します。SCLはピン39, SDAはピン40となっています。

写真:ピンを変更 GPIO_Output[0]をピン77に変更

写真:スレーブ・アドレスを0xAAに変えてコンパイルした状態
PSoC5LP側は、PSoC5LP I2C LCDをつないでみるが参考になりますが、今回の実験ではLCDは必要ありませんので省略できます。
メインプログラム(main.c)にMAX_IIのスレーブのアドレス(0xAA)を設定し、
I2C_MAX_II_WriteChar()関数を呼び、データをI2C経由でMAX_IIに送るだけです。
MAX_II側には最下位ビット(GPIO_output[0])のみにLEDを接続したので、変数iをインクリメントして8ビットデータのbit0の1/0を交互に反転させLEDを点滅させます。
関連部分を抜粋(LCD部分は省略)すると、
#define MAX_II_SLAVE_ADDRESS 0xAA //MAX_IIと合わせておく
void I2C_MAX_II_WriteChar(char8 databyte){
I2C_1_MasterSendStart(MAX_II_SLAVE_ADDRESS, 0);
Delay(1);
I2C_1_MasterWriteByte(databyte);
Delay(1);
I2C_1_MasterSendStop();
Delay(1);
}
void I2C_MAX_II_Init(void){
//Nothing to do
}
int main(){
uint8 i;
CyIntSetSysVector(15, (cyisraddress)SysTick_Handler);
SysTick_Config(BCLK__BUS_CLK__HZ/1000);
CYGlobalIntEnable;
I2C_1_Start();
I2C_LCD_Init();
I2C_MAX_II_Init();
I2C_LCD_WriteString(0, 0, "MAX II I2C Test " );
for( ;; ){
I2C_MAX_II_WriteChar(i); //toggle bit0 0<->1
i++;
Delay(500); //every 500ms
}
}
I2C_MAX_II_Init()は用意してありますが、何もすることがありません。
GPIO_Output[0]につないだLEDが0.5秒ごとに点滅したら成功です。
このI2CスレーブはCPLD/FPGAをマイコンに接続する場合に便利に使えます。
(JF1VRR)