This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CCS/TMS320F28379D: SCD and ARDY interrupts does not occur, XRDY interrupt occurs twice

Part Number: TMS320F28379D


Tool/software: Code Composer Studio

Hello,

since a few days i am struggling with the follow problems:

I have a C2000 Delfino board with TMS320F28379D processor. I have implemented a I2C-Slave software, wich should act in slave-transmitter mode. I have an I2C master (Atmel ATmega48) wich receive an array of 5 bytes from a slave by pushing a button (i have tested it and it went fine with all other I2C slaves, so the issues are definitely not on this part!). The problem is, that the XRDY interrupt occurs before the AAS interrupt occurs and that makes no sense, right? Further the AAS interrupt occurs twice in one cycle when transmitting a byte to the Atmel chip. 

On the other hand neither a SCD nor a ARDY interrupt occours. That makes also no sense, because i have seen the stop condition from the master on an oszilloscope. So the TMS320F28379D  definitley get a stop condition. But why does no interrupt occour? Below my code.

//---------------------------------------------------------------------------------------------------------------------
// Global variables
//---------------------------------------------------------------------------------------------------------------------
extern Uint16 i2cTransmitIndex = 0;
//---------------------------------------------------------------------------------------------------------------------
// Global functions
//---------------------------------------------------------------------------------------------------------------------
//=== Function: I2cSlaveInit ==========================================================================================
///
/// @brief  Function initialize the I²C interface
///
/// @param  Uint16 slaveAddress
///
/// @return void
//=====================================================================================================================
extern void I2cSlaveInit(Uint16 slaveAddress)
{
    // Initialisierung für Zugriff von CPU1 (auskommentieren, falls Zugriff von CPU2):
    // GPIOs für den I²C-Betrieb initialisieren
    EALLOW;
    // Pullups für GPIO 104 und 105 (Block D) aktivieren
    GpioCtrlRegs.GPDPUD.bit.GPIO104 = 0;
    GpioCtrlRegs.GPDPUD.bit.GPIO105 = 0;
    // Asynchroner Modus für GPIO 104 und 105 (Block D) aktivieren
    GpioCtrlRegs.GPDQSEL1.bit.GPIO104 = 3;
    GpioCtrlRegs.GPDQSEL1.bit.GPIO105 = 3;
    // SDA(A) an GPIO 104, SCL(A) an GPIO 105
    GpioCtrlRegs.GPDMUX1.bit.GPIO104 = 1;
    GpioCtrlRegs.GPDMUX1.bit.GPIO105 = 1;
    EDIS;
    // Vorteiler für das I²C-Modul einstellen
    // Zuerst muss das I²C-Modul im Reset-Status versetzt werden
    I2caRegs.I2CMDR.bit.IRS = 0;
    // Vorteiler auf 20 stellen
    // Resultierende I²C-Modul-Frequenz: 10MHz (Sollwert laut Datenblatt: 7-12MHz)
    I2caRegs.I2CPSC.all = 20;
    // Reset-Status wieder verlassen
    I2caRegs.I2CMDR.bit.IRS = 1;
    // Slaveadresse setzen
    I2caRegs.I2COAR.all = slaveAddress;
    // Siehe Seite 92 ff. für Interrupts
    // Interrupts global deaktivieren (DisableINTerrupts)
    DINT;
    // Register vor Zugriff der CPU schützen
    EALLOW;
    // Peripheral-Interrupt-Expansion freigeben
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
    // Interrupt-Vector in die PIE-Tabelle schreiben
    PieVectTable.I2CA_INT = &I2CINT1A_ISR;
    // I2C-Interrupt freigeben
    PieCtrlRegs.PIEIER8.bit.INTx1 = 1;
    // Gruppe 8 Interrupts freigeben
    IER |= M_INT8;
    // Enable addressed-as-slave Interrupt
    I2caRegs.I2CIER.bit.AAS  = 1;
    // Enable stop-detection Interrupt
    I2caRegs.I2CIER.bit.SCD  = 1;
    // Enable data-transmit-ready Interrupt
    I2caRegs.I2CIER.bit.XRDY = 1;
    // Enable data-receive-ready Interrupt
//    I2caRegs.I2CIER.bit.RRDY = 1;
    // Enable register-access-ready Interrupt
    I2caRegs.I2CIER.bit.ARDY = 1;
    // Register wieder freigeben
    EDIS;
    // Interrupts global aktivieren (EnableINTerrupts)
    EINT;
}

//=== ISR: I2CINT1A_ISR ===============================================================================================
///
/// @brief  Interrupt service routine of the I²C interface
///
/// @param  void
///
/// @return void
//=====================================================================================================================
__interrupt void I2CINT1A_ISR(void)
{
    // Interruptquelle auslesen
    Uint16 interruptSource = (I2caRegs.I2CISRC.all & I2C_MASK_INTERRUPT_SOURCE);
    // Interrupt auswerten:
    switch (interruptSource)
    {
        // Als Slave angesprochen (0x07)
        case I2C_ADDRESSED_AS_SLAVE:
            // Als Slave-Transmitter angesprochen
            if (I2caRegs.I2CSTR.bit.SDIR)
            {
                // Datenbyte in den Ausgangspuffer schrieben
                I2caRegs.I2CDXR.all = i2cTransmitIndex;
                i2cTransmitIndex++;
            }
            break;
        // Stop-Bedinung empfangen (0x06)
        case I2C_STOP_CONDITION:
            // This never happend!
            break;
        // Register-ready (0x03)
        case I2C_REGISTER_ACCESS_READY:
            // This also never happend!
            break;
        // Daten gesendet (0x05)
        case I2C_TRANSMIT_DADTA_READY:

            // This happend twice per cycle!

            // Datenbyte in den Ausgangspuffer schrieben
            I2caRegs.I2CDXR.all = i2cTransmitIndex;
            i2cTransmitIndex++;
            // Status-Bit löschen
            I2caRegs.I2CSTR.bit.XRDY = 1;
            break;
    }
    // ACK-Bit für Gruppe 8 Interrupts löschen damit die CPU wieder weitere Interrupts empfängt
    PieCtrlRegs.PIEACK.bit.ACK8 = 1;
}

Has anybody an idea whats the problem?

Thanks