STM32 und CMPS03

OP #1858536
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.
OP #1858601
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???

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren