www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 und CMPS03


Autor: Stephan M. (stmiko)
Datum:

Bewertung
0 lesenswert
nicht 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:
// I2C1 configuration-----------------------------------------------------
  
        I2C_DeInit(I2C1);
   I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_AcknowledgedAddress =  I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed = 100000; //ClockSpeed;
    I2C_Init(I2C1, &I2C_InitStructure);
  
  //Remap I2C1
//  GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE);

  // Configure I2C1 pins: SCL and SDA 
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

  I2C_Cmd(I2C1, ENABLE);
    
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
//  I2C_AcknowledgeConfig(I2C1, ENABLE);

// Kompassmodul auslesen

while(1)
{
I2C_GenerateSTART(I2C1, ENABLE);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

    I2C_Send7bitAddress(I2C1, 0xC0, I2C_Direction_Transmitter);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    
    I2C_SendData(I2C1, 0x02); //Register 2 ; Auflösung 0-3599
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); 

    I2C_GenerateSTART(I2C1, ENABLE);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
   
    I2C_Send7bitAddress(I2C1, 0xC1, I2C_Direction_Receiver);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));    //keine Rückgabe von ADDR von Kompassmodul???

    posHB = I2C_ReceiveData(I2C1);  
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));

    posLB = I2C_ReceiveData(I2C1);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
    
    I2C_GenerateSTOP(I2C1, ENABLE);

    pos_ist = (((uint16)posHB) << 8 | posLB);
}

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.

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stephan M. schrieb:
> an der entsprechenden While - Schleife

Und das ist welche?

Autor: Stephan M. (stmiko)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermute, dass der uC eine Adressbestätigung von dem I2C Slave 
erwartet, dieser aber diese Adresse nicht liefert...

I2C_Send7bitAddress(I2C1, 0xC1, I2C_Direction_Receiver);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));    //keine Rückgabe von ADDR von Kompassmodul???


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.