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/MSP430G2553:MSP430G2553与加速计(MPU-6050)的连接出现问题。

Guru**** 2536740 points
Other Parts Discussed in Thread: MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/663966/ccs-msp430g2553-having-trouble-interfacing-the-msp430g2553-with-an-accelerometer-mpu-6050

部件号:MSP430G2553

工具/软件:Code Composer Studio

e2e.ti.com/.../5.2187万.main.c

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//库控制I2C USCI模块
//编写人:Pham van Thuan DTVT07-K55
//电子邮件:terran99.1992万@gmail.com
//博客:   http://thuanbk55.blogspot.com/
//.................................................................
//用于MSP430
//************************************************************************************************** /

#include <msp430g2553.h>
#include <MSP430.h>
#ifndef I2C_USI_H
#define I2C_USI_H

// Address
#define MPU6050_address 0x68
#define BQ3.2万_address 0x68
#define DS1307_address 0x68
#define LM92_address 0x48
/************************************************************************************************************************************************************************************************************************************************. \
* 原型 *
******************** /
void Byte_USI_Init(unsigned char addr);//Init





Write void I2C_USI_Set_Address(unsigned char addr);//更改从属地址char I2C_USI_READ_Byte(unsigned char address);//读取1字节//读取多个unsigned char字节/u2I2C_USCH_Read_Word (unsigned char,unsigned char,unsigned char,unsigned char,dr,u2I2I2I,unsigned char,unsigned char,unsigned char,unsigned char,unsigned char,dr,d
\
* 功能 *
******************** /


void I2C_USI_Init(unsigned char addr){

P1SEL || BIT6 + BIT7; //将I2C引脚分配给USI_B0
P1SEL2|= BIT6 + BIT7; //将I2C引脚分配给USI_B0
UCB0CTL1 |= UCSWRST; //启用软件重置
UCB0CTL0 = UCMST+UCMODE_3+UCSYNC; // I2C主控,同步模式
UCB0CTL1 = UCSSEL_2+UCSSWRST; //使用SMCLK,保持软件重置
UCB0BR0 = 40; // fSCL = SMCLK/40 =~400kHz
UCB0BR1 = 0;
UCB0I2CSA =地址; //设置从属地址
UCB0CTL1 &=~UCSWRST; //清除SW复位,恢复操作
}

void I2C_USI_Set_Address(unsigned char addr)
{
UCB0CTL1 |= UCSWRST;
UCB0I2CSA =地址; //设置从属地址
UCB0CTL1 &=~UCSWRST; //清除软件重置,恢复操作
}

unsigned char I2C_USI_READ_Byte (unsigned char address)
{
同时(UCB0CTL1和UCTXSTP);
UCB0CTL1 || UCTR + UCTXSTT; // I2C TX,START

while (!(IFG2&UCB0TXIFG));
UCB0TXBUF =地址;

while (!(IFG2&UCB0TXIFG));

UCB0CTL1 &=~UCTR; // I2C RX
UCB0CTL1 || UCTXSTT; // I2C重新启动
IFG2 &=~UCB0TXIFG;

期间(UCB0CTL1和UCTXSTT);
UCB0CTL1 || UCTXSTP;
返回UCB0RXBUF;
}

unsigned char I2C_USI_READ_Word (unsigned char Addr_Data,unsigned char *数据,unsigned char长度)
{
无符号char i=0;
同时(UCB0CTL1和UCTXSTP); //循环直到I2C STT被发送
UCB0CTL1 || UCTR + UCTXSTT; // I2C TX,启动条件

while (!(IFG2&UCB0TXIFG));
IFG2 &=~UCB0TXIFG; //清除USI_B0 TX int标志
IF (UCB0STAT和UCNACKIFG) RETURN UCB0STAT;
UCB0TXBUF =地址数据;

while (!(IFG2&UCB0TXIFG));
IF (UCB0STAT和UCNACKIFG) RETURN UCB0STAT;

UCB0CTL1 &=~UCTR; // I2C RX
UCB0CTL1 || UCTXSTT; // I2C启动条件
IFG2 &=~UCB0TXIFG; //清除USI_B0 TX int标志
期间(UCB0CTL1和UCTXSTT); //循环直到I2C STT被发送
用于(i=0;i<(长度-1);i++)
{
同时(!(IFG2和UCB0RXIFG));
IFG2 &=~UCB0TXIFG; //清除USI_B0 TX int标志
Data[i]= UCB0RXBUF;
}
同时(!(IFG2和UCB0RXIFG));
IFG2 &=~UCB0TXIFG; //清除USI_B0 TX int标志
UCB0CTL1 || UCTXSTP; //第一个TX之后的I2C停止条件
Data[Length-1]= UCB0RXBUF;
IFG2 &=~UCB0TXIFG; //清除USI_B0 TX int标志
返回0;
}

unsigned char I2C_USI_Write_Byte (unsigned char地址,unsigned char数据)
{
同时(UCB0CTL1和UCTXSTP);
UCB0CTL1 || UCTR + UCTXSTT;

while (!(IFG2&UCB0TXIFG));
IF (UCB0STAT和UCNACKIFG) RETURN UCB0STAT;
UCB0TXBUF =地址;


while (!(IFG2&UCB0TXIFG));
IF (UCB0STAT和UCNACKIFG) RETURN UCB0STAT;
UCB0TXBUF =数据;

while (!(IFG2&UCB0TXIFG));
IF (UCB0STAT和UCNACKIFG) RETURN UCB0STAT;
UCB0CTL1 || UCTXSTP;
IFG2 &=~UCB0TXIFG;
返回0;
}
#endif /* I2C_USCI */

