FrontPage

2008/10/21 からのアクセス回数 13163

I2Cマスターが正常に動作したので、今度はI2Cスレーブの動作確認をします。 マスターのところで、つまずいてHCS08マイコンでIC2マスターを組み立てたので これを利用してI2C通信のテストをすることにしました。(災い転じて福となす)

回路の説明

ATmega88とHCS08の接続は、以下の通りです。

0.jpg

スレーブのプログラム

スレーブの処理は、TWIによる割り込み処理で行われ、AVRlibでは割り込み時に呼ばれる コールバックルーチンを登録します。

します。

割り込み処理の間はUARTのデバッグプリントが使えない

当然のことですが、やはり間違えてしました。割り込み処理は、できるだけ短時間で割り込み 元にリターンする必要があるので、UARTを使ったデバッグプリントが使えません。

そこで、グローバル変数cmdにデバッグプリントの命令をセットし、mainの無限ループで データのチェックプリントを出力することにしました。

プログラムソース

I2Cスレーブの処理は、

  1. I2Cの初期化
  2. スレーブのアドレスをセット
  3. I2C通信の受信と送信時のコールバック関数を登録

だけです。

することにします。

プログラムソースは以下の通りです。

#include "global.h"		// include our global settings
#include "uart.h"		// include uart function library
#include "rprintf.h"	// include printf function library
#include "i2c.h"		// include i2c support

#define LOCAL_ADDR	(0x05<<1)
#define	CB_W	(0)	// send from master
#define CB_R	(1) // read by master

char	cmd=0;
u08	localBuffer[20];
u08	localBufferLength;

// slave operations
void i2cSlaveReceiveService(u08 receiveDataLength, u08* receiveData)
{
	int i;
	
	cmd = 'r';	
	
	// copy the received data to a local buffer
	for(i=0; i<receiveDataLength; i++)
	{
		localBuffer[i] = *receiveData++;
	}
	localBufferLength = receiveDataLength;
}

u08 i2cSlaveTransmitService(u08 transmitDataLengthMax, u08* transmitData)
{
	cmd = 't';
	
	transmitData[0] = 0x0D;
	transmitData[1] = 0xE0;
	localBufferLength = 2;
	
	return localBufferLength;
}

int main(void)
{	
	int i;
	int c;
	
	uartInit();
	uartSetBaudRate(9600);
	rprintfInit(uartSendByte);
	rprintf("Start I2C Salve\n");
	
	i2cInit();
	i2cSetLocalDeviceAddr(LOCAL_ADDR, FALSE);
	i2cSetSlaveReceiveHandler( i2cSlaveReceiveService );
	i2cSetSlaveTransmitHandler( i2cSlaveTransmitService );
	
	rprintf("wait master call\n");
	
	while(1) {
		if (cmd == 'r') {
			rprintf("recieve data: ");
			for(i=0; i<localBufferLength; i++)
			{
				rprintf("%x", localBuffer[i]);
			}
			rprintf("\n");
			cmd = 0;
		}
		else if (cmd == 't') {
			rprintf("transmit dummy data\n");
			cmd = 0;
		}
	}

	return 0;
}

操作確認

実際に接続して動かしてみると

$jerm -b 9600 -p none -s 1 -d 8 /dev/u.usbserial-A5002yHm 
途中省略
Start I2C Salve
wait master call
recieve data: 000400E0
recieve data: 0000
transmit dummy data

と出力される。rprintfの%xは、2バイト分を出力するので、実際には04E0を受信しています。

コメント

この記事は、

選択肢 投票
おもしろかった 0  
そうでもない 0  
わかりずらい 3  

皆様のご意見、ご希望をお待ちしております。


(Input image string)

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc