8ピンAVRでI2Cのスレーブが作れないか調べてみたところTinyWireSというライブラリが見つかった。
QiitaにもTinyWireSを試された記事がありました。
自分のArduino IDEは1.0.6のままだが、ATTiny85などをboards.txtに加えてExamplesのattiny85_i2c_slaveが問題なくビルドできた。
書き込みはAVRを始めた頃に作った、USBtinyISPを使った。
ところがArduinoをマスターにしてスキャンしてみるとACKは返ってくるのだがデータを読んでも255しか返ってこない。TinyWireSのgithubのissueにも似たような不具合の報告があったが、Ardunoを使ったら良いんじゃないかと、ちょっと的外れな回答だった。
Fuseの設定(ブートローダーを書き込む)も調べたが8M内部クロックで問題ないようだった。
いろいろ試したところ、スレーブの方のsetup()でTinyWireS.send()でダミーデータを放り込んでおくとなんとなく動くようだった。
Arduinoのマスターの方は、とりあえず1を書いておいて、4バイト読み込むとDEADBEEFが読み込めた。
このワークアラウンドはたまたま動いているだけだと思うが、動かなかった事は事実で、根本的には何か問題があるのだと思う。
ATTiny85はuartが無くprintfデバッグも出来ないので、信号線をロジアナで確認してデバッグしてみました。上記の図でCH4がrequestEvent()が呼ばれたタイミングで反転するようにしてみたのだが、何故か1バイト目の送信の前には呼ばれないようです。本来呼ばれるべきなんだと思うのですが、何が悪いのかは分かりません。
開発に使った、EZ-USB FX2とUSB tiny ISPとびんぼうでいいのです。ブレッドボードの右側のモジュールは確認用のEPSONのI2C RTCです。