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.

[参考译文] MSP430FR5994:将 ADXL345加速计与 msp430fr5994连接时、I#39;m 面临问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1159986/msp430fr5994-i-m-facing-issue-while-interfacing-adxl345-accelerometer-with-msp430fr5994

器件型号:MSP430FR5994

尊敬的先生/女士

我正在尝试将 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);

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

    您的问题是什么? 您能否使用示波器捕获波形、以帮助了解发生了什么情况?

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

    尊敬的周奕迅  

    我能够读取 X、Y、Z 值、但这些是常量值、当我改变加速计轴时、这些值不会改变。

    我发现这个问题与写入函数有关、但我无法解决。 我正在传递我进行了少量修改的代码。 因此、请解决写入函数中的问题。

    #include

    #include
    #include
    #include
    //全球----------------------------------------------------------
    uint8_t ADXLValBytes[6];//接收到的值字节存储
    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 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
    返回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;
    ADXLValBytes[0]= UCB2RXBUF;//第0字节
    while (!(UCB2IFG & UCRXIFG0));//等待 RX 中断标志
    ADXLValBytes[1]= UCB2RXBUF;//第一个字节
    while (!(UCB2IFG & UCRXIFG0));//等待 RX 中断标志
    ADXLValBytes[2]= UCB2RXBUF;//第2个字节
    while (!(UCB2IFG & UCRXIFG0));//等待 RX 中断标志
    ADXLValBytes[3]= UCB2RXBUF;//第3个字节
    while (!(UCB2IFG & UCRXIFG0));//等待 RX 中断标志
    ADXLValBytes[4]= UCB2RXBUF;// 4st 字节
    while (!(UCB2IFG & UCRXIFG0));//等待 RX 中断标志
    ADXLValBytes[5]= UCB2RXBUF;//第五个字节
    while (UCB2CTLW0 & UCTXSTP);//等待 STOP
    x =(((uint16_t) ADXLValBytes[1])<< 8)|((uint16_t) ADXLValBytes[0]);
    y =(((uint16_t) ADXLValBytes[3])<< 8)|((uint16_t) ADXLValBytes[2]);
    z =(((uint16_t) ADXLValBytes[5])<< 8)|((uint16_t) ADXLValBytes[4]);

    sprintf (值、"X=%d、Y=%d、Z=%d"、x、y、z);
    TOUT=值;
    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
    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=");
    _delay_cycles (8000);
    printf ("X=%d Y=%d Z=%d\r\n"、Tout);
    _delay_cycles (8000);

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

    将自动停止计数设置为1是一个明显的问题、这意味着它在发送数据之前停止。 因为 ADXL 需要一个寄存器-值对、所以这是一个真正的问题。

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

    尊敬的 David Schultz  

    我已将自动停止计数更改为2、但输出没有变化、仍然在写入函数的此行"while (!(UCB2IFG & UCTXIFG0))"停止。 我尝试输入不同的计数值、但输出仍然没有变化。

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

    我仍然建议您  使用示波器捕获波形。 然后、您将了解为何无法向从设备发送数据。

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

    UART_Transmit ()说:

    > sprintf (test、"X=%d、Y=%d、Z=%d\r\n"、value);

    它将一个(常量)指针值显示为 X、而对于 Y/Z、该值是不确定的(可能也是恒定的) 您是否意味着:

    > sprintf (test、"X=%d、Y=%d、Z=%d\r\n"、x、y、z);

    您在编译时是否收到任何警告?

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

    尊敬的 Bruce。

    您说的是正确的。 我已经更改了 sprintf 函数。 然后进行一些修改。 现在、我将获得正确的输出。 谢谢。

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

    谢谢 Bruce。