请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号: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;
}
}