PIC24 - prueba el módulo I2C muerto / vivo

1

Obtuve PIC24FJ192GB106 (paquete de 64 pines) y no consigo que el módulo I2C funcione en absoluto. ¿Cuál es la forma más fácil y directa de probar si el módulo está bien?

Estoy usando el módulo I2C1, (SCL1 - pin 44, SDA1 - pin 43).

BRG register = 39; // 100 kHz for Fosc = 8 MHz

// Control register
    I2C1CONbits.I2CEN = 1;    
    I2C1CONbits.I2CSIDL = 0;   
    I2C1CONbits.SCLREL = 1; 
    I2C1CONbits.IPMIEN = 0;   
    I2C1CONbits.A10M = 0;    
    I2C1CONbits.DISSLW = 1;   
    I2C1CONbits.SMEN = 0;     
    I2C1CONbits.GCEN = 0;   
    I2C1CONbits.STREN = 0;   
    I2C1CONbits.ACKDT = 0;    
    I2C1CONbits.ACKEN = 0;   
    I2C1CONbits.RCEN = 0;   
    I2C1CONbits.PEN = 0;
    I2C1CONbits.RSEN = 0;      
    I2C1CONbits.SEN = 0;


// starting the module
I2C1CONbits.I2CEN = 1;

// setting the START CONDITION
I2C1CONbits.SEN = 1;

No hay respuesta. La condición de inicio no se ejecuta. El periférico I2C se encuentra en los pines no removibles. El registro TrisD completo (pin 43 = D9, pin 44 = D10) se establece como entrada (después del restablecimiento). Los pines tienen pull-ups (3.3 V, 4.7 kOhm). También he intentado establecer el bit correspondiente en ODCD a 1 (pin digital) y 0 (drenaje abierto).

¿Me he perdido algo? El microcontrolador funciona bien (UART, PWM, reloj de referencia, ADC, ...).

Apreciaría cualquier orientación.

    
pregunta Martin G

3 respuestas

0

Ve por el camino difícil.

Escriba la rutina de prueba para enviar bits de inicio o detención y póngala en un bucle while.

Tu código principal se verá así.

main
{
initialize i2c();//Configure the I2C module in this function
while(1)
{
 i2c_send(); //Learn how the I2C transmits data and send the data   accordingly.
}

}
  

Ahora toma un osciloscopio y observa las formas de onda.

Si no has arruinado las configuraciones o las inicializaciones, verás las ondas mágicas.

    
respondido por el Rookie91
1

Si está usando XC16, puede #include <i2c.h> e intentar usar la llamada de biblioteca OpenI2C1() para realizar el trabajo sucio de configurar el periférico en lugar de escribir directamente en el SFR.

Aquí está el código que utilizo para abrir I2C1 como maestro:

#include <i2c.h>

u16Clk = 39; // specified by OP

OpenI2C1(
    I2C1_ON &
    I2C1_IDLE_CON &
    I2C1_7BIT_ADD &
    I2C1_STR_EN &
    I2C1_SLW_DIS &
    I2C1_GCALL_DIS &
    I2C1_SM_EN &
    I2C1_IPMI_DIS,
    u16Clk
);

Una vez que está abierto, puede ver si funciona enviando un inicio, enviando una dirección arbitraria (no reservada), luego enviando una parada (mientras analiza las líneas).

StartI2C1();
MasterWriteI2C1(data);
MasterWaitForIntrI2C1();
StopI2C1();
    
respondido por el Adam Lawrence
0

Gracias por todas las respuestas.

El módulo está definitivamente muerto. El código funciona bien para el módulo I2C2.

    
respondido por el Martin G

Lea otras preguntas en las etiquetas