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.
G2755做I2C从机,在测试中发现,主机低频率(每条数据间隔100MS读取)读取数据正常,而高频率(每条数据间隔10MS)读取数据时会出现概率性MCU自动复位现象。
主从机都是100KHZ。如下:初始化配置和中断处理。
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;
}
#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();
}
}