2013年1月25日金曜日

NeXtPino と eXodusino で ストリナI2Cコンパス(HMC6352)

 前回のNeXtPino と eXodusino との組み合わせで、I2Cを試してみました。まずは、簡単なストリなのI2Cコンパス(HMC6352)を試してみました。


 当初、うっかり、アナログ入力端子4, 5 にSDAとSCLを接続していたんですが、eXodusino のデフォルトのI2C端子はArduino UNO R3等で 13pin, GND, AREF の先に拡張された SDA, SCL の部分に LPC1114 の P0.5/SDAとP0.4/SCL が接続されています。


 以下、ソースですが、eXodusino に Wire.read() が無く、以前の Wire.receive() 関数になっています。LPCXpresso に eXodusino のプロジェクトをインポートして user_apploication.cpp を書き換えます。

//#define _ARDUINO
//#define _RXDUINO
#define _EXODUSINO

#ifdef _RXDUINO
#include <rxduino.h>
#endif
#ifdef _EXODUSINO
#include <libmary.h>
#include <stdio.h>
#endif
#ifdef _ARDUINO
#include <Arduino.h>
#endif

#include <Wire.h>


#define COMPASS_ADDRESS (0b0100001)

// グローバル変数。
const bool DEBUG_ON = true;

void setup()
{
 // I2Cバス初期化。
 Wire.begin();

 // シリアルポート(USB)初期化。
 Serial.begin(9600);
    Serial.println("\r\nStart...");

    // 待機。
    delay(500);
}

void loop()
{
 short buf[2];
 unsigned short data;

 // コンパスへのI2C通信開始。
 Wire.beginTransmission(COMPASS_ADDRESS);
 // Get Data コマンド送信。
 Wire.write('A');
 // キューの送信。
 Wire.endTransmission();

 // データ要求。
 Wire.requestFrom(COMPASS_ADDRESS, 2);
 // データ受信。
 for (int i = 0; i < 2; i++)
 {
  while (Wire.available() == 0);
#ifdef _EXODUSINO
  buf[i] = Wire.receive();
#else
  buf[i] = Wire.read();
#endif

 }

 // データ変換。
 data = (unsigned short)buf[0];
 data = (data << 8) + (unsigned short)buf[1];

 Serial.println(data, DEC);

 delay(200);
}

bootloader を書き込んで、printfデバッグするのは問題ないんですが、LPC-Link で一度書込すると次からLPC-Linkが繋がらなくなります。なので、LPC-Linkのデバッグもできませんでした。
 おそらく、自分のプロジェクトの設定が間違っていると思うんですが、SWDIOとかSWCLKのポートの設定でLPC-Linkが使えない状態になるのではないかと思ってます。この場合は、 Flash Magic を使用して、改めて bootloader なり、他のプログラムを書き込めば復旧します。NeXtPino では LPC1114 の P0.1 がDigital_1(2ピン目)に出ているので、これをGNDに落とした状態でリセットをかけると USB経由で Flash Magic での書き込みができるはずです。自分は LPC1114 自体を引きぬいて、トラ技についていた MyARM 基板に差し替えて書き換えを行いました。