Autor Tema: Slave I2C con varias direcciones  (Leído 5027 veces)

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

Desconectado PicMinor

  • PIC16
  • ***
  • Mensajes: 236
Slave I2C con varias direcciones
« en: 02 de Septiembre de 2025, 05:58:58 »
¡Saludos al grupo!

La pregunta es muy simple: ¿Se puede configurar un Pic en modo i2c slave para que se dispare la interrupción con varias direcciones?

¡Gracias por la respuesta!

Desconectado Yoshua

  • PIC16
  • ***
  • Mensajes: 213
Re:Slave I2C con varias direcciones
« Respuesta #1 en: 03 de Septiembre de 2025, 14:47:09 »
No, podes hacer en secuencia pero no todas al mismo tiempo

Desconectado misterweb

  • PIC16
  • ***
  • Mensajes: 128
Re:Slave I2C con varias direcciones
« Respuesta #2 en: 19 de Octubre de 2025, 18:48:34 »
A lo mejor podria ser asi:

#include <xc.h>

// Direcciones I2C que responderá el esclavo
#define I2C_ADDR_1 0x30
#define I2C_ADDR_2 0x40
#define I2C_ADDR_3 0x50

void I2C_Slave_Init(void) {
    // Configurar pines I2C
    TRISC3 = 1;  // SCL como entrada
    TRISC4 = 1;  // SDA como entrada
   
    // Configurar MSSP en modo I2C esclavo
    SSPCON1 = 0x36;  // Modo I2C esclavo, 7-bit address
    SSPCON2 = 0x00;
   
    // Habilitar interrupciones
    SSPIF = 0;
    SSPIE = 1;
    PEIE = 1;
    GIE = 1;
}

void interrupt ISR(void) {
    if (SSPIF) {
        // Verificar estado del módulo I2C
        unsigned char status = SSPSTAT & 0x2D;
       
        // Dirección recibida + bit R/W
        unsigned char received_addr = SSPBUF;
       
        // Verificar si coincide con alguna dirección
        if ((received_addr >> 1) == I2C_ADDR_1 ||
            (received_addr >> 1) == I2C_ADDR_2 ||
            (received_addr >> 1) == I2C_ADDR_3) {
           
            // ACK automático si SSPADD coincide
            // Para direcciones múltiples, usar lógica adicional
           
            if (status & 0x04) {  // Es lectura
                // Preparar datos para enviar
                SSPBUF = tu_dato_a_enviar;
            } else {  // Es escritura
                // Leer datos recibidos
                unsigned char dato = SSPBUF;
                // Procesar dato...
            }
        }
       
        SSPIF = 0;
    }
}


 

anything