I2C configurando MCU como esclavo y maestro al mismo tiempo

Hola a todos, estoy trabajando en un nuevo proyecto con el microcontrolador TI MSP432P401R. Quiero tener 2 buses I2C separados. El bus I2C 1 configurará la MCU como maestra, mientras que el DAC y el sensor de presión como esclavos. Luego, el bus I2C 2 configurará la misma MCU como esclavo y el SmartPort como maestro (más específicamente, un dispositivo que conectemos al SmartPort será el maestro). No estoy seguro de cómo puedo hacer que la MCU sea esclava y maestra al mismo tiempo. Lo que intenté hacer fue definir 2 módulos eUSCI_b diferentes

void I2C_init(void)
{
/* Initialize USCI_B3 and I2C Master to communicate with slave devices*/
I2C_initMaster(EUSCI_B3_BASE, &i2cConfig);

/* Disable I2C module to make changes */
I2C_disableModule(EUSCI_B3_BASE);

/* Enable I2C Module to start operations */
I2C_enableModule(EUSCI_B3_BASE);

/* Initialize USCI_B3 and I2C Master to communicate with slave devices*/
I2C_initMaster(EUSCI_B0_BASE, &i2cConfig);

/* Disable I2C module to make changes */
I2C_disableModule(EUSCI_B0_BASE);

/* Enable I2C Module to start operations */
I2C_enableModule(EUSCI_B0_BASE);

return;
}

donde está i2cConfig

const eUSCI_I2C_MasterConfig i2cConfig =
{
    EUSCI_B_I2C_CLOCKSOURCE_SMCLK,          // SMCLK Clock Source
    48000000,                               // SMCLK = 48MHz
    EUSCI_B_I2C_SET_DATA_RATE_400KBPS,      // Desired I2C Clock of 100khz
    0,                                      // No byte counter threshold
    EUSCI_B_I2C_NO_AUTO_STOP                // No Autostop
};

y luego traté de usar esta función para cada módulo que definí para agregar esclavos. Pero el caso es que la función solo me permite ingresar una dirección de esclavo, pero para mi I2C bus1, tengo 2 esclavos: DAC y el sensor de presión.

extern void I2C_initSlave(uint32_t moduleInstance, uint_fast16_t slaveAddress,
    uint_fast8_t slaveAddressOffset, uint32_t slaveOwnAddressEnable);

Estaría muy agradecido si alguien me puede ayudar con este problema o mostrarme una mejor manera de implementar el mismo MCU como esclavo y maestro al mismo tiempo. Soy nuevo en la programación con el protocolo I2C y agradecería cualquier ayuda. Gracias y que tengas un buen día.

Para cualquier persona interesada en el tema, aquí hay un enlace al OP que hace la misma pregunta en el foro TI E2E, donde también tiene una respuesta.

Respuestas (1)

No estás pensando en el problema del todo bien. No está configurando la MCU para que sea esclava, está configurando un módulo de interfaz I2C (un eUSCI) para que sea maestro y otro eUSCI para que sea esclavo. El MSP432 en sí no es maestro ni esclavo, solo se comunica con los dos bloques eUSCI.

Hay dos nociones de dirección de esclavo. Una es la dirección esclava que el maestro (usted) usa para comunicarse con algún otro dispositivo, como un sensor de temperatura. Esa dirección de esclavo se usa solo durante la comunicación con el esclavo en particular, y luego se carga con un valor diferente cuando desea hablar con algún otro sensor o dispositivo periférico. No es necesario almacenar las direcciones de todos los dispositivos esclavos en los registros eUSCI.

La otra noción de una dirección esclava se usa cuando su eUSCI actúa como un dispositivo esclavo y algún otro dispositivo será el maestro. En este caso, la dirección del esclavo es más o menos permanente y debe definirse como parte de la inicialización, para que el eUSCI pueda reconocer cuando el maestro externo le está enviando un mensaje.

Por lo tanto, puede tratar los dos módulos eUSCI como si fueran completamente independientes. Sus señales SCL y SDA son independientes y el funcionamiento de los dos buses I2C puede ser completamente diferente.