Autor Tema: dspic33FJ64GP802 y MCP23017 (i2c)  (Leído 2856 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado skormel

  • PIC12
  • **
  • Mensajes: 50
    • Chaputronia
dspic33FJ64GP802 y MCP23017 (i2c)
« en: 07 de Marzo de 2013, 13:52:23 »
Muy buenas a todos,

Tengo un proyecto entre manos en el que, entre cosas, utiliza el bus I2C entre un dsPIC33FJ64GP802 y un MCP23017. Aunque la escritura la tengo resuelta con la lectura no hay forma. Este es el código que uso:

Función de lectura:
Código: [Seleccionar]

#define direccionBase 0b01000000        // 64 en decimal (valor prefijado por el fabricante)

uint8_t leeI2c(uint8_t addr, uint8_t reg)
{
    unsigned char lectura = 0x00;
    uint8_t addrFinalW = direccionBase + (addr << 1) + 0b0;
    uint8_t addrFinalR = direccionBase + (addr << 1) + 0b1;

    IdleI2C1();
    StartI2C1();
    while (I2C1CONbits.SEN);

//    IdleI2C1();
    MasterWriteI2C1(addrFinalW);

    IdleI2C1();
    MasterWriteI2C1(reg);
    ClrWdt();

    IdleI2C1();
//    AckI2C1();
    RestartI2C1();
//    while (I2C1CONbits.RSEN);
    ClrWdt();

//    IdleI2C1();
    MasterWriteI2C1(addrFinalR);
    ClrWdt();

    IdleI2C1();
    ClrWdt();
    lectura = MasterReadI2C1();
    //    ClrWdt();

    NotAckI2C1();
    StopI2C1();
    ClrWdt();

    return lectura;
}

Llamada a la función de lectura:
Código: [Seleccionar]
    #define mcpEntradas 0b000

    uint8_t canalB;
   
    canalB = leeI2c(mcpEntradas, GPIOB);

Siempre obtengo dos valores 0x44 o 0x00 que son totalmente indiferentes del estado que ponga en ese momento la pata (todo depende la modificación que haga sobre el código).

Lo realmente extraño es que si intento leer el estado del MCP no puedo activar ninguna salida en ninguno de los demás mcp de la placa.

¿Alquien puede arrojar algo de luz a este pozo?

Muchas gracias a todos.
Un saludo.


 

anything