尊敬的先生/女士
我正在尝试将 adxl345加速计与 msp430fr5994连接。 当我调试代码时、我发现它在写入函数的 while 循环处停止、即 while (!(UCB2IFG & UCTXIFG0))。 如果我注释写入函数并运行程序,则我将获得常数 X、Y、Z 值,并且不会更改。 因此、请尽快解决我的问题。 我正在发送我的程序。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 正是 C/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include
#include
#include
#include
//全球----------------------------------------------------------
uint8_t g_mlxValBytes[6];//接收到的值字节存储
将 g_objectTemp;//视场中对象的温度
悬空 g_ambientTemp;//环境温度
INT Tout;
uint8_t data[5];
uint16_t x=0;
uint16_t y=0;
uint16_t z=0;
//int X、Y、Z;
字符值[500];
int rx_Byte=0;
//主----------------------------------------------------------
//void mlxwrite (uint8_t CMD)
void ADXL_WRITE (uint8_t CMD、uint8_t 数据)
{
UCB2CTLW0 |= UCSWRST;//启用软件复位
UCB2CTLW0 |= UCMODE_3 | UCMST | UCSYNC | UCTR | UCSSEL_SMCLK;// I2C 模式、主器件、SYNC、发送、 SMCLK
UCB2BRW = 80;//0xA;//波特率= SMCLK / 20;
UCB2CTLW1 |= UCASTP_2;//自动停止
UCB2TBCNT = 0x01;//在1个字节后自动停止
UCB2I2CSA = 0x53;// I2C 地址
UCB2CTL1 &=~Ω UCSWRST;//清除复位
UCB2CTL1 |= UCTXSTT;//发送启动
while (!(UCB2IFG & UCTXIFG0));//等待 TX 中断标志
UCB2TXBUF = CMD;//MSB
//while (!(UCB2IFG & UCTXIFG0));//等待 TX 中断标志
UCB2TXBUF =数据;
while (!(UCB2IFG & UCTXIFG0));
while (UCB2CTLW0 & UCTXSTP);//等待 STOP
// printf ("等待 TX 标志\r\n);
/* printf ("reading_data\r\n");
UCB2CTL1 &=~Ω UCSWRST;//清除复位
UCB2CTL1 |= UCTXSTT;//发送启动
while (!(UCB2IFG & UCTXIFG0));//等待 TX 中断标志
UCB2TXBUF =CMD;//发送对象温度命令
while (!(UCB2IFG & UCTXIFG0));//等待 TX 中断标志
UCB2CTLW0 &=~UCTR;//更改为接收
UCB2CTLW0 |= UCTXSTT;//发送重启
while (UCB2CTLW0 & UCTXSTT);//等待重新启动
//printf ("已开始读取\r\n");
// UART_TX ("I2C 接收已启动\r\n);
//接收字节
while (!(UCB2IFG & UCRXIFG0));//等待 RX 中断标志
P1OUT=0x01;
G_mlxValBytes[0]= UCB2RXBUF;//第0字节
while (!(UCB2IFG & UCRXIFG0));//等待 RX 中断标志
/*g_mlxValBytes[1]= UCB2RXBUF;//第一个字节
while (!(UCB2IFG & UCRXIFG0));//等待 RX 中断标志
G_mlxValBytes[2]= UCB2RXBUF;//第二个字节
while (UCB2CTLW0 & UCTXSTP);//等待停止*/
//uint16_t tempVals =(((uint16_t) g_mlxValBytes[1])<< 8)|((uint16_t) g_mlxValBytes[0]);
/*uint8_t tempVals =((uint8_t) g_mlxValBytes[0]);
TOUT=tempVals;
UART_Transmit ();
Value= Tout;*/
返回0;
}
void ADXL_Read (uint8_t CMD)//、char*标记)
{
//将 USCI_B0配置为 I2模式-发送
UCB2CTLW0 |= UCSWRST;//启用软件复位
UCB2CTLW0 |= UCMODE_3 | UCMST | UCSYNC | UCTR | UCSSEL_SMCLK;// I2C 模式、主器件、SYNC、发送、 SMCLK
UCB2BRW = 80;//0xA;//波特率= SMCLK / 10;
UCB2CTLW1 |= UCASTP_2;//自动停止
UCB2TBCNT = 0x06;//在3个字节后自动停止
UCB2I2CSA = 0x53;// I2C 地址
UCB2CTL1 &=~Ω UCSWRST;//清除复位
//UART_TX ("I2C 发送已启动\r\n);
//发送对象温度读取命令
UCB2CTL1 |= UCTXSTT;//发送启动
while (!(UCB2IFG & UCTXIFG0));//等待 TX 中断标志
UCB2TXBUF =CMD;//0x07;//发送对象温度命令
while (!(UCB2IFG & UCTXIFG0));//等待 TX 中断标志
printf ("等待 TX 标志\r\n);
UCB2CTLW0 &=~UCTR;//更改为接收
UCB2CTLW0 |= UCTXSTT;//发送重启
while (UCB2CTLW0 & UCTXSTT);//等待重新启动
// printf ("started2\r\n");
// UART_TX ("I2C 接收已启动\r\n);
//接收字节
while (!(UCB2IFG & UCRXIFG0));//等待 RX 中断标志
P1OUT=0x01;
G_mlxValBytes[0]= UCB2RXBUF;//第0字节
//rx_Byte++;
while (!(UCB2IFG & UCRXIFG0));//等待 RX 中断标志
G_mlxValBytes[1]= UCB2RXBUF;//第一个字节
//rx_Byte++;
while (!(UCB2IFG & UCRXIFG0));//等待 RX 中断标志
G_mlxValBytes[2]= UCB2RXBUF;//第二个字节
//rx_Byte++;
while (!(UCB2IFG & UCRXIFG0));//等待 RX 中断标志
G_mlxValBytes[3]= UCB2RXBUF;//第3个字节
//rx_Byte++;
while (!(UCB2IFG & UCRXIFG0));//等待 RX 中断标志
G_mlxValBytes[4]= UCB2RXBUF;// 4st 字节
//rx_Byte++;
while (!(UCB2IFG & UCRXIFG0));//等待 RX 中断标志
G_mlxValBytes[5]= UCB2RXBUF;//第五个字节
//rx_Byte++;
while (UCB2CTLW0 & UCTXSTP);//等待 STOP
//uint16_t tempVals =(((uint16_t) g_mlxValBytes[1])<< 8)|((uint16_t) g_mlxValBytes[0]);
x =(((uint16_t) g_mlxValBytes[1])<<8)|((uint16_t) g_mlxValBytes[0]);
y =(((uint16_t) g_mlxValBytes[3])<< 8)|((uint16_t) g_mlxValBytes[2]);
z =(((uint16_t) g_mlxValBytes[5])<< 8)|((uint16_t) g_mlxValBytes[4]);
/* X=data[0];
Y=数据[1];
z=data[2];*/
sprintf (值、"X=%d、Y=%d、Z=%d"、x、y、z);
TOUT=值;
//Tout =tempVals * 0.02 - 273.15;
// Tout=Tout *9.0/5.0+32;
// UART_TX (TAG);
UART_Transmit ();
值= Tout;
}
int main (void){
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
P1DIR = 0x01;//表示 LED
P7SEL0 |= BIT0 | BIT1;
P7SEL1 &=~(BIT0 | BIT1);
PM5CTL0 &=~LOCKLPM5;
//xxxxxxxxxxxxxxxxxxxxxxxxxxx
CSCTL0_H = CSKKEY_H;
CSCTL1 = DCOFSEL_6;//8MHz |DCOFSEL_0 -1MHz
CSCTL2 = SELA_VLOCLK | SELESS__DCOCLK | SELM_DCOCLK;//设置 SMCLK = MCLK = DCO
// CSCTL2 =SELA_LFXTCLK | SELESS__DCOCLK | SELM_DCOCLK;
CSCTL3 = DIVA_1|DIVS_1|DIVM_1;
CSCTL0_H = 0;
UART_CONFIG();
UART_TX ("UART started\r\n");
/* ADXL_WRITE (0x2D、0x08);
ADXL_WRITE (0x2C、0x0A);*/
// ADXL_WRITE (0x32、0x03);
//_ bis_SR_register (GIE);
while (1)
{
ADXL_READ (0x32);//、"ID=");
// mlxread (0x01);
// mlxread (0x06、"环境温度=");
_delay_cycles (8000);
printf ("X=%d Y=%d Z=%d\r\n"、Tout);
_delay_cycles (8000);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// UART.H///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include
#include
#include
#include
字符测试[25]="";
char check='m';
int 值;
空 UART_CONFIG ()
{
UART_PIN();
UART_CTL ();
UART_Transmit ();
// sprintf (测试、"Test\r\n"、"m");
}
空 UART_PIN()
{
P2SEL0 &=~(BIT0 | BIT1);
P2SEL1 |=(BIT0 | BIT1);// USCI_A0 UART 操作
}
void UART_clock ()
{
CSCTL0_H = CSKKEY_H;
CSCTL1 = DCOFSEL_6;//8MHz |DCOFSEL_0 -1MHz
CSCTL2 = SELA_VLOCLK | SELESS__DCOCLK | SELM_DCOCLK;//设置 SMCLK = MCLK = DCO
CSCTL3 = DIVA_1|DIVS_1|DIVM_1;
CSCTL0_H = 0;
}
空 UART_CTL ()
{
UCA0CTLW0 = UCSWRST;//将 eUSCI 置于复位状态
UCA0CTLW0 |= UCSSEL_SMCLK;// CLK = SMCLK
UCA0BRW = 52;// 8000000/16/9600
UCA0MCTLW |= UCOS16 | UCBRF_1 | 0x49;
UCA0CTLW0 &=~UCSWRST;//初始化 eUSCI
_BIS_SR (GIE);
UCA0IE = UCTXCPTIE;
}
空 UART_TX (字符串[])
{
int 索引=0;
{
while (string[index]!='\0')
{
UCA0TXBUF =字符串[索引];
索引++;
_DELAY_CYCLES (50000);
}
}
}
空 UART_Transmit ()
{
sprintf (测试、"X=%d、Y=%d、Z=%d\r\n"、值);
//test[25]="MKP";
UART_TX (测试);
memset (test、0、sizeof (test));
_DELAY_CYCLES (800);
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
#pragma vector=USCI_A0_Vector
_interrupt void UART_ISR (void)
{
P1OUT^= 0x01;
_DELAY_CYCLES (800000);
UCA0IFG = UCA0IFG &(~UCTXCPTIFG);
}