МК c8051f120, среда разработки Keil
Обмен по SMBus ( i2c ) работает при опросе флага SI:
Код
while(1){
if( (SMB0CN & 0x08) == 0x08 ){
if( SMB0STA == 0x80 ){
i2c = SMB0DAT;
printf( " i2c data = %X\n", i2c );
}
if( SMB0STA == 0xA8 ){
SMB0DAT = 0xA5;
}
SMB0CN &= ~(0x08);
}
}
При попытке перенести эти действия в прерывания, программа перестает работать, вернее просто не попадает в обработчик прерываний, что я определяю по косвенным признакам: например переменная temp не меняет своего значения
Вот текст обработчика:
Код
void I2C_ISR( void ) interrupt 7 using 1 {
if( SMB0STA == 0xA8 ){
SMB0DAT = 0xA5;
}
temp = 0x06;
}
И инициализация прерываний, которую я произвожу прямо перед основным циклом программы
Код
void Interrupts_Init()
{
IE = 0x88; //разрешить глоабльные прерывания и прерывания по Timer1
EIE1 = 0x02;//разрешить прерывания SMBus
}
Хочу заметить, что так же произвожу обмен по UART с помощью функции printf, может быть это как нибудь влияет