请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP-EXP430G2
尝试使 I2C 传输在 MSP-EXP430G2上正常工作。 需要将 SMCLK 以~100kHz 的频率连接到 SCL。 我将一个逻辑分析仪连接到 SDA 和 SCL、并连接了4.7K 外部上拉电阻。 启动时、这两个信号都保持高电平。 我当前未连接 I2C 从器件、因此我希望发送的从器件地址不包含 ACK。
如果逻辑分析仪仅连接到 SCL 和 SDA、我将看到以下行为。 红色= SCL、白色= SDA:
我在 while 循环开始处的断点处停止代码。 我将逻辑分析仪连接到 P1.4上设置的 SMCLK 输出引脚、并保留 SDA 和 SCL 的连接。我看到下面的输出。 红色= SCL、白色= SDA:
我是否在时钟或 I2C 配置中遗漏了某个东西?
我的完整代码如下所示:
#include <msp430G2113.h> unsigned char TXData; unsigned char TXByteCtr; int main(void) { WDTCTL = WDTPW+WDTHOLD; BCSCTL1 = CALBC1_1MHZ; DCOCTL = CALDCO_1MHZ; BCSCTL2 |= SELM_1 | DIVM_0 | DIVS_0; P1DIR |= BIT4; P1REN = 0; P1SEL |= 0xC0; P1SEL2 |= 0xC0; P1SEL |= BIT4; P1SEL2 &= ~BIT4; UCB0CTL1 |= UCSWRST; // Enable SW reset UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode UCB0CTL1 |= UCSSEL_2; // Use SMCLK, keep SW reset UCB0BR0 = 10; // fSCL = SMCLK/10 = ~100kHz UCB0BR1 = 0; UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation IE2 |= UCB0TXIE; // Enable TX interrupt TXData = 0x01; // Holds TX data UCB0I2CSA = 0x10; // Slave Address is 0x10 while (1) { TXByteCtr = 1; // Load TX byte counter while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition __bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts // Remain in LPM0 until all data // is TX'd TXData++; // Increment data byte } } //------------------------------------------------------------------------------ // The USCIAB0TX_ISR is structured such that it can be used to transmit any // number of bytes by pre-loading TXByteCtr with the byte count. //------------------------------------------------------------------------------ #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector = USCIAB0TX_VECTOR __interrupt void USCIAB0TX_ISR(void) #elif defined(__GNUC__) void __attribute__ ((interrupt(USCIAB0TX_VECTOR))) USCIAB0TX_ISR (void) #else #error Compiler not supported! #endif { if (TXByteCtr) // Check TX byte counter { UCB0TXBUF = TXData; // Load TX buffer TXByteCtr--; // Decrement TX byte counter } else { UCB0CTL1 |= UCTXSTP; // I2C stop condition IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag __bic_SR_register_on_exit(CPUOFF); // Exit LPM0 } }