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/MSP430FR5969:与ADXL345和MSP430FR5969的I2C通信

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/656187/ccs-msp430fr5969-i2c-communication-with-adxl345-and-msp430fr5969

部件号:MSP430FR5969

工具/软件:Code Composer Studio

我为MSP430FR5969和加速计 ADXL345之间的I2C通信编写了一个代码。

当我运行代码时,它只工作一次。 我的意思是,我一次只从ADXL345接收一个数据。 之后,它不再起作用。 有人可以对此给出任何想法吗?

在整个代码下面:

#include <MSP4S.h>

#define NUM_Bytes_TX 2.
#define NUM_Bytes_RX 6
#define ADXL_345   0x53

Int RXByteCtr,x,y,z;
volatile unsigned char RxBuffer[6];//        分配6字节的RAM
unsigned char *PRxData;                    //指向RX数据的指针
unsigned char TXByteCtr,Rx=0;
unsigned char MSData[2];

void Setup_TX(unsigned char);
void Setup_Rx (unsigned char);
void transmit (unsigned char,unsigned char);
void TransmitOne(unsigned char);
接收无效(无效);

////////
int main (void){
   WDTCTL = WDTPW | WDTHOLD;
   P1DIR || BIT0;
   //P1OUT |= BIT0;
   P1OUT &=~BIT0;

   //P1SEL || BIT6 | BIT7;// ADXL345
   P1SEL1 || BIT6 | BIT7;// ADXL345
   //P1SEL0 &=~(BIT6 |位7);// ADXL345
   //P1SEL2 || BIT6 | BIT7;// ADXL3450
   PM5CTL0 &=~LOCKLPM2;

   //为ADXL345初始化序列
    SETUP_TX (ADXL_345);
    Transmit (0x2D,0x00);//00
    while (UCB0CTL1和UCTXSTP);            //确保已发送停止条件

    SETUP_TX (ADXL_345);
    Transmit (0x2D,0x10);//16
    while (UCB0CTL1和UCTXSTP);            //确保已发送停止条件

    SETUP_TX (ADXL_345);
    Transmit (0x2D,0x08);//08
    while (UCB0CTL1和UCTXSTP);            //确保已发送停止条件

    //P1OUT ^=BIT0;

   而(1){
      SETUP_TX (ADXL_345);
      TransmitOne(0x32);                 //从ADXL345请求数据,2g范围10位分辨率
      while (UCB0CTL1和UCTXSTP);        //确保已发送停止条件
      //接收过程
      SETUP_RX (ADXL_345);
      receive();
      while (UCB0CTL1和UCTXSTP);         //确保已发送停止条件

      x =((((int)RxBuffer[1])<8)| RxBuffer[0];
      Y =((((int)RxBuffer[3])<8)| RxBuffer[2];
      Z =((((int)RxBuffer[5])<8)| RxBuffer[4];

      //现在我们有x,y,z读数。
      //如果x或y角度超过45度或小于-45度,则下方红色LED亮起。
          如果((x > 128)||(y > 128)||(x <-128)||(y <-128)){
              P1OUT || BIT0;//红色LED亮起
          }其他{
              P1OUT &=~BIT0;//红色LED熄灭
          }
          __DELAY周期(10); //延迟1秒
          //UCB0CTLW1 &=~UCTXSTP;
    }//Fin While (1)
}//FIN主菜单

#pragma vector = USI_B0_vector
__interrupt void USI_B0_ISR(void){
   如果(RX == 1){                             //主接收?
       RXByteCtr --;                           // Decrement RX字节计数器
       如果(RXByteCtr){
          *PRxData++= UCB0RXBUF;            //将RX数据移动到PRxData地址
        其他{
          UCB0CTL1 || UCTXSTP;               //不重复启动:停止条件
          *PRxData++= UCB0RXBUF;            //将最终RX数据移至PRxData
          __BIC_SR_REGISTER_ON_EXIT (LPM0_bits); //退出LPM0
        }}
    Else{                                    //主传输
        IF (TXByteCtr){//        检查TX字节计数器
          TXByteCtr -;                       // Decrement TX字节计数器
          UCB0TXBUF = MSData[TXByteCtr ];     //加载TX缓冲区
        其他{
            UCB0CTL1 || UCTXSTP;                   // I2C停止条件
            UCB0IFG &=~UCTXIFG;                    // Clear USI_B0 TX int flag //UCTXIFG0是在UCBxTXBUF在主模式或从模式中为空时设置的
            __BIC_SR_REGISTER_ON_EXIT (LPM0_bits);     //退出LPM0
        }
    }//fin (如果有)
}

////////////////////////////////

void Setup_TX(unsigned char Dev_ID){
   _DINT();
   Rx=0;
   UCB0IE &=~UCRXIE;
   UCB0CTLW1 &=~UCTXSTP;//MOIIIIIIIII
   While (UCB0CTL1和UCTXSTP);
    //UCB0CTLW0 |= UCSWRST;
    //UCB0CTLW0 |= UCMODE_3 | UCMST | UCSSEL_2 | UCSYNC;
    //UCB0CTLW1 = UCASTP_2 | UCSWRST;                   //生成自动停止
   UCB0CTLW0 |= UCSWRST;
   UCB0CTLW0 |= UCMODE_3| UCMST | UCSYNC |UCSSEL_2;
   UCB0CTLW1 = UCASTP_2;                   //生成自动停止
    UCB0BR0 = 12;                            // fSCL = SMCLK/12 =~100kHz
    UCB0BR1 =0;
    UCB0TBCNT=0x0006;
    UCB0I2CSA = Dev_ID;
    UCB0CTL1 &=~UCSWRST;
    UCB0IE |= UCTXIE;//| UCNACKIE | UCBCNTIE;
 }
void Setup_Rx (unsigned char Dev_ID){
 _DINT();
 Rx = 1;
 UCB0IE &=~UCTXIE;
 //UCB0CTLW0 |= UCSWRST;                     //启用软件重置
 //UCB0CTLW0 |= UCMODE_3 | UCMST | UCSSEL_2 | UCSYNC;
 //UCB0CTLW1 = UCASTP_2 | UCSWRST;            //使用SMCLK,保持SW重置
 UCB0CTLW0 |= UCSWRST;
 UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC | UCSSEL_2;
 UCB0CTLW1 = UCASTP_2;                   //生成自动停止
 UCB0BR0 = 12;                            // fSCL = SMCLK/12 =~100kHz
 UCB0BR1 = 0;
 //UCB0TBCNT=0x0006;
 UCB0I2CSA = Dev_ID;                      //从属地址为048h
 UCB0CTL1 &=~UCSWRST;                    //清除软件重置,恢复操作
 UCB0IE |= UCRXIE;//| UCNACKIE | UCBCNTIE;
}
void Transmit (unsigned char ReG_Add,unsigned char ReG_DAT){
 MSData[1]=注册_添加;
 MSData[0]=注册日期;
 TXByteCtr = NUM_Bytes_TX;              //加载TX字节计数器
 while (UCB0CTL1和UCTXSTP);            //确保已发送停止条件
 //UCB0CTL1 || UCTR + UCTXSTT;            // I2C TX,启动条件
 UCB0CTLW0 |= UCTR | UCTXSTT;            // I2C TX,启动条件
 __bis_sr_register (LPM0_BITS | GIE);
 /*while (1){
     __delay_cycles (2000年);
     同时(UCB0CTL1和UCTXSTP);
     UCB0CTL1 || UCTXSTT;
     __bis_sr_register (LPM0_BITS | GIE);
 }*/
}
Void TransmitOne (无符号char ReG_Add){
 MSData[0]=注册_添加;
 TXByteCtr = 1;                         //加载TX字节计数器
 while (UCB0CTL1和UCTXSTP);            //确保已发送停止条件
 //UCB0CTL1 || UCTR | UCTXSTT;            // I2C TX,启动条件
 UCB0CTLW0 |= UCTR | UCTXSTT;            // I2C TX,启动条件
 __bis_sr_register (LPM0_BITS | GIE);
 /*while (1){
       __delay_cycles (2000年);
       同时(UCB0CTL1和UCTXSTP);
       UCB0CTL1 || UCTXSTT;
   }*/
}
作废接收(作废){
 PRxData =(unsigned char *)RxBuffer;   // RX缓冲区的开始
 RXByteCtr = NUM_Bytes_RX;              //加载RX字节计数器
 while (UCB0CTL1和UCTXSTP);            //确保已发送停止条件
 //UCB0CTL1 || UCTXSTT;                   // I2C启动条件
 UCB0CTLW0 |= UCTXSTT;
 UCB0CTLW0 &=~UCTR;
 //while (UCB0IFG和UCNACKIFG);
 __bis_sr_register (LPM0_BITS | GIE);
}

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

    您好Darwin:

    在尝试查找项目内部的错误时,一个很好的资源是将其与我们发布的示例代码进行比较,以了解差异所在。 下面是指向MSP430FR5969示例代码( http://dev.ti.com/tirex/#/?link=Software%2FMSP430Ware%2FDevices%2FMSP430FR5XX_6XX%2FMSP430FR5969 % 2FPeripheral %20Examples%2FRegister %20Level )的链接,您可以在其中找到多个I2C示例项目。 虽然示例项目必须是通用的,不能直接作为插件并适合所有实现,但它们是查看代码流,正确初始化和用例的好工具。

    另一个很好的资源是“应用报告” ,它侧重于MSP430 MCU ( http://www.ti.com/lit/an/slaa734/slaa734.pdf )上常见串行通信问题的解决方案。

    希望这为您找到问题提供了一个坚实的起点。 如有任何更新,请随时联系我们!

    此致,

    Matt Calvo

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

    我希望您在调试代码方面取得了很大进展。 请告诉我此线程是否有任何更新,以便我们可以在解决后关闭它。

    谢谢,此致,

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

    如果此线程没有更新,我将继续并将其关闭并记录。 如果您遇到任何其他问题,请随时在E2E上发布另一个线程以解决问题。 感谢您的联系!

    此致,

    Matt Calvo