Forum: Mikrocontroller und Digitale Elektronik I2C sendet keine Startbedingung STM32


von Stefan V. (Firma: HTL Hollabrunn) (dualcorez80)


Lesenswert?

Hi Leute!
Ich bin als aktiver Schreiber neu in diesem Forum dabei ;) Ich habe auch 
schon die meisten Beiträge durchforstet, doch keiner konnte mir 
helfen...

Folgendes Problem:
Ich verwende den STM32F107VC um mit einem ADXL345 Beschleunigungssensor 
und einem ITG3200 Gyrosensor zu kommunizieren. Beide mit I2C 
Schnittstelle. Diese möchte ich mit der I2C1 Schnittstelle des Cortex 
auslesen. Doch genau da liegt das Problem.
Ich kann keine Startbedingung erzeugen.
1
int main( void )
2
{ 
3
 char zahl[3]; 
4
 GPIO_InitTypeDef GPIO_InitStructure;    
5
 I2C_InitTypeDef I2C_InitStructure;      
6
   
7
 u8 address=0xA6;
8
 int i=0;
9
  
10
 SystemInit();      // Taktet Cortex auf 72MHz 
11
   
12
 gdm_Init(DSP_VERTICAL);      // Initialisiert Touchscreen (DSP_VERTICAL -> richtige Drehung für Touchscreen
13
 sprintf(zahl, "%d", data1);
14
 gdmgraphics_print(zahl, 10, 10, BLACK, WHITE, FONT_7x11);
15
16
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);    //Takt für I2C1 Schnittstelle aktivieren
17
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); 
18
          
19
20
 GPIO_StructInit(&GPIO_InitStructure);                                                                                                                      
21
 GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6 | GPIO_Pin_7;    //Konfigurieren der Ausgabepins, haben aber anscheinend nix mit der I2C Schnittstelle zu tun, weil das ganz andere Pins sind
22
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //Taktgeschwindigkeit festliegen
23
 GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_OD;        //Output open Drain konfigurieren
24
          
25
 GPIO_Init(GPIOB, &GPIO_InitStructure);
26
  
27
28
 I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;            //Sendet nach erhalt eines Datenbytes oder der eigenen Adresse ein ACK
29
 I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;    //legt die Bitlänge der eigenen Adresse im Slave-Mode fest
30
 I2C_InitStructure.I2C_ClockSpeed = 100000;
31
 I2C_InitStructure.I2C_OwnAddress1 = 0x00;            //Festlegen der Taktgeschwindigkeit in Hz
32
 I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;        //legt das Verhältnis von low zu high ab 100kHz fest (=2/1)
33
 I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
34
 I2C_Init(I2C1, &I2C_InitStructure);
35
36
 I2C_Cmd(I2C1, ENABLE);
37
38
 gdmgraphics_print("Generate Start", 10, 40, BLACK, WHITE, FONT_7x11);
39
  
40
 I2C_GenerateSTART(I2C1, ENABLE);  //Startbedingung erzeugen bei senden
41
 while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
42
43
 gdmgraphics_print("After Start", 10, 50, BLACK, WHITE, FONT_7x11); //Diese Zeile wird noch ausgegeben
44
45
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));  //in dieser   Schleife bleibt das Programm haengen
46
  
47
 gdmgraphics_print("After Checkevent", 10, 60, BLACK, WHITE, FONT_7x11);
48
49
 I2C_Send7bitAddress(I2C1, 0xA6, I2C_Direction_Transmitter);
50
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
51
 gdmgraphics_print(zahl, 10, 70, BLACK, WHITE, FONT_7x11);
52
 I2C_SendData(I2C1,DATAX0);
53
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
54
 gdmgraphics_print(zahl, 10, 80, BLACK, WHITE, FONT_7x11);
55
 I2C_GenerateSTART(I2C1,ENABLE);
56
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
57
 I2C_Send7bitAddress(I2C1, ACC_R, I2C_Direction_Receiver);
58
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
59
 while(1);
60
}
Kann mir von euch bitte irgendjemand sagen ob in dem Code ein Fehler 
ist?

der Befehl gdmgraphics_print(...) gibt mir nur etwas auf meinem Display 
aus und auch wenn ich die weglasse funktioniert es nicht. Wenn ich 
allerdings das Timing selbst programmiere (mit Warteschleifen und ohne 
die I2C-Register) funktioniert alles tadellos

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.