工具/软件: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);
}
}
}