请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:MSP430FR5.9941万 在这个新零件中,我在通过I2C重新启动和注册读数时遇到了一些问题。 我以前的MSP430上使用了旧代码,但它没有很好地移植到新的MSP430上。 当我运行下面的代码时,会出现一个0x40的写入,接着是0x00的写入,接着是重新启动,但是0x40会出现并设置了读取位,然后又出现了另一个意外的0x60写入。 我不知道我做了什么错了,这些例子似乎从未显示如何进行I2C类型的访问:) 任何建议都值得赞赏,我正在努力解决这个问题。
UCB1CTLW0 = UCSWRST; //将eUSI_B置于重置状态 UCB1CTLW0 |= UCMODE_3 | UCMST | UCSSEL__SMCLK;// I2C主模式,SMCLK UCB1BRW = 0x8; //波特率= SMCLK / 8 UCB1CTLW0 &=~UCSWRST; //清除复位寄存器 UCB1IE |= UCTXIE0 | UCNACKIE; //传输和nack中断启用 UCB2IE |= UCRXIE | UCNACKIE | UCBCNTIE;//接收中断启用 SlaveFlag =0; //初始化SlaveFlag TXByteCtr = 2; //加载TX字节计数器 UCB1I2CSA = 0x40;//配置从属地址 While (UCB1CTLW0和UCTXSTP); //确保停止条件已发送 UCB1CTLW0 |= UCTR | UCTXSTT; // I2C TX,启动条件 __bis_sr_register(LPM0_bits | GIE);//输入带中断的LPM0 UCB1TXBUF = 0x00;//将地址加载到缓冲区 __bis_sr_register(LPM0_bits | GIE);//输入带中断的LPM0 //清除TX标记 UCB1IFG &=~UCTXIFG;//清除TX标志 //切换到RX模式 UCB1CTL1 &=~UCTR;//更改为Rx模式 UCB1IFG &=~UCRXIFG;//清除Rx IFG UCB1CTL1 || UCTXSTT;//发送启动以重新启动 //while (UCB1CTL1和UCTXSTT);//wait for start to be set which will be a TXIFG interrupt flag.(正在设置启动,它将是TXIFG中断标志。 __bis_sr_register(LPM0_bits | GIE);//输入带中断的LPM0 //完成后停止 UCB1CTLW0 |= UCTXSTP; // I2C停止条件 UCB1IFG &=~UCTXIFG; //清除USI_B2 TX int标志 返回0; #pragma vector=Timer1_A0_vector __interrupt void Timer1_A0 (void){ // Timer0 A0中断服务例程 //检查按钮状态 IF ((P1IN和BIT0)== BIT0){ button_timer = 0; 其他{ button_timer++; //如果按钮定时器>阈值开关状态 IF (button_timer >= PWR_BUTTON阈值){ CHANGE_PWR_STE_FLAG =1; } } //用于调试的闪存LED IF ((P8OUT & BIT0)== BIT0){ P8OUT &=~BIT0; 其他{ P8OUT || BIT0; } //清除中断 TA1CTL &=~BIT0; TA1CCTL0 &=~CCIFG;//清除中断 //TA1CTL &=~(MC_1);//停止计时器_A __BIC_SR_REGISTER_ON_EXIT (LPM0_BITS+GIE);// ISR退出时清除LPM位 } #if已定义(__TI_Compiler_version__)||已定义(__ISR_SYSTEMS _ICC__) #pragma向量= EUSCI_B1_Vector __interrupt void UI_B1_ISR(void_IAL_ISR_ELSE #) 编译器#SCI_ELSE (void_US_I_IAL_SCI_) #endif { Switch(__偶 数_in_range(UCB1IV, USI_I2C_UCBIT9IFG)) { 案例USI_NONE: 中断; //矢量0:无中断 案例USI_I2C_UCALIFG:中断; //矢量2:ALIFG 案例USI_I2C_UCNACKIFG: //矢量4:NACKIFG UCB2CTLW0 |= 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 = UCB2RXBUF; //获取RX数据 __BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//退出LPM0 中断; 案例USI_I2C_UCTXIFG0: //矢量24:TXIFG0 /*IF (TXByteCtr) //检查TX字节计数器 { UCB1TXBUF = TXData[SlaveFlag];//加载TX缓冲区 TXByteCtr // Decrement TX字节计数 器} 否则 { UCB1CTLW0 |= UCTXSTP; // I2C停止条件 UCB1IFG &=~UCTXIFG; //清除USI_B2 TX int标志 __BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//退出LPM0 }*/ __BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//退出LPM0 中断; 案例USI_I2C_UCBCNTIFG:中断; //矢量26:BCNTIFG 案例USI_I2C_UCCLTOIFG:中断; //向量28:时钟低超时 案例USI_I2C_UCBIT9IFG:中断; //矢量30:第9位 默认值:break; } }