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与MPU6050 (加速计)。

Guru**** 2614265 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/665473/ccs-msp430g2553-interfacing-msp430g2553-with-mpu6050-accelerometer

部件号:MSP430G2553

工具/软件:Code Composer Studio

大家好,我已经将MSP430与mpu6050进行了交互,但当它到达注释“问题行”的行时,我的代码停止运行。 如果有人对代码在达到该线时为什么不继续存在有任何想法,那将是非常有帮助的。



#define use_clock #define use_I2C_USCI #define use_MPU6050 #define use_UART ////////////////////////////////////////////// #include <wchar.h> #include "stdio.h" //#include "string.h" #include "Library/mybuf.h" #include <match.h> #include "msp430g2553.h" #include "Library/Global.h" #include "Library/UART.h" #include "Library/Clock.h"#include "Library/Clock.h=50; I2c=50; //Chu y Gyro bi Sai So Tinh Khong dong Nhat KHI Goc quay thay doi // Khong Tinh Duoc vi Phan Cua gyro void main() { WDTCTL = WDTPW | WDTHOLD; select_Clock (DCO_16MHz); _delay_cycles (10万); // Khoi tao Ngat timer // TAO timer 0.5 s //TACCR0 = 1万; //TACCTL0 = CCIE; //TACTL = tassel_2 + MC_1 + ID_0; // SMCLK/8,UP模式 P1DIR|=BIT0; UART_Init(); //UART_Write_Char(10); //Ky tu xuong dong //UART_Write_String ("Ket noi Thanh Cong"); //UART_Write_Char(10); //Ky tu xuong dong //UMP50_UMP50_UMP50/ UMP50_UMP50_寄存 器 //Calibrate_Gyros (); _Delay_Cycles (32万); Get_Accel_Values(); Get_Gyro_values(); ACCEL_XOUT = 0; Accel_oout = 0; ACCEL_ZOUT = 0; ACCEL_XOUT_OST=0; // ACCEL_OUT_OSTE=0; ACCEL_ZOUT_OST=0; Accel_XA =0; ACCEL_YA =0; ACCEL_ZA =0; ACCEL_XV =0; ACCEL_YV =0; Accel_ZV = 0; ACCEL_XDECAC=0; ACCEL_YDECAC=0; ACCEL_ZDECAC=0; _DELAY周期(100万); //__bis_sr_register(GIE); //cho phep Ngat hoat dong while 2 % (1){//Get_Gyro_values();P1OUT^=BIT0;//sprintf (buff,"gx:%d GY:%d GZ:%d:%d:%d:%d:%d:%d:%d:%d_extru_1';5 % ACXout_1' 1 % 4 % ;AC1'写入;ACXout_1';AC_1' 3 % 6 % //_Delay_Cycles (1万); UART_Write_Char ('2'); Sprintf (buff,"%d",ACCEL_UYD); UART_Write_String (buff); UART_Write_Char ('); //_DELAY周期(1万); UART_Write_Char ('3'); Sprintf (buff,"%d",ACCEL_ZOUT); UART_Write_String (buff); UART_Write_Char ('); _delay_cycles(1万); Get_Accel_values(); }// 计时器A0中断服务例程 #pragma vector=TIMER0_A0_vector __interrupt void Timer_A0 (void){ }


