「MachiKaniaでI2C接続」の技術的なことに関するメモ。0.5に基づいて記述されている。I2C接続のBASICコードのSVNレポジトリーは、こちら。https://osdn.net/users/kmorimatsu/pf/kmbasic/scm/tree/head/applications/trunk/i2c/主に、I2Cnauplia.txtで記述しているコードについて、解説したい。以下の図の黒字で記述された部分は、I2C仕様書からの引用である。このシグナルを、BASICコードでどの様にして扱っているかについて(赤字での記述)、述べる。PIC32ペリフェラルへのBASICコードからのアクセスコード中で、コメントを以下のように書いた。BASICのコード中では、配列を記述する方法で、以下の例のようにアクセスすることが可能である。B=0xBF886110B(2)=gosub(I2CCLK)+gosub(I2CDAT)B(9)=gosub(I2CCLK)+gosub(I2CDAT)この例では、TRISBSETに0x0480を、LATBCLRに0x0480を出力している(gosub(I2CCLK)は0x0400を、gosub(I2CDAT)は0x0080を返す)。RB7とRB10の両方を読み込みに設定し、LATB7とLATB10をLに設定するためのコードである。PORTBからの読み込みも、以下の例のように、「B(4)」の値を読み込むことで可能である。I2CWH2PORTB10からの読み込み値に従って、分岐している。I2Cシグナル作成I2Cで1ビットのデーター部分処理部分をピックアップすると、以下のようになる。kHzとする実装にした。μ秒の時間を掛けることになる。μ秒の待ち時間を儲ける必要がある。この時間待ちルーチンを、以下のように記述した。μ秒待ちのコードのアセンブリは、以下のようなものである。$v0,$v0,0xffff2倍の時間待ちのルーチンも、同様の物である。これに従い、Lシグナルを1ビット送出するルーチン(I2CWL)は、以下のような仕様にした。μ秒待ちまた、Hシグナルを1ビット送出するルーチン(I2CWHR)は、以下のような仕様。1ビット読み込みも兼ねている。μ秒待ちこれらのルーチンが、完全なI2Cシグナルにどう対応するのかは、最初の図を参照して頂きたい。StartシグナルとStopシグナルも、同様に、I2CSとI2CPで作成される。Startにも対応している。記述が簡潔な、Zoea用のコードを取り上げて説明する。出力は、例えば次のコードのように実装している。0xFEの3バイトのコードが送出される。1バイトごとにACKシグナルが返されることを確認している。最後に、-1のところでI2CPサブルーチンが呼ばれて、Stopシグナルが送出される。入力は、次のコードのように実装している。Startシグナルを送る。続けて0x41で読み込みモードに指定し、最後に-2でNAKモードの1バイト読み込みを行なう。SYSTEMステートメントでビデオ出力を停止すれば、最大速度で接続する事が出来る。