I2C sendet keine Startbedingung STM32

OP (Firma: HTL Hollabrunn) #2858373
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.