Forum: Mikrocontroller und Digitale Elektronik STM8S I2C empfängt nur einmal etwas. Bitte hilfe


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von C. H. (hedie)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Ich habe hier ein STM8S103F3P6 Controller-Board.
Dieses möchte ich als I2C Slave betreiben.
Master ist ein Arduino Board (also die Wire() Library)

Nun bin ich schon seit Stunden am Problem dran.
Das Board empfängt den ersten Datenblock von 10 Bytes korrekt.
Dannach nicht mehr. Es sind auch diverse Register Bits weiterhin gesetzt 
nach dem ersten Empfang.

Ich wäre sehr froh, wenn mir jemand helfen könnte.

Anbei die Screenshots.
Es sieht so aus, als würde der STM Controller die CLK Leitung 
blockieren.
Wenn ich den STM neustarte, gehts nämlich wieder einmal.

Ich schliesse aus, dass der Master ein problem hat.

STM8_1.png zeigt die erste Übertragung.
STM8_2.png zeigt die Register des STM8 nach der ersten Übertragung.
STM8_3.png zeigt den Empfangsbuffer. Dieser ist korrekt befüllt
STM8_4.png zeigt die Register nach der zweiten Übertragung
STM8_5.png zeigt die zweite Übertragung

I2C Masterclock ist ca. 93kHz.
STM8 Clock ist 16MHz


Danke schonmal

Initialisierung:
1
CLK_DeInit();
2
  CLK_HSICmd(ENABLE); //Activate 16MHz Clock
3
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
4
  CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
5
  
6
  //CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
7
  I2C_DeInit();
8
  I2C_Init(100000, 0x03, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16); 
9
  I2C_ITConfig((I2C_IT_TypeDef)(I2C_IT_ERR | I2C_IT_EVT | I2C_IT_BUF), ENABLE);
10
  
11
  enableInterrupts();



Interrupt:
1
INTERRUPT_HANDLER(I2C_IRQHandler, 19)
2
{
3
  
4
  if ((I2C->SR2) != 0)
5
  {
6
    /* Clears SR2 register */
7
    I2C->SR2 = 0;
8
9
  }
10
  Event = I2C_GetLastEvent();
11
  switch (Event)
12
  {
13
      /******* Slave receiver **********/
14
      /* check on EV1*/
15
    case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED:
16
        Rx_Idx = 0;
17
      break;
18
19
      /* Check on EV2*/
20
    case I2C_EVENT_SLAVE_BYTE_RECEIVED:
21
        Slave_Buffer_Rx[Rx_Idx++] = I2C_ReceiveData();
22
      break;
23
24
      /* Check on EV4 */
25
    case (I2C_EVENT_SLAVE_STOP_DETECTED):
26
            /* write to CR2 to clear STOPF flag */
27
            I2C->CR2 |= I2C_CR2_ACK;
28
            i2cFlag = 1;
29
      break;
30
31
    default:
32
      break;
33
  }
34
}

: Bearbeitet durch User
von C. H. (hedie)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Problem gelöst!!

Falls jemand ebenfalls das Problem hat/haben wird.
Im Anhang ist der entscheidende Code von ST.

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]
  • [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.