#ifdef use_I2C_USCI
#define MPU6050_address	0x68
#define DS1307_address	0x68
#define LM92_address	0x48
/********************************************************************** \
*					原型(Nguyen Mau Ham) 						*
******************** /

void Init_I2C_USCI (unsigned char addr);
void set_Address (unsigned char addr);
unsigned char ByteRead_I2C_USCI (unsigned
char address,unsigned char Data);unsigned
char Read_unsigned_USCI (unsigned char Addr_Data,*************************************************************************Data,unsigned char_/unsigned
\
*					函数(noi dung ham) 	*
******************** /


void Init_I2C_USCI (无符号字符地址)
{
	P1SEL || BIT6 + BIT7; //将I2C引脚分配给USI_B0
	P1SEL2|= BIT6 + BIT7; //将I2C引脚分配给USI_B0
	UCB0CTL1 |= UCSWRST; //启用软件重置
	UCB0CTL0 = UCCMST+UMODE_3+UCSYNC; // I2C主控,同步模式
	UCB0CTL1 = UCSSEL_2+UCSWRST; //使用SMCLK,保持软件重置
	UCB0BR0 =40; // fSCL = SMCLK/40 =~400kHz
	UCB0BR1 = 0;
	UCB0I2CSA =地址; //设置从属地址
	UCB0CTL1 &=~UCSWRST; //清除软件重置,恢复操作
}

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

unsigned char ByteRead_I2C_USCI (unsigned char地址)
{	
	while (UCB0CTL1 & UCTXSTP); 	// Cho Tin Hieu I2C STT Duoc GUI di
	UCB0CTL1 || UCTR + UCTXSTT; 	// I2C TX,启动

	时间(!(IFG2和UCB0TXIFG));			//问题行
	UCB0TXBUF =地址; 	// Dia chi Luu Gia三秒

	时间(!(IFG2和UCB0TXIFG));					//问题行

	UCB0CTL1 &=~UCTR; // I2C RX
	UCB0CTL1 || UCTXSTT; // I2C重新启动
	IFG2 &=~UCB0TXIFG; // XOA CO Ngat USI_B0 TX

	while (UCB0CTL1和UCTXSTT); // Cho den KHI I2C STT Duoc GUI di
	UCB0CTL1 || UCTXSTP; // GUI位停止
	返回UCB0RXBUF;
}//doc


1 mang tu DS
unsigned char WordRead_I2C_USCI (unsigned char Addr_Data,unsigned char *Data, unsigned char Length)
{	
	unsigned char I=0;
	while (UCB0CTL1 & UCTXSTP); //循环直到I2C STT被发送
	UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX,启动条件

	,同时(!(IFG2和UCB0TXIFG));
	IFG2 &=~UCB0TXIFG; //清除USI_B0 TX int标志
	IF (UCB0STAT和UCNACKIFG)返回UCB0STAT;	//Neu bao loi
	UCB0TXBUF = Addr_Data; 	// Dia chi Luu Gia三秒

	时间(!(IFG2和UCB0TXIFG));
	IF (UCB0STAT和UCNACKIFG)返回UCB0STAT;	//Neu bao loi

	UCB0CTL1 &=~UCTR; // I2C RX
	UCB0CTL1 || UCTXSTT; // I2C启动条件
	IFG2 &=~UCB0TXIFG; // Clear USI_B0 TX int flag
	while (UCB0CTL1 & UCTXSTT); //循环直至I2C STT被发送
	(I=0;I<(Length-1);I++)
	{
		while (!(IFG2和UCB0RXIFG));
		IFG2 &=~UCB0TXIFG; // Clear USI_B0 TX int flag
		Data[i]= UCB0RXBUF;
	}
	While (!(IFG2&UCB0RXIFG));
	IFG2 &=~UCB0TXIFG; // Clear USI_B0 TX int flag
	UCB0CTL1 || UCTXSTP; //第一个TX
	数据后的I2C停止条件[Length-1]= UCB0RXBUF;
	IFG2 &=~UCB0TXIFG; // clear USI_B0 tx int标志
	返回0;
}

unsigned char ByteWrite_I2C_USCI (unsigned char address,unsigned char data)
{
	while (UCB0CTL1 & UCTXSTP); // Cho den KHI Tin Hieu STT Duoc GUI xong
	UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX,GUI位启动

	时(!(IFG2&UCB0TXIFG));				// cho cho bit start GUI xong
	if(UCB0STAT & UCNACKIFG) Return UCB0STAT;	//Neu bao loi thì thoat Khoi HAM
	UCB0TXBUF = address;					// GUI gi Thanh ackifghi can/ UCB0ghi


	(UCB0gi			
	) 	// neu bao loi thì thoat Khoi Ham
	UCB0TXBUF = data;						// gui du reeale, while

	(!(IFG2&UCB0TXIFG));				// Cho gui xong
	if(UCB0STAT & UCNACKIFG) return UCB0STAT;	//Neu dothoi thì STP at Khoi HAM
	UCB0XL1;UCB0; UCB0CTXL1 = // GUI位停止
	IFG2 &=~UCB0TXIFG; // XOA co USI_B0 TX
	返回0;
}
unsigned int read_LM92()
{
	unsigned char A;
	while (UCB0CTL1 & UCTXSTP); //循环直到I2C STT被发送
	UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX,启动条件

	,同时(!(IFG2和UCB0TXIFG));
	UCB0TXBUF = 0x00; 	// Dia chi Luu Gia三秒

	时间(!(IFG2&UCB0TXIFG));

	UCB0CTL1 &=~UCTR; // I2C RX
	UCB0CTL1 || UCTXSTT; // I2C启动条件
	IFG2 &=~UCB0TXIFG; // Clear USI_B0 TX int flag

	while (UCB0CTL1 & UCTXSTT); //循环直到I2C STT被发送
	A = UCB0RXBUF;
	而(UCB0CTL1 & UCTXSTT); //循环直到I2C STT被发送
	UCB0CTL1 || UCTXSTP; //第一
	个TX返回后的I2C停止条件(A<<8)|UCB0RXBUF);	
}


#endif

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

    您好,

    程序未通过该行的原因是未发送TX中断标志。 此检查是为了确保设置标志,以便验证TX缓冲区是否已准备好将值推入其中。 我建议您使用调试器逐步执行代码,以查看清除该位的位置(应该在设备启动时设置)。

    有关调试串行通信问题的帮助信息,请参阅以下文档: sla734

    此致,

    Nathan

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

    此问题是否已解决? 如果是,请将其标记为"已回答"。 如果很快没有响应,则此线程将由于不活动而关闭。

    此致,
    Nathan