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.

[参考译文] MSP430G2553:在 ADXL345上读取 I2C

Guru**** 2595770 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/627079/msp430g2553-i2c-read-on-adxl345

器件型号:MSP430G2553

我尝试从 ADXL345读取数据。 不幸的是、我的读取函数被卡在 forst 用法中。 是否有人知道为什么以及如何解决该问题?

void print (const unsigned char Data){
UCB0TXBUF = Data;
_ bis_SR_register (LPM3_BITS + GIE);
}

void prints (char data){
UCB0CTL1 = UCSWRST;
UCB0CTL0 = UCMODE_3 + UCSEL + UCSYNC;// I2C master = UCSWRST
;/ UCB0CTL1 = UCB0CTSST/ UCB0CT0 = UCB0CTA0;UCB0CTL = UCB0CTL0 = UCB0BRMODE_3 + UCSCLK/ UCB0CLK;使用
// 100kHz、16MHz
UCB0BR0 = 0x28; 16MHz 时为// 400kHz
// UCB0BR0 = 0x1B; 在16MHz 时为// 400kHz + 50%
// UCB0BR0 = 0x14; 在16MHz 时为// 400kHz + 100%
// UCB0BR0 = 0x08; 在16MHz 时为// 2MHz (400kHz + 400%)
// UCB0BR0 = 0x08; 16/MHz 时为// 4MHz
// UCB0BR0 = 0x02; // 16MHz 时为8MHz
UCB0I2CSA = DATA; //地址
UCB0CTL1 &=~









~UCSWRST;IE2 |= UCB0TXIE;//启用 TX 就绪中断__DISABLE_INTERRUPT ();UCB0CTL1 |= UCT+ UCTXSTT;// I2C TX,开始条件__bis_SR_register (LPM3_bits + GIE);UCB0CTL1


= UCTL void + UCB0CTL (UCTL);// UCB0CTL = UCTL void + UCTL (UCTL);// UCB0CTL = UCTL = UCTL void + UCTL (UCTL);// UCB0CTL = UCB0CTL)

UCB0CTL0 = UCMODE_3 + UCMST + UCSYNC;// I2C 主控模式
UCB0CTL1 = UCSSEL_2 + UCSWRST;//使用 SMCLK、保持 SW 复位
UCB0BR0 = 0x28; //< 400kHz
UCB0I2CSA =地址; //地址
UCB0CTL1 &=~UCSWRST;

IE2 |= UCB0TXIE;//启用 TX 就绪中断
__disable_interrupt ();

//转到寄存器
UCB0CTL1 = UCSSEL_2 + UCTR + UCTXSTT;// I2C RX,启动条件
__bis_SR 寄存器(UCB0CTL1 +

UCB0TXIE)位;// UCB0BR_3 + UCB0BR1 + UCTL = UCB0ST1 + UCB0BIT_BIG = UCB0CTL = UCB0BR1 + UCB0ST3;//
// I2C RX、起始条件
}

char 读取(void){
char 输出;
__bis_SR_register (LPM3_bits + GIE);
输出= UCB0RXBUF;

返回输出;
}


void adxl (void){
unsigned int hold;

prints (0x53);
print (0x32);
UCB0CTL1 = UCSSXEL_HOLD;}<CSTACL+读操作条件(UCSS3)


(= UCTL = UCSSL+ HOLD);读操作(UCTL = UCT3)(UCTL = UCTL = UCTL)(UCTL = UCTL)(U

GraV[1]=(read()<<3)+(HOLD>>5);
HOLD = Read();
GraV[2]=(read()<<3)+(HOLD>>);

UCB0CTL1 = UCSSEL_2 + UCTXSTP;
while (UCB0CTTE & UCTXSTP);

}

