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

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.