Hallo,
ich habe zwei STM8S Discovery Boards (Modul A und Modul B) und möchte
beide mit I²C verbinden. Dabei soll das Modul A (Master) bei Modul B
(Slave) Daten anfordern. Jetzt hab ich für Modul A folgendes
geschrieben:
1 | /* I2C configuration
|
2 | ---------------------------------------------------------------------------*/
|
3 | I2C_DeInit();
|
4 | I2C_Cmd(ENABLE);
|
5 | I2C_Init(100000, 0x10, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16);
|
6 |
|
7 | while (1)
|
8 | {
|
9 | if(c>15000)
|
10 | {
|
11 | if(!I2C_GetFlagStatus(I2C_FLAG_BUSBUSY))
|
12 | {
|
13 | I2C_GenerateSTART(ENABLE); // I2C start
|
14 |
|
15 | while (!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT));
|
16 |
|
17 | I2C_Send7bitAddress(0x18, I2C_DIRECTION_RX); // adress 00011000 -> Modul_B
|
18 |
|
19 | while(!I2C_CheckEvent(I2C_EVENT_MASTER_ADDRESS_ACKED)); /* Wait RXNE=1 EV7 bit is setI2C_Buffer_RX is ready to read */
|
20 | I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);
|
21 |
|
22 | while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_RECEIVED));
|
23 | rec = I2C_ReceiveData();
|
24 |
|
25 | I2C_GenerateSTOP(ENABLE); // I2C stop
|
26 |
|
27 | int2str(data, rec);
|
28 | sendUART_String(data);
|
29 | }
|
30 | c=0;
|
31 | }
|
32 | else
|
33 | {
|
34 | c++;
|
35 | }
|
36 | }
|
und für das Modul B:
1 | /* I2C configuration
|
2 | ---------------------------------------------------------------------------*/
|
3 | I2C_DeInit();
|
4 |
|
5 | I2C_Cmd(ENABLE);
|
6 | I2C_Init(100000, 0x18, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16);
|
7 |
|
8 | while (1)
|
9 | {
|
10 |
|
11 | while(!I2C_CheckEvent(I2C_EVENT_SLAVE_ADDRESS_MATCHED));
|
12 |
|
13 | while(!I2C_CheckEvent(I2C_EVENT_SLAVE_BYTE_TRANSMITTED))
|
14 | I2C_SendData(0x11);
|
15 |
|
16 | while(!I2C_CheckEvent(I2C_EVENT_SLAVE_STOP_DETECTED));
|
17 | }
|
Doch leider klappt die Verbindung nicht. Ich bin mir auch nicht sicher,
ob ich alles richtig gemacht habe (bzw. richtige ACK, Adressen, ...).
Die Hardware ist einwandfrei (mit 4k7 Pullups).
Ich hoffe ihr könnt mir ein paar Tips geben.
Gruß
Peter