Forum: Mikrocontroller und Digitale Elektronik STM32 und CMPS03


von Stephan M. (stmiko)


Lesenswert?

Hallo,

ich versuche nun schon seit einer Weile das besagte Kompassmodul mittels
I2C auszulesen.
Das Schreiben der Adresse und des Registers für die entsprechende 
Auflösung funktionert soweit. Nun tritt beim Umschalten des STM32 in dem 
Empfängermodus das Problem auf, dass diese an der entsprechenden While - 
Schleife hängen bleibt.
Hat jemand von euch Erfahrung in dem Umgang mit I2C Kommunikation und 
dem STM32?

Mein Quelltext sieht folgendermaßen aus:
1
// I2C1 configuration-----------------------------------------------------
2
  
3
        I2C_DeInit(I2C1);
4
   I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
5
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
6
    I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7;
7
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
8
    I2C_InitStructure.I2C_AcknowledgedAddress =  I2C_AcknowledgedAddress_7bit;
9
    I2C_InitStructure.I2C_ClockSpeed = 100000; //ClockSpeed;
10
    I2C_Init(I2C1, &I2C_InitStructure);
11
  
12
  //Remap I2C1
13
//  GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE);
14
15
  // Configure I2C1 pins: SCL and SDA 
16
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
17
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
18
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
19
    GPIO_Init(GPIOB, &GPIO_InitStructure);
20
21
  I2C_Cmd(I2C1, ENABLE);
22
    
23
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
24
//  I2C_AcknowledgeConfig(I2C1, ENABLE);
25
26
// Kompassmodul auslesen
27
28
while(1)
29
{
30
I2C_GenerateSTART(I2C1, ENABLE);
31
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
32
33
    I2C_Send7bitAddress(I2C1, 0xC0, I2C_Direction_Transmitter);
34
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
35
    
36
    I2C_SendData(I2C1, 0x02); //Register 2 ; Auflösung 0-3599
37
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); 
38
39
    I2C_GenerateSTART(I2C1, ENABLE);
40
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
41
   
42
    I2C_Send7bitAddress(I2C1, 0xC1, I2C_Direction_Receiver);
43
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));    //keine Rückgabe von ADDR von Kompassmodul???
44
45
    posHB = I2C_ReceiveData(I2C1);  
46
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
47
48
    posLB = I2C_ReceiveData(I2C1);
49
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
50
    
51
    I2C_GenerateSTOP(I2C1, ENABLE);
52
53
    pos_ist = (((uint16)posHB) << 8 | posLB);
54
}

Wenn mir jemand einen Tipp geben könnte, wäre das super!
Ich habe im Grunde den Ablauf der I2C Kommunikation von einer "alten" 
AVR - Funktion übernommen, die auch die richtigen Werte geliefert hat.

von Lutz (Gast)


Lesenswert?

Stephan M. schrieb:
> an der entsprechenden While - Schleife

Und das ist welche?

von Stephan M. (stmiko)


Lesenswert?

Ich vermute, dass der uC eine Adressbestätigung von dem I2C Slave 
erwartet, dieser aber diese Adresse nicht liefert...
1
I2C_Send7bitAddress(I2C1, 0xC1, I2C_Direction_Receiver);
2
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));    //keine Rückgabe von ADDR von Kompassmodul???

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.