Hi Leute,
kämpfe seit paar Stunden mit meinem STM32. Und zwar wollte ich diesen
als I2C Slave laufen lassen. Grundsätzlich funktioniert die
Kommunikation. Ich kann mehrmals zu dem STM32 Daten senden, probiere ich
aber die Daten vom STM32 zu lesen, klappt es genau ein Mal. Danach hält
der STM32 wie es aussieht die SCL Leitung auf low. Habe nachgeforscht
und bin leider zu keinem schlüssigen Ergebnis gekommen, warum es so ist
und was man da machen kann. Vielleicht hatte jemand schon die gleichen
Probleme mit dem Chip.
hier ist meine ISR (mehr oder weniger wie aus den Beispielen):
1 | void I2C2_EV_IRQHandler(void)
|
2 | {
|
3 |
|
4 | char a;
|
5 | switch (I2C_GetLastEvent(I2C2))
|
6 | {
|
7 |
|
8 | // --> I2C Slave as receiver //////////////////////////////////////////
|
9 | case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED:
|
10 | Rx2_Idx = 0;
|
11 | break;
|
12 |
|
13 | case I2C_EVENT_SLAVE_BYTE_RECEIVED:
|
14 | if (Rx2_Idx < IC2_RX_BUFFERSIZE)
|
15 | {
|
16 | a = I2C_ReceiveData(I2C2);
|
17 | I2C2_Buffer_Rx[Rx2_Idx++] = a;
|
18 | }
|
19 | break;
|
20 | ///////////////////////////////////////////////////////////////////////
|
21 |
|
22 | // --> I2C Slave as sender ////////////////////////////////////////////
|
23 | case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED:
|
24 | I2C_SendData(I2C2, 0x5D);
|
25 | break;
|
26 |
|
27 | case I2C_EVENT_SLAVE_BYTE_TRANSMITTED:
|
28 | I2C_SendData(I2C2, 0x5D);
|
29 | break;
|
30 | ///////////////////////////////////////////////////////////////////////
|
31 |
|
32 |
|
33 | case I2C_EVENT_SLAVE_STOP_DETECTED:
|
34 | (void)(I2C_GetITStatus(I2C2, I2C_IT_STOPF));
|
35 | I2C_Cmd(I2C2, ENABLE);
|
36 | break;
|
37 |
|
38 | default:
|
39 | break;
|
40 | }
|
41 | }
|