2008/10/21 からのアクセス回数 13455
I2Cマスターが正常に動作したので、今度はI2Cスレーブの動作確認をします。 マスターのところで、つまずいてHCS08マイコンでIC2マスターを組み立てたので これを利用してI2C通信のテストをすることにしました。(災い転じて福となす)
ATmega88とHCS08の接続は、以下の通りです。
スレーブの処理は、TWIによる割り込み処理で行われ、AVRlibでは割り込み時に呼ばれる コールバックルーチンを登録します。
します。
当然のことですが、やはり間違えてしました。割り込み処理は、できるだけ短時間で割り込み 元にリターンする必要があるので、UARTを使ったデバッグプリントが使えません。
そこで、グローバル変数cmdにデバッグプリントの命令をセットし、mainの無限ループで データのチェックプリントを出力することにしました。
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を受信しています。
この記事は、
皆様のご意見、ご希望をお待ちしております。