2017/2/19追記:
MSP430が3.3V系で、Arduino Unoが5V系なので、直結すると破損するかも知れないです。
自分の場合は「たまたま」うまくいったのですが、安全に使いたい場合はレベル変換回路あるいはICを別途用意してください。
参考:3.3V 5V レベル変換
カテゴリーをどっちにしようか迷ったけれど、MSP430の方が苦労したし、Arduinoは情報が豊富なので、MSP430関係にした。
参考:
Arduinoを30分でI2C通信する - Qiita
I2C Wire Library not working with G2553 LP · Issue #486 · energia/Energia · GitHub
前置き:プルアップ抵抗が必要なのか、3.3VをArduino側から取るべきなのか、MSP430側から取るべきなのか、などとよく分からなかったけれど、なんとなく動いているので、今は特に考えないことにする。
まず、P1.6のところにあるジャンパ(LEDとP1.6をつないでる奴)を外す。
これができてなくて、LED→GNDに電流を全部引っ張られてたらしく、Arduinoにデータが行かなかったか、Arduinoからデータが来なかったらしい。一日かかった・・・
で、
・MSP430のP1.6とArduinoのSCLをつなぐ。
・MSP430のP1.7とArduinoのSDAをつなぐ。
・MSP430のVCCとP1.7を適当な抵抗(4.7kΩとか1kΩとか?)を通じてつなぐ。
・MSP430のVCCとP1.6を上と同じ値の抵抗を通じてつなぐ。
・MSP430のGNDとArduinoのGNDをつなぐ。
これで準備オーケー。
Arduinoのスケッチで次を書く。で、実行。
#include <Wire.h>
void setup()
{
Serial.begin(9600);
Wire.begin();
}
void loop()
{
Serial.println("start");
Wire.beginTransmission(0x48);
Serial.println("a");
Wire.write('z');
Serial.println("b");
Wire.endTransmission();
Serial.println("written");
delay(500);
}
CCS開いて次を書く。最近v7になったらしい。
#include <msp430g2553.h>
volatile unsigned char RXData;
int main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1SEL |= BIT6 + BIT7;
P1SEL2|= BIT6 + BIT7;
UCB0CTL1 |= UCSWRST;
UCB0CTL0 = UCMODE_3 + UCSYNC;
UCB0I2COA = 0x48;
UCB0CTL1 &= ~UCSWRST;
IE2 |= UCB0RXIE;
while (1)
{
__bis_SR_register(CPUOFF + GIE);
__no_operation(); // *****
}
}
// USCI_B0 Data ISR
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
RXData = UCB0RXBUF;
__bic_SR_register_on_exit(CPUOFF);
}
で、// *****と打ったところの行の、行番号の左側をダブルクリックして、ブレイクポイント(青い丸みたいなの)を表示させておく。
虫マーク押してデバッグ。
[View]→[Expressions]で変数を見ることのできるウィンドウが開く。
そのウィンドウで右クリック。[Add Global Variables]→RXDataを選択。
で、再生ボタン押してプログラム実行。
うまくいけば、// *****の行で停止して、RXDataにArduinoから送られてきた'z'=0x7a=122が入っているはず。
今回は、Arduinoをマスターで書き込み、MSP430をスレーブで読み込みにしてみた。スレーブのアドレスは0x48を使っている。
MSP430のP1.6およびP1.7はSELとSEL2に1を立てておくとI2Cモードになってくれるみたい。
これを指定したらあとは割り込みをEnableにして、割り込みの関数を書くだけでおk。
楽なんだが、楽では無い(特にジャンパのところが・・・)