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:在msp430fr5969中使用i2c访问加速计

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/666538/ccs-msp430fr5969-accessing-accelerometer-by-using-i2c-in-msp430fr5969

部件号:MSP430FR5969

工具/软件:Code Composer Studio

这是hariirkishna。当我在adxl345加速度计中读寄存器值时遇到了问题。。。这是为访问这些值而写的代码。。。从第一次读取正确的值,但再次确认重新启动程序,然后我得到0x00值为0。。。然后我写了 正确的停止条件also...please检查并告诉我问题在我的代码中的位置...

#include <MSP4S.h>

易失性无符号字符RXData;

内部主(无效)

WDTCTL = WDTPW | WDTHOLD;

//配置GPIO
P1OUT &=~BIT0;//透明的WFP 1.0 输出锁存器
P1DIR || BIT0;//用于LED
P1SEL1 || BIT6 | BIT7;

PM5CTL0 &=~LOCKLPM2;
__bis_sr_register( GIE);
UCB0CTLW0 |= UCSWRST;//已启用软件重置
UCB0CTLW0 |= UCMODE_3| UCMST | UCSYNC;// I2C模式,主模式,同步
UCB0CTLW1 |= UCASTP_2;//生成自动停止
UCB0BRW = 0x0008;//波特率= SMCLK / 8
UCB0I2CSA = 0x53;//从属地址
UCB0CTL1 &=~UCSWRST;

同时(1)

//UCB0CTLW0 &=~UCTXSTP;
while (UCB0CTL1和UCTXSTP);//确保已发送停止条件
UCB0CTL1 || UCTXSTT+UCTR;
P1OUT|=BIT0;
UCB0TXBUF=0xA6;//站点模式下的从属地址
(UCB0STATW&UCBUSY);
UCB0TXBUF=0x00;//注册我要在adxl345中阅读的地址
(UCB0STATW&UCBUSY);
UCB0CTL1 &=~UCTR;// I2C读取操作
UCB0CTL1 || UCTXSTT;
UCB0TXBUF=0xA7;//读取模式下的从属地址
UCB0IE&=~UCTXIE;
(UCB0STATW&UCBUSY);
UCB0IE|=UCRXIE;

}
}

