忍者ブログ

Azukish

消えゆく世界と流れる未来に最後の灯を since 2006/4/3

2016/12/22

MSP430とArduinoをI2Cでつなぐ(危険?)

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。
楽なんだが、楽では無い(特にジャンパのところが・・・)

拍手

コメント













カウンター

カレンダー

04 2017/05 06
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

アーカイブ

AD

Azkishはamazon.co.jpを宣伝しリンクすることによって サイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。