Tengo un problema al ver las señales SCL y SDA en el osciloscopio. Estoy usando PIC18LF en modo maestro y el bus se detiene a Vcc. Creo que he programado correctamente, pero todo lo que veo es de 3.3 V en las líneas SDA y SCL del osciloscopio.
¡No puedo averiguar dónde he cagado!
Aquí está mi código:
//i2cdem.c
void init_oscillator(void)
{
// NOSC HFINTOSC; NDIV 1;
OSCCON1 = U8_SET_HFINTOSC_NDIV_1;
// CSWHOLD may proceed; SOSCPWR Low power;
OSCCON3 = 0x00;
// TUN 0;
OSCTUNE = 0x00;
OSCEN = 0x00; // MFOEN disabled; LFOEN disabled; ADOEN disabled; SOSCEN disabled; EXTOEN disabled; HFOEN disabled;
OSCFRQ = U8_NOMINAL_CLK_FRQ_8M; // Setting OSCFRQ register to 0x03 --> 8MHz
}
void set_I2C_baud_rate(unsigned int freq_KHZ)
{
volatile unsigned int F=8000;
volatile unsigned int temp=0;
temp = 80;
temp -= 4;
temp /= 4;
//temp=( (Fosc/freq_KHZ) - 4)/4 ;
SSP1ADD = temp;
}
void I2C_Inititalise()
{
SSP1CON1 = 0x28; //I2C Mode
PORTCbits.RC3 = 1; //SCL
PORTCbits.RC4 = 1; //SDA
TRISCbits.TRISC3 =0;
TRISCbits.TRISC4 =0;
TRISCbits.TRISC3 =1;
TRISCbits.TRISC4 =1;
LATCbits.LATC3 = 1;
LATCbits.LATC4 = 1;
SSP1CON2 = 0x00;
SSP1STAT = 0x80;
// SSP1BUF =( (U8_LDC_ADD<<1) | 0x00 );
}
void send_start()
{
SSP1CON2bits.SEN=1;
while(SSP1CON2bits.SEN);
}
void send_stop(){
SSP1CON2bits.PEN=1;
while(SSP1CON2bits.PEN);
}
void I2C_wait(void)
{
while( (SSP1STAT & 0x04) | (SSP1CON2 & 0x1F) );
PIR3bits.BCL1IF=0;
}
void write_to_bus(unsigned char data)
{
SSP1BUF = data;
}
//main.c
void main(void) {
init_oscillator();
I2C_Inititalise();
set_I2C_baud_rate(100); //set SCL to 100KHz
while(1){
send_start();
I2C_wait();
write_to_bus(U8_LDC_ADD<<1); //Address
I2C_wait();
send_stop();
}
return;
}