我遇到的错误是:  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    我看了一下你的代码,它似乎缺少main()。 这是否是您所看到的问题的一部分? 您是否发送了整个源代码?如果不发送,能否发送其他源文件以便我查看整个项目?
    通常,错误#1.0234万-D和#1.001万表示定义代码中使用的符号/函数的库的include路径/变量缺失/错误。 请将整个控制台输出发送给我,它应该提供更多细节,说明哪些符号仍未解析。

    谢谢,此致,

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

    自此之后,您上次通过电子邮件发送时,我对代码做了一些更改,但这一个包含了一个主代码。 你是否介意看看这一个,看看你是否看到任何突出的问题?  我再次尝试将msp430G2553与MPU-6050连接起来。  

    /*
    * I2C_Accel_MPU6050
    *
    版本1:连续读取原始加速计X,Y和Z数据
    *
    * WFP 1.6					UCB.S.
    * 1.7	WFP					UCB0SDA
    *
    MPU-6050加速器和Gyro
    *注:MPU-6050的默认状态为休眠模式。
    * 通过将0x00写入PWR_Mgmt_1寄存器唤醒
    *注:来自Amazon的无名称版本具有5V至3.3V的稳压器,Vcc必须为5V!!!
    * 板上包括10千欧上拉电阻
    器* 在SCL和SDA
    *上串联了330欧姆电阻器 (可安全地将WFP 1.6 和WFP 1.7 直接连接到SCL和SDA)
    *
    从属地址:	0x68 (AD0=0)或0x69 (AD0=1)
    *
    Z-数据缓冲地址:
    *					0x3B ACCEL_XOUT_H R ACCEL_XOUT[15:8]
    *					0x3C ACCEL_XOUT_L R ACCEL_XOUT[ 7:0]
    *					0x3D ACCEL_UTE_H R ACCEL_UTE[15:8]
    *					0x3E ACCEL_OUT_L R ACCEL_CEOWY[7:0_ZL]
    					
    					
    
    	INT (1024字节FIFO规则中数据就绪的中断)
    *					XCL,XDA (MPU-6050 I2C总线的外部时钟和数据线)
    *
    *读取原始值:禁用睡眠模式
    *					0x6B PWR_Mgmt_1 -->设置为0
    *
    **
    /#include <MSP40.0.h>
    
    /*
    main.c
    */
    
    unsigned char_Data[6];
    unsigned char TX_Data[2];
    unsigned char RX_ByteCtr;
    unsigned char TX_ByteCtr;
    
    int xAccel;
    int yAccel;
    int zAccel;
    
    unsigned char slaveAddress = 0x68;	//为MPU-6050设置从属地址
    					//为Add pin=0
    					// 0x69 for Add pin=1
    
    const unsigned char _PWR_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_outing_H = 0x3D;	// MPU-6050寄存器地址
    const unsigned char ACCEL_3F_L = 0x3E;	// MPU-6050寄存器地址const
    	
    = 0xU; unsigned char_ACH_ACH_0 	// MPU-6050寄存器地址
    
    void i2cInit(void);
    void i2cWrite(unsigned char);
    void i2cRead(unsigned char);
    
    int main(void)
    {
    	WDTCTTL = WDTPW + WDTHOLD;//				停止WDT//
    
    	设置时钟速度(默认值= 1 MHz)
    	BCSCTL1 = CABCC1_1MHz;					CALDL
    	=可用;CA12 MHz 					//数字控制振荡器CTL
    
    	//设置I2C引脚
    	P1SEL || BIT6 + BIT7;					//将I2C引脚分配给USI_B0
    	P1SEL2|= BIT6 + BIT7;					//将I2C引脚分配给USI_B0
    
    	//初始化I2C状态机
    	i2cInit();
    	
    	//唤醒MP0地址slavU68
    	; 					// MPU-6050 address
    	TX_Data[1]= 0x6B;						// PWR_Mgmt_1 register
    	TX_Data[0]= 0x00;						//将寄存器设置为零(wCtr up MPU-6050) TX_BYTEakes
    	= 2;
    	i2cWrite(slaveAddress);
    
    	而(1)
    	{
    		//指向ACH_MPU-6050
    							地址);[MPH_MPH_0x50
    		= MPH_MPU_0x50; 					//注册地址
    		TX_ByteCtr = 1;
    		i2cWrite(slaveAddress);
    
    		//读取两个字节的数据并将其存储在zAccel
    		slaveAddress = 0x68;					// MPU-6050 address
    		RX_ByteCtr = 6;
    		i2cRead(slaveAddress);
    		xAccel = RX_Data[5]</x8;				
    		SSB= 8; 					
    						// msb
    		yAccel |= RX_Data[2];					// lsb
    		zAccel = RX_Data[1]<8;				// msb
    		zAccel |= RX_Data[0];					// lsb
    
    		//对数据
    
    		__no_operation()执行某些操作; //设置断点>>此处<<并阅读
    
    	}//*************************************************************************************************************************
    
    
    
    void i2cInit (void)
    {
    	//设置I2C模块
    	UCB0CTL1 || UCSWRST;				//启用软件重置
    	UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; 	// I2C Master,同步模式
    	UCB0CTL1 = UCSSEL_2 + UCSWRST;			//使用SMCLK,保持软件重置
    	UCB0BR0 = 10;					// fSCL = SMCLK/12 =~100kHz
    	UCB0BR1 = 0;
    	UCB0CTL1 &=~UCS****************************************WRST;				//清除SW/,恢复操作
    }
    
    
    void i2cWrite(unsigned char address)
    {__disable_interrupt()
    	;
    	UCB0I2CSA =地址;				//加载从属地址
    	IE2 |= UCB0TXIE;				//启用TX中断
    	同时(UCB0CTL1和UCTXIE);//			确保发送停止条件
    	UCB0CTL1 || UCTXSTT + UCTXSTT;			// UCTX_IPST_UST_STFF_UST_ST_ST_STE,
    			直到设置了UST_UST_UST_ST_UST_ST_ST_ST_ST_ST_UST_ST_ST_ST_ST_ST_ST
    
    
    //*************************************************************************************************************************
    void i2cRead (unsigned char address)
    {
    	__disable_interrupt ();
    	UCB0I2CSA = address;				// Load slave address
    	IE2 |= UCB0RXIE;				// Enable RX interrupt while
    	(UCB0CTL1 & UCTXIE);			// ensure stop condition sent
    	UCB0CTL1 &=~UCTR;				// RX mode UCB0CTL1 = UCP0CTSTFF;
    					UST_ST1=
    			//休眠,直到UCB0RXIFG设置...
    }
    
    ********************* //
    USCIAB0TX_ISR
    #pragma载体= USCIAB0TX_vector
    __interrupt void USCIAB0TX_ISR(void)
    {
    	IF (UCB0CTL1 & UCTR )//					TX模式(UCTR ==1)
    	{
    		IF (TX_ByteCtr ) 				//如果仍有更多字节
    		,则为TRUE {
    			TX_ByteCtr!--;				// Decrement TX byte counter
    			UCB0TXBUF = TX_Data[TX_ByteCtr];	// Load TX buffer
    		}
    		else						//不再有要发送的字节
    		{
    			UCB0CTL1 || UCTXSTP;			// I2C停止条件
    			IFG2 &=~UCB0TX0TXIFG;			/UTC_EXIT_USCF_POST_E/
    				//退出LPM0
    		}
    	}
    	else //(UCTR ==0)					// RX模式
    	{
    		RX_ByteCtr --; 				// Decrement RX字节计数
    		器IF (RX_ByteCtr ) 				// RxByteCtr != 0
    		{
    			RX_Data[RX_ByteCtr ]= UCB0RXBUF;	//如果
    			(RX_ByteCtr ==1),则获取接收字节			//仅剩下一个字节?
    			UCB0CTL1 || UCTXSTP;			//生成I2C停止条件
    		}
    		ELSE						// RxByteCtr == 0
    		{
    			RX_Data[RX_ByteCTR]= UCB0RXBUF;	//获取最终接收字节
    			__BIC_SR_REGISTER_ON_EXIT(CPUOFF);	//退出LPM0
    		}
    	
    } 

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

    更新代码后,您是否仍收到相同的错误代码? 为了更好地了解您的问题可能是什么,能否请您对整个控制台输出(包括您收到的所有错误消息)进行拍照? 这将提示哪些符号仍未解析,从而可能缺少哪些库。

    谢谢,此致,
    Britta.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    我没有遇到任何问题就构建了这个项目。
    也许尝试"清理"您的项目(右键单击/清理)或创建新项目并复制粘贴您的代码?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    我想您可以继续处理您的应用程序,因为您不再回复,所以我将关闭此帖子。
    如果您需要进一步的帮助,请再次发表意见,它将重新打开线程。

    此致,
    Britta.