Quantcast
Channel: MSP 低功耗微控制器论坛 - 最近的话题
Viewing all articles
Browse latest Browse all 3634

MSP430G2755,做USCI_I2C从机,在按键退出低功耗时会出现I2C-SDA一直被拉低

$
0
0

2755做硬件I2C从机。正常情况下休眠在LPM3,I2C可以正常通讯。按按键退出LPM3,有时会出现SDA一直被拉低,只能重新初始化USCI。

现贴出按键中断配置,和USCI从机配置。请高手帮忙分析一下,感激不尽。

#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
__bic_SR_register_on_exit(LPM3_bits); //退出中断的同时退出低功耗 只能用于中断
if(P2IFG&BIT2)//如果P2.2的中断标志位为1 延时消抖
{
delay_ms(10);
if(P2IFG&BIT2)//如果P2.2延时后的中断标志位还是1 证明确实有按键按下
{
if(!(P2IN&BIT2))//再次检测P2.2的输入状态
{
if(key_flag1==1)
{
key_flag2=1;
}
key_flag1=1;//第一次按键按下标志位
}
P2IFG&=~BIT2;
}
}

}

I2C部分,

void TI_USCI_I2C_slaveinit(void (*SCallback)(),void (*TCallback)(unsigned char volatile *value),void (*RCallback)(unsigned char value),void (*StCallback)(),unsigned char slave_address){
P3SEL |= SDA_PIN + SCL_PIN; // Assign I2C pins to USCI_B0
UCB0CTL1 |= UCSWRST; // Enable SW reset
UCB0CTL0 = UCMODE_3 + UCSYNC; // I2C Slave, synchronous mode
UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
UCB0BR0 = 10; // Set prescaler 1M/10~100KHZ
UCB0BR1 = 0;
UCB0I2COA = slave_address; // set own (slave) address
UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
// IE2 |= UCB0TXIE + UCB0RXIE; // Enable TX RX interrupt
// UCB0I2CIE |= UCSTTIE+UCSTPIE; // Enable STT STP interrupt
TI_start_callback = SCallback;
TI_stop_callback = StCallback;
TI_receive_callback = RCallback;
TI_transmit_callback = TCallback;
}
void USCI_I2C_Enable(void)
{
IE2 |= (UCB0TXIE + UCB0RXIE); // Enable TX RX interrupt
UCB0I2CIE |= (UCSTTIE+UCSTPIE); // Enable STT STP interrupt
}
void USCI_I2C_DisEnable(void)
{
IE2 &=~(UCB0TXIE + UCB0RXIE); // DisEnable TX RX interrupt
UCB0I2CIE &=~(UCSTTIE+UCSTPIE); // DisEnable STT STP interrupt
}
unsigned char TI_USCI_I2C_notready(void)
{
return (UCB0STAT & UCBBUSY);
}
// USCI_B0 Data ISR
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
if (IFG2 & UCB0TXIFG)
{
TI_transmit_callback(&UCB0TXBUF);
}
else
{
TI_receive_callback(UCB0RXBUF);
}

}

// USCI_B0 State ISR
#pragma vector = USCIAB0RX_VECTOR
__interrupt void USCIAB0RX_ISR(void)
{
if(UCB0STAT&UCSTTIFG)
{
UCB0STAT &= ~UCSTTIFG; // Clear start condition int flag
rxnum=0;//接收到开始信号清零
}
if(UCB0STAT&UCSTPIFG)
{
UCB0STAT&=~UCSTPIFG;
TI_stop_callback();
}
}

void start_cb(){
for(unsigned char index=0;index<sizeof(I2C_RXData);index++)
{
I2C_RXData[index]=0;
}
}
void stop_cb(){
I2C_flag=0;
}
void transmit_cb(unsigned char volatile *byte){
*byte = I2C_Block_TXData[I2C_flag];
I2C_flag++;
}

void receive_cb(unsigned char receive){
unsigned char temp[37]={0},rxtemp=0;
temp[0]=0x16;
temp[2]=0x17;
rxtemp=receive;
I2C_RXData[rxnum]= rxtemp;
rxnum++;

}


Viewing all articles
Browse latest Browse all 3634

Trending Articles