Вот как я использую I2C в 2148(38)
Иннициализация:
Код
//========== I2C ==========================
PINSEL0 |=0x50; // I2C connect
I2C0SCLH = 0x3C;
I2C0SCLL = 0x3C; // 12288000Hz / (0x0F+0x10) = 396387Hz
I2C0CONSET = 0x40;
Чтение
Код
unsigned char I2C_read(unsigned char reg){
unsigned char result;
//START
I2C0CONSET = 0x20; //STA
while (!( I2C0CONSET & SI)); // STAT == 0x08
//SLAVE ADDR, WRITE OP.
I2C0DAT = 0xE2;
I2C0CONSET = AA; // Set AA
I2C0CONCLR = STA | SI; // Im think 0x28
while (!( I2C0CONSET & SI));
//DATA
if (I2C0STAT == 0x18){
I2C0DAT = reg;
I2C0CONCLR = AA | SI; //Clear AA for /AA, Clear SI
} else if (I2C0STAT == 0x20){
I2C0CONSET = STO | AA;
I2C0CONCLR = SI;
return 0;
}
while (!( I2C0CONSET & SI));
//STOP
I2C0CONSET = STO;
I2C0CONCLR = SI;
//START
I2C0CONSET = STA; //STA
while (!( I2C0CONSET & SI)); // STAT == 0x08
//SLAVE ADDR, READ OP.
I2C0DAT = 0xE3;
I2C0CONSET = AA; //Set AA
I2C0CONCLR = STA | SI; //
while (!( I2C0CONSET & SI));
//READ THE DATA
if (I2C0STAT == 0x40){
//I2C0CONSET = AA;
I2C0CONCLR = SI | AA;
}else if (I2C0STAT == 0x48){
I2C0CONSET = STO | AA;
I2C0CONCLR = SI;
}
while (!( I2C0CONSET & SI));
//STOP
if (I2C0STAT == 0x50){
}else if (I2C0STAT == 0x58){
result = I2C0DAT;
I2C0CONSET = STO | AA; //0x14;
I2C0CONCLR = SI;
}
// I2C0CONSET = STO;
// I2C0CONCLR = SI;
return result;
}//I2C_read
Запись
Код
int I2C_write(unsigned char reg, unsigned char data){
//START
I2C0CONSET = STA;
while (!( I2C0CONSET & SI));
//SLAVE ADDR, WRITE OP.
I2C0DAT = 0xE2;
I2C0CONSET = AA;
I2C0CONCLR = STA | SI;
while (!( I2C0CONSET & SI));
//REG
if (I2C0STAT == 0x18){
I2C0DAT = reg;
I2C0CONCLR = SI; // Clear SI
} else if (I2C0STAT == 0x20){
I2C0CONSET = STO | AA;
I2C0CONCLR = SI;
return 1;
}
while (!( I2C0CONSET & SI));
//DATA
if (I2C0STAT == 0x28){
I2C0DAT = data;
I2C0CONCLR = AA | SI; //Clear AA for /AA, Clear SI
} else if (I2C0STAT == 0x30){
I2C0CONSET = STO | AA;
I2C0CONCLR = SI;
return 1;
}
while (!( I2C0CONSET & SI));
//STOP
I2C0CONSET = STO;
I2C0CONCLR = SI;
return 0;
}//I2C_write
Обработка состояний сдесь не полная.
Документация воистину рулит. Разжевано в картинках