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 | }
|