Forum: Mikrocontroller und Digitale Elektronik STM32: Probleme mit I²C


von Philipp H. (tdk29)


Lesenswert?

Hallo Leute, ich bins wieder.

Hab diesmal ein Problem mit I²C. Ich versuche einen Bl-Ctrl 2.0 Regler 
anzusprechen, es funktioniert jedoch nicht. Die Konfiguration der I²C 
Schnittstelle sollte passen, der Programmcode ebenso. Pull - Ups sind 
auch vorhanden. Hier mal die Konfiguration der I²C Schnittstelle:
1
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
2
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
3
I2C_InitStructure.I2C_OwnAddress1 = 0x52;
4
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
5
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
6
I2C_InitStructure.I2C_ClockSpeed = 400000;
7
8
I2C_Init(I2C1, &I2C_InitStructure);
9
10
/* I2C1 SDA and SCL configuration */
11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
12
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
13
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
14
GPIO_Init(GPIOB, &GPIO_InitStructure);
15
I2C_Cmd(I2C1, ENABLE);

Und das ist der Programmcode (gleich mal sorry für die Länge, weis nicht 
was davon relevant ist):
1
Timeout = 0xFFFF;
2
3
        myprint2("\r\nEnter...");
4
        I2C_GenerateSTART(I2C1, ENABLE);
5
        myprint2("\r\nStart");
6
        while ((!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) && (!stop))
7
        {
8
          if(Timeout == 0)
9
          {
10
            lEvent = I2C_GetLastEvent(I2C1);
11
            myprint2("\r\n   Error Occured: Code %u", lEvent);
12
            if(IS_I2C_EVENT(lEvent)){
13
              myprint2("\r\n       Is I2C Event");
14
            }
15
16
            stop = 1;
17
          }
18
          Timeout--;
19
        }
20
        stop = 0;
21
        Timeout = 0xFFFF;
22
        myprint2("\r\nEvent 1");
23
        Delay_ms(20);
24
        I2C_Send7bitAddress(I2C1, 0x52, I2C_Direction_Transmitter);
25
26
        myprint2("\r\n7b Address");
27
        while ((!I2C_CheckEvent(I2C1,
28
            I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) && (!stop))
29
        {
30
          if(Timeout == 0)
31
          {
32
            lEvent = I2C_GetLastEvent(I2C1);
33
            myprint2("\r\n   Error Occured: Code %u", lEvent);
34
            if(IS_I2C_EVENT(lEvent)){
35
              myprint2("\r\n       Is I2C Event");
36
            }
37
38
            stop = 1;
39
          }
40
          Timeout--;
41
        }
42
        stop = 0;
43
        Timeout = 0xFFFF;
44
        myprint2("\r\nEvent 2");
45
        I2C_SendData(I2C1, 100);
46
        myprint2("\r\nSend Data");
47
        while ((!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) && (!stop))
48
        {
49
          if(Timeout == 0)
50
          {
51
            lEvent = I2C_GetLastEvent(I2C1);
52
            myprint2("\r\n   Error Occured: Code %u", lEvent);
53
            if(IS_I2C_EVENT(lEvent)){
54
              myprint2("\r\n       Is I2C Event");
55
            }
56
57
            stop = 1;
58
          }
59
          Timeout--;
60
        }
61
        stop = 0;
62
        Timeout = 0xFFFF;
63
        myprint2("\r\nEvent 3");
64
        I2C_GenerateSTOP(I2C1, ENABLE);
65
        myprint2("\r\nStop");

und die Ausgabe davon in Putty:
1
Enter...
2
Start
3
Event 1
4
7b Address
5
   Error Occured: Code 536870944
6
Event 2
7
Send Data
8
   Error Occured: Code 536870944
9
Event 3
10
Stop

Ich sitze jetzt hier schon ein paar Stunden und versuche Das Problem zu 
lösen. Ich hoffe ihr könnt mir helfen.

Danke schon im vorraus!

mfg,
TDK29

von Philipp H. (tdk29)


Lesenswert?

Oh, nebenbei bemerkt: ich verwende natürlich AF_OD nicht PP ;)

mfg,
TDK29

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.