I2C stellt die MCU gleichzeitig als Slave und Master ein

Hallo zusammen, ich arbeite an einem neuen Projekt mit dem TI MSP432P401R Mikrocontroller. Ich möchte 2 separate I2C-Busse haben. I2C-Bus 1 stellt die MCU als Master ein, während der DAC und der Drucksensor als Slaves dienen. Dann stellt der I2C-Bus 2 dieselbe MCU als Slave und den SmartPort als Master ein (genauer gesagt, ein Gerät, das wir mit dem SmartPort verbinden, wird der Master sein). Ich bin mir nicht sicher, wie ich die MCU gleichzeitig zu einem Slave und einem Master machen kann. Ich habe versucht, zwei verschiedene eUSCI_b-Module zu definieren

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;
}

wo i2cConfig ist

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
};

und dann versucht, diese Funktion für jedes Modul zu verwenden, das ich zum Hinzufügen von Slaves definiert habe. Aber die Sache ist, die Funktion erlaubt mir nur, eine Slave-Adresse einzugeben, aber für meinen I2C-Bus1 habe ich 2 Slaves: DAC und den Drucksensor.

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

Ich wäre sehr dankbar, wenn mir jemand bei diesem Problem helfen oder mir einen besseren Weg zeigen könnte, dieselbe MCU gleichzeitig als Slave und als Master zu implementieren. Ich bin neu in der Programmierung mit dem I2C-Protokoll und würde mich über jede Hilfe freuen. Vielen Dank und einen schönen Tag.

Für alle, die sich für das Thema interessieren, hier ist ein Link zum OP, das dieselbe Frage im TI E2E-Forum stellt, wo es auch eine Antwort gibt.

Antworten (1)

Sie denken nicht ganz richtig über das Problem nach. Sie stellen die MCU nicht als Slave ein, Sie stellen ein I2C-Schnittstellenmodul (ein eUSCI) als Master und ein anderes eUSCI als Slave ein. Der MSP432 selbst ist weder Master noch Slave, er spricht nur mit den beiden eUSCI-Blöcken.

Es gibt zwei Begriffe der Slave-Adresse. Eine ist die Slave-Adresse, die der Master (Sie) verwendet, um mit einem anderen Gerät zu kommunizieren, z. B. einem Temperatursensor. Diese Slave-Adresse wird nur für die Dauer der Kommunikation mit dem jeweiligen Slave verwendet und dann mit einem anderen Wert geladen, wenn Sie mit einem anderen Sensor oder Peripheriegerät sprechen möchten. Es ist nicht erforderlich, die Adressen aller Slave-Geräte in eUSCI-Registern zu speichern.

Der andere Begriff einer Slave-Adresse wird verwendet, wenn Ihr eUSCI als Slave-Gerät fungiert und ein anderes Gerät der Master ist. In diesem Fall ist die Slave-Adresse mehr oder weniger fest und muss im Rahmen der Initialisierung definiert werden, damit die eUSCI erkennen kann, wenn der externe Master eine Nachricht an sie sendet.

Sie können also die beiden eUSCI-Module als völlig unabhängig voneinander behandeln. Ihre SCL- und SDA-Signale sind unabhängig, und der Betrieb der beiden I2C-Busse kann völlig unterschiedlich sein.