Forum: Mikrocontroller und Digitale Elektronik STM32 und I2C Anfänger Probleme


von Stm32Noob77 (Gast)


Lesenswert?

Hallo Leute,

ich versuche gerade I2C auf dem STM32f4 zum laufen zu bringen. Dafür 
habe ich mir eine I2CLib für den Mircocontroller im netz gesucht.

Ich will I2C2 verwenden, und habe dafür GPIOB Pin10/11 für das SDA und 
SCL signal verwendet, zudem habe ich auch pullup widerstände an die pins 
angebracht.

Wenn ich nun die Pins als OUT konfiguriere kann ich diese auch messbar 
ein und ausschalten, d.h. die GPIO konfig müsste soweit ok sein.

Hier die Init funktion für I2C und GPIO:
1
void I2C_LowLevel_Init(void) 
2
{
3
  GPIO_InitTypeDef  GPIO_InitStructure;
4
  I2C_InitTypeDef   I2C_InitStructure;
5
  
6
  //Enable the i2c
7
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
8
  //Reset the Peripheral
9
  RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, ENABLE);
10
  RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE);
11
  
12
  //Enable the GPIOs for the SCL/SDA Pins
13
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
14
  
15
  //Configure and initialize the GPIOs
16
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;    //Pin 10 SCL, Pin 11 SDA
17
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
18
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; (I/O test ok with OUT)
19
20
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
21
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
22
  //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
23
24
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
25
  GPIO_Init(GPIOB, &GPIO_InitStructure);
26
 
27
  //Connect GPIO pins to peripheral
28
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_I2C2);
29
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_I2C2);
30
  
31
  //Configure and Initialize the I2C
32
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
33
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
34
  I2C_InitStructure.I2C_OwnAddress1 = 0x00; //We are the master. We don't need this
35
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
36
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
37
  I2C_InitStructure.I2C_ClockSpeed = 50000;  //400kHz (Fast Mode) (
38
  
39
  //Initialize the Peripheral
40
  I2C_Init(I2C2, &I2C_InitStructure);
41
  // I2C Peripheral Enable
42
  I2C_Cmd(I2C2, ENABLE);
43
  
44
  return; 
45
}

mit dieser funktion will ich die startcondition setzen und warte dass 
das Startbit gesetzt wird, aber es gibt ein timeout:
1
uint16_t I2C2_WrBufTest(void)
2
{
3
   uint32_t TimeOut = HSI_VALUE;
4
5
  //StartCondition generieren
6
   I2C2->CR1 |= I2C_CR1_START;
7
8
  // SR1: = U²C Status Register, SB= StartBit
9
  while(((I2C2->SR1) & 0x0001) != 0x0001) 
10
  {
11
    if (!(TimeOut--)) 
12
    {
13
      //panic(Flags, "I2C Error\n",2);
14
      return 1;
15
      }
16
  } 
17
  return 0;
18
}

Wo könnte das problem sein???? ich verwende ja die stmlib für I2c und 
GPIO config, sollte doch "problemlos" funltionieren:) ??

Grüße und danke

von guast (Gast)


Lesenswert?

RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C2, DISABLE);

Vielleicht liegt es daran?

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.