(void
0x08



)(prints (prints);prints (0x2C)(void)(prints (prints)(0x08);prints (void)(prints (prints)(prints)(void)(0x08)(prints)(void)(prints (print
列印(0x53);
列印(0x31);
列印(0x0D);
打印();
列印(0x53);
Print (0x1E);
print (0xFE);
print (0xFD);
print (0x0C);
Printe ();
}


void main (void){
WDTCTL = WDTPW + WDTHOLD;

DCOCTL = CALDCO_16MHz;//DCO 设置= 8MHz
BCSCTL1 = CALBC1_16MHz;//DCO 设置= 8MHz



//为 I2C 配置引脚
P1SEL |= BIT6 + BIT7; //引脚初始化
P1SEL2 |= BIT6 + BIT7; //引脚初始化

_delay_cycles (8000000);


initadxl();

adxl ();
}


// USCI_B0数据 ISR
#pragma vector = USCIAB0TX_vector
__interrupt void USCIAB0TX_ISR (void){
IFG2 &=~UCB0TXIFG;
__BIC_SR_REGISTER_ON_EXIT (LPM3_BITS); //唤醒主代码
} 

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

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

    我或多或少让它运行。 如果能重复实施启动、则会很好、但不幸的是、它不起作用。

    这里是重要的东西。 打印-打印(n 次)-打印(重复开始)-打印(n 次)-打印是我的测试用例。

    void prints (char data){
    IE2 &=~UCA0RXIE;
    UCB0CTL1 = UCSWRST;
    UCB0CTL0 = UCMODE_3 + UCMST + UCSYNC;// I2C 主模式
    UCB0CTL1 = UCSSWRST_2 + UCSWRST;//使用 SMCLK、保持 SW=
    UCB0BR0;复位0xA0 16MHz 时为// 100kHz
    // UCB0BR0 = 0x28; 16MHz 时为// 400kHz
    // UCB0BR0 = 0x1B; 在16MHz 时为// 400kHz + 50%
    // UCB0BR0 = 0x14; 在16MHz 时为// 400kHz + 100%
    // UCB0BR0 = 0x08; 在16MHz 时为// 2MHz (400kHz + 400%)
    // UCB0BR0 = 0x08; 16/MHz 时为// 4MHz
    // UCB0BR0 = 0x02; // 16MHz 时为8MHz
    UCB0I2CSA = DATA; //地址
    UCB0CTL1 &=~
    
    
    
    
    
    
    
    
    ~UCSWRST;IE2 |= UCB0TXIE;//启用 TX 就绪中断__DISABLE_INTERRUPT ();UCB0CTL1 |= UCTR + UCTXSTT;// I2C TX,开始条件__bis_SR_register (LPM3_bits + GIE);UCB0CTL1
    
    + UCTX0 = UCB0CTL + UCB0+ UCTXST/ UCB0UCTL = UCB0+ UCTL = UCB0CTL// I2C 主控模式
    // UCB0CTL1 = UCSSEL_2 + UCSWRST;//使用 SMCLK,保持软件复位
    // UCB0BR0 = 0xA0; 16MHz 时为// 100kHz
    // UCB0I2CSA = 0x3C; //地址
    //UCB0CTL1 &=~
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    ~UCSWRST;IE2 |= UCB0TXIE;//启用 TX 就绪中断__DISABLE_INTERRUPT ();UCB0CTL1 |= UCTR + UCTXSTT;// I2C TX,开始条件__bis_SR_register (LPM3_bits + GIE);UCB0CTL = UCTL + UCTL void + UCTL = UCB0CCTRI + UCTL = UCTL + UCTL = UCTL = UCTL + UCTL void + UCTL = UCTL = UCB0CCTRI + UCTL = UCTL = UCTL = UCTL = UCTL = UCTL + UCTL + UCTL = UCTL 
    while (UCB0CTL1 & UCTXSTP); } #pragma vector = USCIAB0TX_Vector _中断 void USCIAB0TX_ISR (void){ IFG2 &=~(UCB0TXIFG + UCB0RXIFG); __BIC_SR_REGISTER_ON_EXIT (LPM3_BITS); //唤醒主代码 }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我可以通过从 printSr ()中删除"_bis_SR_register (LPM3_bits + GIE);"来解决这个问题。