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
