www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 I2C DMA with EMBOS events


Autor: Hansi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen

Ich habe einen I2C treiber der mittels DMA Bytes sended und empfängt. 
Das ganze ist mit interrupts gelöst, also einerseits diese Event 
Interrupts des I2C modules und den DMA Interrupts. Nun möchte ich aber 
dass der Task in der I2C routine nicht mittels eines whiles warten muss 
sondern sich schlafen legt und auf ein event wartet. Leider funktioniert 
dann das ganze nicht mehr und ich weiss nicht wo das Problem liegt. Ich 
schicke das Event aus der I2C_EVT ISR routine. Hoffe ihr könnt mir 
helfen.

RETCODE I2Cdrv_DMASendData(void* pBuffer, UINT8 NumByteToWrite, UINT8 addr)
{

  /* Check I2C Semaphore */
  OS_Use(&sema);


  /* Wait while the bus is busy */
  while(I2C_GetFlagStatus(i2cDev, I2C_FLAG_BUSY));

  I2C_AcknowledgeConfig(i2cDev, DISABLE);

  // Reconfigure DMA
  dmaCfg.DMA_BufferSize = NumByteToWrite;
  DMA_DeInit(TxChannel);
  DMA_Init(TxChannel, &dmaCfg);
  
  DMA_ITConfig(TxChannel, DMA_IT_TC, ENABLE);
  I2C_ITConfig(i2cDev, I2C_IT_EVT, ENABLE);
  I2C_DMACmd(i2cDev, ENABLE);
  // Start
  I2C_GenerateSTART(i2cDev, ENABLE);

  
  // Wait EOT iterrupt or I2C Error Status Flags Interrupt
  OS_EVENT_Wait(&event);


  /* Make sure that the STOP bit is cleared by Hardware before CR1 write access */
  while ((i2cDev->CR1&0x200) == 0x200);

  OS_Unuse(&sema);

  return NO_ERROR;
}


void I2Cdrv_DMA_TX_ISR()
{
  DMA_Cmd(TxChannel, DISABLE);
  DMA_ClearFlag(dmaTxFlag);
}


void I2Cdrv_EV1_ISR()
{

  switch (I2C_GetLastEvent(i2cDev))
  {
    case I2C_EVENT_MASTER_MODE_SELECT:                 /* EV5 */

      if( Send_Receive )
      {
        // Send slave Address for write
        I2C_Send7bitAddress(i2cDev, Addr, I2C_Direction_Transmitter);
      }
      else
      {
        // Send slave Address for read
        I2C_Send7bitAddress(i2cDev, Addr, I2C_Direction_Receiver);
      }
      break;

      /* Test on I2C1 EV6 and first EV8 and clear them */
    case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED:

      DMA_Cmd(TxChannel, ENABLE);
      break;

      // EV8
    case I2C_EVENT_MASTER_BYTE_TRANSMITTING:
      break;

    case I2C_EVENT_MASTER_BYTE_TRANSMITTED:
    // I2C STOP Condition
    i2cDev->CR1 |= 0x200;
    // Avoid additional BTF interrupt
    I2C_ITConfig(i2cDev, I2C_IT_EVT, DISABLE);
    // Signal that Transfer is finished
    OS_EVENT_Set(&event);
      break;

    case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED:
      // Start receiving Data over DMA
      DMA_Cmd(RxChannel, ENABLE);
      break;

    default:
      break;
  }

}

Autor: Hansi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niemand der helfen kann? Werde noch wahnsinnig weil das nicht 
funktioniert....

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht weil dein EMBOS hier nicht allzu verbreitet ist?

Von anderen RTOS Kernels kenne ich allerdings die Eigenheit, dass man in 
ISRs nicht alle APIs verwenden darf, oder nur speziell dafür 
vorgesehene.

Autor: Hansi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das könnte sein, aber das OS ist nicht entscheidend, klappt es bei 
jemandem mit anderem OS?

Das API sollte nicht das Problem sein, laut Manual ist es erlaubt diese 
Funktionen aus ISRs zu verwenden...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.