This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430F5529:MSP_F5529 I2C问题

Guru**** 2608425 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/654811/ccs-msp430f5529-msp_f5529-i2c-problem

部件号:MSP430F5529

工具/软件:Code Composer Studio

大家好

我想使用带有MPU6060 _SENSOR的I2C通信,但我使用的是MSP430_F5529的I2C,我遇到了一些问题。

问:当我的f5529进入I2C中断时,它的TX可以工作,但RX无法获取任何数据。

我发布了我的计划,希望大家都能帮助我看到。 Thx。

#include <MSP4S.h>

unsigned char rx_data[6];
unsigned char Tx_data[2];
未签名的char rx_ByteCtr;
无符号的char Tx_ByteCtr;

内部xAccel;
Int yAccel;
内部zAccel;

unsigned char slaveAddress = 0x68;
const unsigned char PWR_Mgmt_1 = 0x6B;// MPU-6050寄存器地址
const unsigned char ACCEL_XOUT_H = 0x3B;// MPU-6050寄存器地址
const unsigned char ACCEL_XOUT_L = 0x3C;// MPU-6050寄存器地址
const unsigned char ACCEL_UTED_H = 0x3D;// MPU-6050寄存器地址
const unsigned char ACCEL_UTED_L = 0x3E;// MPU-6050寄存器地址
const unsigned char ACCEL_ZOUT_H = 0x3F;// MPU-6050寄存器地址
const unsigned char ACCEL_ZOUT_L = 0x40;// MPU-6050寄存器地址

void i2cInit (void);
void i2cWrite(unsigned char);
void i2cRead (无符号字符);

int main (void){
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

P3SEL |= 0x03;
i2cInit();

slaveAddress = 0x68;
TX_DATA[1]= 0x6B;
TX_DATA[0]= 0x00;
TX_BYTECtr = 2;
i2cWrite (slaveAddress);

而(1){
//slaveAddress = 0x68;// MPU-6050地址
TX_DATA[0]= 0x3B;//注册地址
TX_BYTECtr = 1;
i2cWrite (slaveAddress);

slaveAddress = 0x68;// MPU-6050地址
RX_ByteCtr = 6;
i2cRead (slaveAddress);
xAccel = Rx_data[5]<< 8;// MSB
xAccel |= Rx_data[4];// lsb
yAccel = Rx_data[3]<< 8;// MSB
yAccel || rx_data[2];// lsb
zAccel = Rx_data[1]<< 8;// MSB
zAccel || rx_data[0];// lsb
}
}
void i2cInit (void)

UCB0CTL1 |= UCSWRST;
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;
UCB0CTL1 = UCSSEL_2 + UCSSWRST;
UCB0BR0 = 12;
UCB0BR1 = 0;
UCB0CTL1 &=~UCSWRST;
}
void i2cWrite (无符号字符地址)

__disable_interrupt ();
UCB0I2CSA =地址;
UCB0IE |= UCTXIE;
While (UCB0CTL1和UCTXSTP);
UCB0CTL1 || UCT+UCTXSTT;
__bis_sr_register (GIE);
}
void i2cRead (无符号char地址)

__disable_interrupt ();
UCB0I2CSA =地址;
UCB0IE |= UCRXIE;
While (UCB0CTL1和UCTXSTP);
UCB0CTL1 &=~UCTR;
UCB0CTL1 || UCTXSTT;
__bis_sr_register (GIE);
}
#pragma vector = USI_B0_vector
__interrupt void USI_B0_ISR(void)

IF (UCB0CTL1和UCTR)

IF (TX_ByteCtr)

UCB0CTL1 || UCTXSTP;
TX_ByteCtr --;
UCB0TXBUF = TX_DATA[TX_ByteCtr ];
}
否则

UCB0CTL1 || UCTXSTP;
UCB0IFG &=~UCTXIFG;
__BIC_SR_REGISTER_ON_EXIT (CPUOFF);
}
}
否则

RX_ByteCtr --;
IF (Rx_ByteCtr)

Rx_data[Rx_ByteCtr ]= UCB0RXBUF;
IF (Rx_ByteCtr == 1)
UCB0CTL1 || UCTXSTP;
UCB0IFG &=~UCRXIFG;
}
否则

Rx_data[Rx_ByteCtr ]= UCB0RXBUF;
__BIC_SR_REGISTER_ON_EXIT (CPUOFF);
}
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Yiming:

    完成写入后清除UCTXIE位,以停止发生进一步的传输中断。 您还需要等到总线收到所有字节后,才能退出i2cRead功能,方法是输入LPM0或检查要发送的停止位。 您应该使用逻辑分析仪或示波器来监控您的通信线路。

    此致,
    Ryan