Добрый день. Есть микроконтроллер MSP40F5438 и не могу побороть проблему замкнутого цикла while( UCB1STAT & UCBBUSY ); Поиск показал, что я не одинок, и нашел информацию о том, что необходимо реализовывать I2C Bus Clear, из спецификации. Для этого написал простой цикл( здесь, и далее я использую UCB1, у которого PORT5.4 - SCL, PORT3.7 - SDA):
Код
P5DIR |= BIT4;
P5SEL &= ~BIT4;
P5OUT &= ~BIT4;
for( pulseCounter = 0; pulseCounter < 9; pulseCounter++ ) {
P5OUT |= BIT4;
__delay_cycles( 100 );
P5OUT &= ~BIT4;
__delay_cycles( 100 );
}
P5OUT |= BIT4;
P5SEL |= BIT4;
После его выполнения, шина по прежнему остается занятой. Микроконтроллер работает на частоте 25МГц поэтому __delay_cycles( 100 ); дает задержку в 5мкс.
Как все таки правильно делать ресет шины? Единственное, что пока я нашел, что шина становится свободной, как только я переподключаю девайс с которым общаюсь. Протокол обмена с девайсом прост - изначально контроллер и девайс находятся в режиме в slave-receiver, а переключаются в master-transmitter только когда нужно что-то передать. После конфигурирования, мне необходимо инициализировать девайс, но это невозможно т.к шина занята.
Спасибо за любые идеи.