シングルチップマシンソフトウェアシミュレーションSPIインタフェース-SPIバスプロトコルの理解を深める

2503 ワード

シングルチップマシンソフトウェアシミュレーションSPIインタフェース-SPIバスプロトコルの理解を深める
SPI(Serial Peripheral Interfacerシリアル外付けインタフェース)はモトローラ社が発売した同期シリアル通信インタフェースで、マイクロプロセッサFlashROM、A/Dコンバータ、D/Aコンバータ、LED/LEDディスプレイドライバ、I/Oインタフェースチップ、リアルタイムクロック、UARTトランシーバなどは、ユーザーの周辺拡張に極めて柔軟で安価な選択を提供しています.SPIバスインタフェースはマイクロプロセッサの4つのI/Oポートラインしか占有しないため、SPIバスインタフェースを採用することで回路の計り知れないことを簡略化することができ、多くの従来の回路におけるインタフェースデバイスとI/Oポートラインを節約し、設計の信頼性を高めることができる.ここで、AT 89 C 205 lモノリシックマシンシミュレーションSPIバス動作シリアルEEPROM 93 CA 6を例に、図1に示すように、モノリシックマシンのI/Oポートを用いたソフトウェアシミュレーションSPIバスの実現方法を紹介する.ここでは、読み取りコマンドのタイミングとアプリケーションサブルーチンのみについて説明します.
93 C 46メモリSPIバスの動作原理
93 CA 6はスレーブデバイスとして、そのSPIインタフェースは、シリアルクロック線(SK)、出力データ線DO、入力データ線DI、およびハイレベル有効スレーブ選択線CSの4本のI/Oポート線を使用する.そのデータの伝送フォーマットは、上位(MSB)が前、下位(LsB)が後である.93 C 46のSPIバスインタフェース読み出しコマンドタイミングを図2に示す.
ソフトウェアシミュレーションSPIインタフェースの実現方法
SPIシリアルバスインタフェースを持たないAT 89 C 2051チップマシンの場合、ソフトウェアを使用してSPIの動作をシミュレートすることができる.図1には、AT 89 C 2051チップマシンとシリアルEEPROM 93 C 46とのハードウェア接続図が示されている.ここで、P 1.0はSPIホストデバイスのデータ出力端子SDOをシミュレートし、P 1.2はSPIのクロック出力端子SCKをシミュレートし、P 1.3はSPIのスレーブ選択端子SCSをシミュレートし、P 1.1アナログSPIのデータ入力SDI.電源投入リセット後、まずP 1.2(SCK)の初期状態を0(アイドル状態)に設定します.読み出し操作:AT 89 C 2051は、まずP 1.0ポートを介して1ビット先頭ビット(1)、2ビット操作コード(10)、6ビットの読み出されたデータアドレス(A 5 A 4 A 3 A 2 A 1 A 0)を送信し、その後P 1.1ポートを介して1ビット空席(0)を読み出し、その後l 6ビットデータ(上位)を読み出す.書き込み操作:AT 89 C 2051は、まずP 1.0ポートを介して1ビット先頭ビット(1)、2ビット操作コード(01)、6ビット書き込みデータアドレス(A 5 A 4 A 3 A 2 A 1 A 0)を送信し、その後P 1.0ポートを介して書き込みl 6ビットデータ(上位が上位)を送信し、書き込み操作の前に書き込み許可コマンドを送信し、書き込み後に書き込み禁止コマンドを送信する.書き込み許可操作(WEN):書き込み操作は、まず、1ビット開始ビット(1)、2ビット操作コード(00)、6ビットデータ(11 XXXX)を送信する.
書き込み禁止操作(WDS):書き込み操作は、まず、1ビット先頭ビット(1)、2ビット操作コード(00)、6ビットデータ(00 XXXX)を送信する.
以下、SPIをC 51でシミュレートするサブルーチンについて説明する.
//     I/O 
sbit SDO=P1^0;
sbit SDI=P1^1;
sbit SCK=P1^ 2;
sbit SCS=P1^3;
sbit ACC_7= ACC^7;
unsigned int SpiRead(unsigned char add)
{
	unsigned char i;
	unsigned int datal6;
	add&=0x3f;/*6   */
	add |=0x80;/*    l0*/
	SDO=1;/*  1    */
	SCK=0;
	SCK=1;
	for(i=0;<8;i++)/*        */
	{
		if(add&0x80==1)
			SDO=1;
		else 
			SDO=0;
		SCK=0;/*          */
		SCK=1;
		add<<= 1;
	}
	SCK=1;/*              ,  1   */
	SCK=0;
	datal6<<= 1;/* 16   */
	for(i=0;<16;i++)
	{
		SCK= 1;
		_nop_();
		if(SDI==1)
			datal6|=0x01;
		SCK =0;
		datal6< < =1;
	}
	return datal6;
}
は、異なるシリアルインターフェース周辺チップについて、クロックタイミングが異なる.上記サブプログラムは、SCKにおける立ち上がりエッジ入力(受信)データと立ち下がりエッジ出力(送信)データに対するデバイスである.これらのサブプログラムは、シリアルクロック)の立ち上がりエッジ入力および立ち下がりエッジ出力の他の様々なシリアル周辺インタフェースチップにも適用され、P 1.2(SCK)の出力レベル順序をプログラムで変更して調整すればよい.