#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector = USI_B0_vector
__interrupt void USI_B0_ISR(void)
#Elif已定义(__GMNU__)
void __attribute__((interrupt (USI_B0_vector)) USI_B0_ISR (void)
#否则
错误编译器不受支持!
#endif

Switch(__偶 数_in_range(UCB0IV, USI_I2C_UCBIT9IFG))

案例USI_NONE:Break;// Vector 0:no interrupts
案例USI_I2C_UCALIFG:中断;//矢量2:ALIFG
案例USI_I2C_UCNACKIFG://矢量4:NACKIFG
UCB0CTL1 || UCTXSTT;
中断;
案例USI_I2C_UCSTIFG:中断;//矢量6:STTIFG
案例USI_I2C_UCSTPIFG:中断;//矢量8:STPIFG
案例USI_I2C_UCRXIFG3:中断;//矢量10:RXIFG3
案例USI_I2C_UCTXIFG3:中断;//矢量12:TXIFG3
案例USI_I2C_UCRXIFG2:中断;//矢量14:RXIFG2
案例USI_I2C_UCTXIFG2:中断;//矢量16:TXIFG2
案例USI_I2C_UCRXIFG1:中断;//矢量18:RXIFG1
案例USI_I2C_UCTXIFG1:中断;//矢量20:TXIFG1
案例USI_I2C_UCRXIFG0://矢量22:RXIFG0
RXData = UCB0RXBUF;//读数后,在condition上静音
期间(UCB0CTL1和UCTXSTT);
UCB0CTLW0&=~UCTXSTP;
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//退出LPM0
中断;
案例USI_I2C_UCTXIFG0:中断;//矢量24:TXIFG0
案例USI_I2C_UCBCNTIFG://矢量26:BCNTIFG
P1OUT ^= BIT0;//在WFP 1.0 上切换LED
中断;
案例USI_I2C_UCCLTOIFG:中断;//矢量28:时钟低超时
案例USI_I2C_UCBIT9IFG:中断;//矢量30:第9位
默认值:中断;
}
}e2e.ti.com/.../0488.main.ce2e.ti.com/.../ADXL345-_2D00_-Accelerometer.pdf

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

    你好 ,hariirkishna,

    请参考所附代码。

    此致,

    林氏六音

    e2e.ti.com/.../4426.hal_5F00_ADXL345.c

    e2e.ti.com/.../2768.hal_5F00_ADXL345.h

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    HII... 凌竹2
    感谢您回放...我观察您的代码,您未使用从属写入地址UCB0TXBUF=0xA6;//在Wite模式下使用从属地址,而从属地址UCB0TXBUF=0xA7; 在读取模式下...为什么???在adxl345数据表中,计时图使用此地址...一旦看到数据表。由于这个原因,我在上面的程序中使用了...因此,我不是真的不需要。如果不是,请解释原因...谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    HII..Ling Zhu
    我只为读取操作运行您的代码,它不是working...it,而是(!(UCB0IFG&UCRXIFG0));...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,hariirkishna,

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Ling Zhu。
    感谢您的回放...我所说的是您使用0x1D作为从属地址的代码...但对于您的程序中未使用的地址0x3A和0x3B,请参阅您的代码...

    带符号字符I2C_READ_REGORG(unsigned char reg_addr)

    UCB0CTLW1 = UCASTP_1;
    UCB0TBCNT = 0x0001;
    UCB0CTL1 &=~UCSWRST;
    UCB0CTL1 || UCTXSTT + UCTR; //启动i2c写入操作
    while (!(UCB0IFG和UCTXIFG0));
    UCB0TXBUF = REG_ADDR;
    while (!(UCB0IFG和UCBCNTIFG));
    UCB0CTL1 &=~UCTR; // I2C读取操作
    UCB0CTL1 || UCTXSTT; //重复启动
    while (!(UCB0IFG和UCRXIFG0));
    RxData = UCB0RXBUF;
    UCB0CTLW0 |= UCTXSTP; //下一个RX后发送停止
    while (!(UCB0IFG和UCSTPIIFG));//确保已发送停止条件
    UCB0CTL1 |= UCSWRST;
    返回RxData;
    }
    ..这是您的代码,也是您不使用0X3A和0x3B作为上述代码的原因..如UCB0TXBUF=0X3A和UCB0TXBUF=0x3b...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,hariirkishna,

    从属地址(包括R/W位)将自动发送。 您只需将用户数据放入UCB0TXBUF即可。

    此致,
    林氏六音
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Ling Zhu。。
    感谢您的建议...最后我通过运行下面的代码获得了正确的值...但我又遇到了一些问题。当我第一次运行程序时,它给出了正确的值。但之后,我再次以如下所示的while循环运行此程序。程序将启动 这是while (!(UCB0IFG&UCTXIFG0));while loop或while (!(UCB0IFG&UCRXIFG0);while loop..)。然后我想多次执行此读取函数,并在检查错误后获得相同的value....please,并提供正确的读取函数..... 我通过手动清除并启用TXIFG0和RXIFG0标志来检查程序,但它不适用于我...


    #include <MSP4S.h>
    RXCHAR数据;
    volatile unsigned char reg_value;
    volatile unsigned char值;
    void clock_init();
    void Init_I2I();
    void write_byte(car reg_address,char data);
    char read_byte(car reg_addr);
    内部主(无效)


    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    PM5CTL0 &=~LOCKLPM2;
    P1SEL1 || BIT6 | BIT7; // I2C引脚
    __bis_sr_register (GIE);
    Clock_init();
    init_I2C ();

    同时(1)

    REG_Value=读取字节(0x2C);//读取REG_ADD值
    IF (REG_VALUE!= 0x00)
    Value=reg_value;
    }
    }
    void Init_I2I()

    UCB0CTLW0 |= UCSWRST;
    UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC|UCTR;
    UCB0CTLW0|=UCSSEL__SMCLK;
    UCB0BRW = 10;
    UCB0I2CSA = 0x53;
    UCB0CTLW0 &=~UCSWRST;
    UCB0IFG=0x0000;
    UCB0CTLW0 |= UCSWRST;
    }
    char read_byte (char reg_addr)

    UCB0CTLW1 |= UCASTP_1;
    UCB0CTLW0 &=~UCSWRST;
    UCB0CTL1 || UCT|UCTXSTT;
    while (!(UCB0IFG&UCTXIFG0));
    UCB0TXBUF=REG_ADDR;
    UCB0CTL1 &=~UCTR;
    UCB0CTL1 || UCTXSTT;
    while (!(UCB0IFG&UCRXIFG0));
    RXData = UCB0RXBUF;
    UCB0CTL1 || UCTXSTP;
    UCB0CTLW0 |= UCSWRST;
    返回RXData;
    }
    void clock_init()

    CSCTL0_H = CSOKEY >> 8; //解锁CS寄存器
    CSCTL1 = DCOFSEL_0; //将DCO设置为1MHz
    CSCTL2 =拉美经济体系_ LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;
    CSCTL3 = DIVA__1 | DIVs__1 | DIVM__1; //设置所有分禾器
    CSCTL0_H = 0;
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 ,harikrishna,

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,朱玲。
    感谢您的重播。
    在上述代码中,我没有使用UCB0TBCNT=0x0001。因为我不想对值进行计数,所以我不使用flag...it不是读取和写入数据所必需的,I think..it仅用于计数目的...我的问题是I 第一次得到正确的值,然后我想再次运行程序,它是在以下两个循环中运行的:此循环while (!(UCB0IFG&UCRXIFG0));或此循环while (!(UCB0IFG&UCTXIFG0));..此UCB0TBCNT是否需要读写????
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,harikrishna,

    有关如何在IIC模式下使用eUSCI的更多详细信息,请参阅用户指南和代码示例。

      

       

    此致,

    林氏六音