TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430间的I2C通信

大家好,我想试试两块MSP430之间的通信,以下是TI给出的示例代码:

//******************************************************************************
//  MSP430G2xx3 Demo – USCI_B0 I2C Master RX single bytes from MSP430 Slave
//
//  Description: This demo connects two MSP430's via the I2C bus. The master
//  reads from the slave. This is the master code. The data from the slave
//  transmitter begins at 0 and increments with each transfer. The received
//  data is in R5 and is checked for validity. If the received data is
//  incorrect, the CPU is trapped and the P1.0 LED will stay on. The USCI_B0
//  RX interrupt is used to know when new data has been received.
//  ACLK = n/a, MCLK = SMCLK = BRCLK = default DCO = ~1.2MHz
//
//                                /|\  /|\
//               MSP430G2xx3      10k  10k     MSP430G2xx3
//                   slave         |    |        master
//             —————–   |    |  —————–
//           -|XIN  P1.7/UCB0SDA|<-|—+->|P1.7/UCB0SDA  XIN|-
//            |                 |  |      |                 | 32kHz
//           -|XOUT             |  |      |             XOUT|-
//            |     P1.6/UCB0SCL|<-+—–>|P1.6/UCB0SCL     |
//            |                 |         |             P1.0|–> LED
//
//  D. Dang
//  Texas Instruments Inc.
//  February 2011
//   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
//******************************************************************************
#include "msp430g2553.h"

unsigned char RXData;
unsigned char RXCompare;

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1OUT &= ~BIT0;                           // P1.0 = 0
  P1DIR |= BIT0;                            // P1.0 output
  P1SEL |= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
  P1SEL2|= BIT6 + BIT7;                     // Assign I2C pins to USCI_B0
  UCB0CTL1 |= UCSWRST;                      // Enable SW reset
  UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
  UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
  UCB0BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz
  UCB0BR1 = 0;
  UCB0I2CSA = 0x048;                        // Slave Address is 048h
  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
  IE2 |= UCB0RXIE;                          // Enable RX interrupt
  RXCompare = 0;                            // Used to check incoming data

  while (1)
  {
    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent
    UCB0CTL1 |= UCTXSTT;                    // I2C start condition
    while (UCB0CTL1 & UCTXSTT);             // Start condition sent?
    UCB0CTL1 |= UCTXSTP;                    // I2C stop condition
    __bis_SR_register(CPUOFF + GIE);        // Enter LPM0 w/ interrupts

    if (RXData != RXCompare)                // Trap CPU if wrong
    {
      P1OUT |= BIT0;                        // P1.0 = 1
      while (1);                            // Trap CPU
    }

    RXCompare++;                            // Increment correct RX value
  }
}

// USCI_B0 Data ISR
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
  RXData = UCB0RXBUF;                       // Get RX data
  __bic_SR_register_on_exit(CPUOFF);        // Exit LPM0
}

我想问的问题是:

(1)在这上面设置的从机的地址0x048,但是对于MSP430来说,它的地址为什么是这个?我知道对一些器件,它可以通过对地址线加上不同的电平来定义地址线,那430的地址如何设置?

(2)在对从机写数据时,并没有写对应的地址,只告诉从机地址,它这些数据存储在哪?难道是在从机代码中来处理接收的数据。

Shi JianHua:

我没有调试过此类的程序,我调试的都是从机的设备,都固化有从机地址,但是你是两个单片机,那中间的iic协议你不是可以自己定义么?只不过是数据传输套用iic通讯格式而已,至于在哪里存取数据,就是到你指定的内存,一般是单片机解析地址信息后到相应的地方去数据,然后返回吧。

wszqq:

没用过,但从经验上分析看。从机地址0x048是用户自己定义的。当I2C总线上主机发送数据,地址写0x048时从机才有反应,否则从机不响应。相当于人为设置一个从机地址,这样比以前用的用过地址线设置地址更方便,效果是一样的。

至于问到对从机写入数据,数据存储到什么地方,那要看你430从机部分程序怎么写了。数据也不一定要存储的,通讯也可以啊

Ping Li1:

(1) 从机的地址0x48是根据从机的设置的,你看一下对应的从机程序里,地址设置的为0x48。你想要什么地址,就可以在从机程序设置什么地址(最好与其它的EEPROM等有差别)。

(2)从机需要对主机发送过来的数据进行处理或保存。

我也在做两CPU用I2C通信,但还没有调试好。

Nightingale:

已测试过,丛机地址是自己定义的,只不过通信时,要保证主机程序中的丛机地址和自己定义的相同。

赞(0)
未经允许不得转载:TI中文支持网 » MSP430间的I2C通信
分享到: 更多 (0)