mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I2C Kommunikation


Autor: HeikoP (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo. Ich brauche dringend Hilfe.

Ich habe das STM32VL Discovery, dort angeschlossen ist momentan ein LCD 
und ein Ultraschallsensor (SRF02).

LCD funktioniert alles.

Das Problem ist der SRF02, der über den I2C Bus angeschlossen ist.

Hier die Initialisierung
GPIO_InitTypeDef GPIO_InitStructure;

void I2C_InitConf(void)
{
  /* ************ Initialisierung/Konfiguration I2C ***************** */
  // I2C Konfiguration/Initialisierung
  I2C_InitTypeDef  I2C_InitStructure;
  
  // I2C clock enable
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
  // PORT B clock enable
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  
  /* Konfiguration 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; // Open Drain, I2C bus pulled high extern
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  /* Enable I2C1 -------------------------------------------------------------*/
  I2C_Cmd(I2C1, ENABLE);
  
  /* I2C1 Konfiguration ------------------------------------------------------*/
  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 = ClockSpeed;
  I2C_Init(I2C1, &I2C_InitStructure);
}

Hier die Funktion fürs Senden:
void send(u8 *daten,int maxl)
{
  int i;
  /* Send I2C1 START condition */
  I2C_GenerateSTART(I2C1, ENABLE);

  /* Test on I2C1 EV5 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

  /* Send EEPROM slave Address for write */
  I2C_Send7bitAddress(I2C1, I2C1_SLAVE_ADDRESS7, I2C_Direction_Transmitter);

  /* Test on I2C1 EV6 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

  /* Send I2C1 EEPROM internal address */
  for(i=0;i<maxl;i++)
  {
    I2C_SendData(I2C1, daten[i]);
  
    /* Test on I2C1 EV8 and clear it */
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  }
  /* Send I2C1 STOP Condition */
  I2C_GenerateSTOP(I2C1, ENABLE);  
}

Und hier der Aufruf aus der main.c
...
u8 daten[5] = { 0x00,0xA0,0xAA,0xA5,0xE2 };
I2C_InitConf();
send(daten,5);
...

Beim Debuggen habe ich auch gesehen, das die Werte ins DR geschrieben 
werden, aber irgendwie bekommt der Slave die nicht.

Die Befehle, die in daten drin stehen sind die Befehlsfolge zum Ändern 
der Slave-Id, doch wenn ich den SRF02 danach neustarte, hat er immer 
noch die alte ID 0xE0.

Ich hoffe, mir kann irgendjemand einen Tipp geben, wie ich den I2C-Bus 
zum Laufen bekomme.

Vielen Dank, MfG Heiko

Autor: HeikoP (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie muss ich die Registeradresse des SRF02 ansprechen, ebenfalls indem 
ich ein Datenwort mit der Registeradresse sende?

Leider ist in dem Datenblatt nichts dazu beschrieben oder gehen 
Schreibbefehle automatisch ans Register 0.

Wie teile ich dem SRF02 mit, aus welchem Register ich lesen möchte?
Vielen DAnk, MfG

Autor: HeikoP (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So auslesen der Register scheint zu funktionieren. Bei Abfrage des 
Registers 1 bringt er h5 als Wert, was auch nach Google-Recherche mit 
der Software Firmware Revision übereinstimmt. Bei Abfrage des Registers 
1 sollte laut Datenblatt h80 geliefert werden, jedoch bekomme ich h18.
u8 read(int reg)
{ 
  u8 pBuffer;
  /*!< While the bus is busy */
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
 
  /*!< Send START condition */
  I2C_GenerateSTART(I2C1, ENABLE);
 
  /*!< Test on EV5 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
  
  /*!< Send EEPROM address for write */
  I2C_Send7bitAddress(I2C1, I2C1_SLAVE_ADDRESS7, I2C_Direction_Transmitter);

  /*!< Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

  //send the reg select COMMAND byte
  I2C_SendData(I2C1, reg);   
 
  /*!< Test on EV8 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 
  //send START condition a second time
  I2C_GenerateSTART(I2C1, ENABLE);
 
  /*!< Test on EV5 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
 
  /*!< Send EEPROM address for read */
  I2C_Send7bitAddress(I2C1, I2C1_SLAVE_ADDRESS7, I2C_Direction_Receiver);
 
  /*!< Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
 
  /*!< Disable Acknowledgement */
  I2C_AcknowledgeConfig(I2C1, DISABLE);
     
  /*!< Send STOP Condition */
  I2C_GenerateSTOP(I2C1, ENABLE);

  /*!< While there is data to be read */
  while ((I2C_GetLastEvent(I2C1) & 0x0040) != 0x000040); 
  
  /*!< Read a byte from the EEPROM */
  pBuffer = I2C_ReceiveData(I2C1);

  /*!< Enable Acknowledgement to be ready for another reception */
  I2C_AcknowledgeConfig(I2C1, ENABLE);

  return pBuffer;
}

Vielleicht kann sich ja mal jemand das anschauen, ob das vom Code her 
passt. Vielen Dank

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.