Возникла проблема с МК Silabs C8051F352. Есть задача связать по I2C (SMbus) этот контроллер и mega88, причем F352 должен быть мастером. Дело в том, что просто не выставляется старт при выпролнении STA=1. Хотя линия свободна (на SCL и SDA высокий уровень). Конфигурирую всю периферию с помощью Configuration Wizard 2. Если кто-то с такой проблемой сталкивался или есть идеи, как решить, напишите, плз
Код
void SMBus_Init()
{
SMB0CF = 0xDC;
}
void Write_mega(unsigned char adress, unsigned char dat )
{
unsigned char i;
unsigned char time = 0x10;
STA = 1; // Start transfer
while (!MASTER);
while (!SI); // ждём появления прерывания по завершению операции (SI = 1)
for ( i = 0; i < time; i++ );
SI = 0; // Clear interrupt flag
led_1_on();
SMB0DAT = adress; // посылаем адрес
STA = 0; // end Start transfer
if(ACK)
{
while (!SI); // ждём появления прерывания по завершению операции (SI = 1)
SI = 0; // Clear interrupt flag
for ( i = 0; i < time; i++ ); //
led_2_on();
SMB0DAT = dat; // посылаем значение регистра
if(ACK)
{
while (!SI); // ждём появления прерывания по завершению операции (SI = 1)
SI = 0; // Clear interrupt flag
for ( i = 0; i < time; i++ ); //
STO = 1;
led_3_on();
}
}
}
{
SMB0CF = 0xDC;
}
void Write_mega(unsigned char adress, unsigned char dat )
{
unsigned char i;
unsigned char time = 0x10;
STA = 1; // Start transfer
while (!MASTER);
while (!SI); // ждём появления прерывания по завершению операции (SI = 1)
for ( i = 0; i < time; i++ );
SI = 0; // Clear interrupt flag
led_1_on();
SMB0DAT = adress; // посылаем адрес
STA = 0; // end Start transfer
if(ACK)
{
while (!SI); // ждём появления прерывания по завершению операции (SI = 1)
SI = 0; // Clear interrupt flag
for ( i = 0; i < time; i++ ); //
led_2_on();
SMB0DAT = dat; // посылаем значение регистра
if(ACK)
{
while (!SI); // ждём появления прерывания по завершению операции (SI = 1)
SI = 0; // Clear interrupt flag
for ( i = 0; i < time; i++ ); //
STO = 1;
led_3_on();
}
}
}