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


von C. H. (hedie)


Angehängte Dateien:

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:

Lesenswert?

Problem gelöst!!

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.