MachiKania

MachiKaniaでI2C接続 紹介編

2017年3月4日

MachiKania type N 及び type Zで使える、I2C接続のためのBASICコードを作成しました。実行中の動画は、次のリンク先で見ることが出来ます。
https://twitter.com/kats_me/status/802376453098590209(MachiKaniaのディスプレイ上の表示が、若干異なる可能性があります。)

I2C接続のためのテストには、Microchip社のMCP23017を使用しました。これは、汎用のI/Oポートを持ったICで、I2C接続で用いることが出来ます。回路図は、以下の通りです(2017-03-12、変更)。
2017-03-12-s1.png
MachiKaniaへの接続は、PIC32MXのRB7及びRB10を用います。それぞれ、16番及び21番ピンで、down/upボタンに接続されています。MCP23017の使用方法については、Microchipの説明書(PDFファイル)を参照して下さい。

MachiKania type Nでは、I2Cnauplia.txtを、type ZではI2Czoea.txtを使用してください(コードのダウンロードは、記事最後のリンクから)。サンプルコードでは、GPA0に接続したLEDの点滅と、GPB0-GPB7からの8ビットデーターの読み込みを行なっています。ライセンスは共にパブリックドメインとしましたので、自己責任の元、改変してご自由にお使いください。使用の際には、type Nでは"REM I2C routine for MachiKania Nauplia"以降のコードを、type Zでは"REM I2C routine wrapper for MachiKania"以降のコードをコピーして使うことになると思います。

以下、サブルーチンの呼び出し方法について述べます。

type Z(Zoea)用のサブルーチン

以下、ソースコードのコメント部分です。
REM I2C routine wrapper for MachiKania
REM Zoea ver 0.4
REM Written by Katsumi
REM This code is in public domain.
REM 
REM This code requres I2C routine for
REM Nauplia.
REM 
REM Subroutines:
REM   I2CZIN: Initialize I2C peripheral
REM   I2CZEN: End using I2C
REM   I2CZ  : Send data to I2C
REM           Parameters must end either
REM           -1 or -2
REM             -1: STOP communication
REM             -2: Read 1 bytes and
REM                 STOP communication
REM                 with NAK
REM             -3: Do repeated START
REM   These subroutines do not destroy
REM   variables.
3つのサブルーチンがあります。これらのサブルーチン呼び出しで、変数が破壊されることはありません。I2CZINは、I2C機器に接続する時に、一度だけ呼び出す物です。I2CZENは、I2C機器とのやりとりがすべて終了し、接続を解除する場合に呼び出して下さい。I2CZは、I2C機器とのやりとりのために、繰り返し呼び出すサブルーチンです。サンプルプログラムでは、5箇所、呼び出しているコードがあります。そのうちの2箇所(出力及び入力)に付いて、説明します。

18行目当り:
REM Initialize MCP23017 and set GPA0
REM for output
REM Send address: 0x00 for IODIRA
REM Send data for IODIRA: 0xfe for
REM output at GPA0
gosub I2CZ,0x40,0x00,0xFE,-1
ここでは、MCP23017で用いられているGPA0を、出力に変更する命令を送っています。MCP23017のA0, A1, A2(15, 16, 16番ピン)を共にGNDに接続しているため、最初の0x40は書き込み命令です(読み込み命令の場合は、0x41)。次の0x00がアドレス指定(IODIRAを指定)で、最後の0xFEが書き込むデーターです。GPA0のみを出力にするため、0xFEを書き込んでいます。最後の-1を引数として指定し、STOPシグナルを出力します。

50行目当り:
  REM Read from GPB
  REM Send address: 0x13 for GPIOB
  REM Restart and send control byte for
  REM read
  print hex$(gosub(I2CZ,0x40,0x13,-3,0x41,-2))
ここではGOSUB()関数を用い、戻り値を得るようにします。読み込みをする前にまず、アドレス指定をするために出力から開始しています。0x40を送出し、アドレスを0x13(GPIOB)にセットします。次に、-3を指定します。これは、"Repeated Start"と呼ばれる操作です。0x41で読み込みを指定し、-2でNAKモードで1バイトだけ読み込みます。なお、ACKモードで複数バイトを読み込む動作はサポートしていません。ACKモードを使用したい場合は、以下に述べる、type N用のサブルーチンを利用して下さい(type Z用のコードにも含まれています)。

type N(Nauplia)用のサブルーチン

Nauplia用のサブルーチンは、Zoea用よりもより細かなレベルでの制御を行なっています。以下、ソースコードのコメント部分からの抜粋です。
REM Subroutines:
REM   I2CINI: Initialize I2C peripheral
REM   I2CEND: End using I2C
REM   I2CS  : Start signal
REM   I2CP  : Stop signal
REM   I2C8BD: Send 8 bit data in D and reveive in E (-1 if failed)
REM   I2C8RA: Read 8 bit in E and send ACK
REM   I2C8RN: Read 8 bit in E and send NAK
REM   All routines destroy B. I2C8BD, I2CRA, and I2C8RN also destroys E.
7つのサブルーチンがあります。これらのサブルーチン呼び出しで、変数B, D, Eが破壊されるので、注意して下さい。最初の4つのサブルーチンは、接続開始・終了・Startシグナル・Stopシグナルの送出です。 I2C8BDは、8ビットデーターの出力の際に使用します。I2C8RAとI2C8RNは入力用ですが、ACKシグナルかNAKシグナルのどちらを出力するかで、使い分けて下さい。Nauplia用サブルーチンの使い方の詳細は、技術編の記事に譲ることにします。

追記(3/12/2017)

Ver 0.5を配布しました。回路図の変更及び修正を行なっています。クロックラインをRB10に、データーラインをRB7に接続する形に変更しました。

Twitterで、gombeさんから指摘を頂いたのですが、ver 0.4は、PIC32MX150F/PIC32MX170Fで使用できるものの、PIC32MX250F/PIC32MX270Fでは使用できません(RB10が 5Vトレラントでないため)。250F/270Fで使う場合は、I2Cクライアント側の電圧を3.3 Vで使用するか、以下のようにRB10にN-MOSをつないで下さい。
2017-03-12-s2.png

なお、以下のようにプルアップ抵抗を3.3 vに接続しても、とりあえず動作することを確認しました。
2017-03-12-s3.png
ただし、MCP23017のデーターシートでは、5 Vで使用した時にHレベルの入力として4 V以上を確実な動作として要求するため、規格外の使用方法になります。この辺りは、使用するI2Cクライアントの石の種類によって異なると思います。

ダウンロード

MachiKania用I2Cコードのver 0.4は、ここからダウンロードできます。
MachiKania用I2Cコードのver 0.5は、ここからダウンロードできます。
ライセンスは、パブリックドメインです。

コメント

コメントはありません

コメント送信