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

MSP430F247的I2C使用

如何设置相关寄存器?有例程吗?

Hardy Hu:

//******************************************************************************

//  MSP430x24x Demo – USCI_B0 I2C Slave TX single bytes to MSP430 Master

//

//  Description: This demo connects two MSP430's via the I2C bus. The master

//  reads from the slave. This is the slave code. The TX data begins at 0

//  and is incremented each time it is sent. An incoming start condition

//  is used as a trigger to increment the outgoing data. The master checks the

//  data it receives for validity. If it is incorrect, it stops communicating

//  and the P1.0 LED will stay on. The USCI_B0 TX interrupt is used to know

//  when to TX.

//  ACLK = n/a, MCLK = SMCLK = default DCO = ~1.045Mhz

//

//                                /|\  /|\

//               MSP430F249       10k  10k     MSP430F249

//                   slave         |    |        master

//             —————–   |    |  —————–

//           -|XIN  P3.1/UCB0SDA|<-|—+->|P3.1/UCB0SDA  XIN|-

//            |                 |  |      |                 |

//           -|XOUT             |  |      |             XOUT|-

//            |     P3.2/UCB0SCL|<-+—–>|P3.2/UCB0SCL     |

//            |                 |         |                 |

//

//  B. Nisarga

//  Texas Instruments Inc.

//  September 2007

//  Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.42A

//******************************************************************************

#include "msp430x24x.h"

unsigned char TXData;

void main(void)

{

 WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

 P3SEL |= 0x06;                            // Assign I2C pins to USCI_B0

 UCB0CTL1 |= UCSWRST;                      // Enable SW reset

 UCB0CTL0 = UCMODE_3 + UCSYNC;             // I2C Slave, synchronous mode

 UCB0I2COA = 0x48;                         // Own Address is 048h

 UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation

 UCB0I2CIE |= UCSTTIE;                     // Enable Start condition interrupt

 IE2 |= UCB0TXIE;                          // Enable TX interrupt

 TXData = 0xff;                            // Used to hold TX data

 while (1)

 {

   __bis_SR_register(CPUOFF + GIE);        // Enter LPM0 w/ interrupts

 }

}

// USCI_B0 Data ISR

#pragma vector = USCIAB0TX_VECTOR

__interrupt void USCIAB0TX_ISR(void)

{

 UCB0TXBUF = TXData;                       // TX data

 __bic_SR_register_on_exit(CPUOFF);        // Exit LPM0

}

// USCI_B0 State ISR

#pragma vector = USCIAB0RX_VECTOR

__interrupt void USCIAB0RX_ISR(void)

{

 UCB0STAT &= ~UCSTTIFG;                    // Clear start condition int flag

 TXData++;                                 // Increment data

}

Hardy Hu:

在www.ti.com//mcu/docs/mcuproductcontentnp.tsp?sectionId=95&familyId=342&tabId=3357

下面的code example中可以下载到更多的相关例程

zhibin li:

回复 Hardy Hu:

我用示波器观察SCL和SDA两根线的波形,在发出开始标志时只有SCL被拉低了,而且不会回到高电平状态,这是怎么回事?

Hardy Hu:

回复 zhibin li:

正常的操作时序是,START发了后SDA先拉低并保持,再是SCL拉低,IIC的数据在SCL的正平区间有效,而且需要在SCL正平区间内,SDA保持稳定。

建议你先断开receiver,看transmitter发送address是否正确,再接上receiver,看收到了什么数据,用示波器抓ACK和后面出错的波形。IIC等同步串行总线是receiver与transmitter双方面交互进行数据传输的,调试需要一步一步走

赞(0)
未经允许不得转载:TI中文支持网 » MSP430F247的I2C使用
分享到: 更多 (0)