www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SRF02 per I2C an STM32 Discovery


Autor: HeikoP (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Ich versuche vom SRF02 (Ultraschallsensor) aus den Registern zu lesen 
oder drauf zu schreiben, aber irgendwie funktioniert das nicht. Leider 
findet man auch im Netz nicht sehr viel zu I2C und dem STM32 VL 
Discovery.
Vielleicht kann jemand nen Tip geben, wo der Fehler liegt.

Vielen Dank
#include "stm32F10x.h"
#include "STM32vldiscovery.h"

#define I2C1_SLAVE_ADDRESS7     0xE0   // Sensor I2C Address
#define ClockSpeed              200000 // 200 KHz
#define BufferSize1             (countof(Tx1_Buffer)-1)

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 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 slave 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);  
}

int main(void)
{
    char daten[5]={0x00,0xA0,0xAA,0xA5,0xE2};
   u8 Tx1_Buffer[] = "/* STM32F10x I2C Firmware ";
  u8 Tx2_Buffer[] = "Library Example */";
  u8 Rx1_Buffer[10];
  u8* pBuffer = Rx1_Buffer;
  u8 test = 0;
 
  GPIO_InitTypeDef GPIO_InitStructure;
  I2C_InitTypeDef  I2C_InitStructure;

  /* Enable I2C1 -------------------------------------------------------------*/
  I2C_Cmd(I2C1, ENABLE);

  /* I2C1 configuration ------------------------------------------------------*/
  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);

  /* GPIOB Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  /* I2C1 and I2C2 Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_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; // Open Drain, I2C bus pulled high externally
  GPIO_Init(GPIOB, &GPIO_InitStructure);
     
  //Daten Senden*****************************************************
  
  send(daten,5);
}

Autor: HeikoP (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also Senden funktioniert (ersichtlich an der LED auf dem SRF02).

Das Problem ist aber weiterhin das Lesen.
// Daten lesen
void read()
{ 
  u8 ReceivedData;
  /*!< 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, 2);   
 
  /*!< 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))
  {
  }

  //    /*!< Test on EV7 and clear it */
  if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) 
  { 
    /*!< Read a byte from the EEPROM */
    ReceivedData = I2C_ReceiveData(I2C1);
  }

  /*!< Disable Acknowledgement */
  I2C_AcknowledgeConfig(I2C1, DISABLE);
     
  /*!< Send STOP Condition */
  I2C_GenerateSTOP(I2C1, ENABLE);

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

Hat jemand eine Ahnung, warum da nix ausgelesen wird?

Autor: HeikoP (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab jetzt mal versucht die Slave-ID zu ändern, aber irgendwie klappt das 
nicht.
void send(void)
{
  //int i;
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
  // sende START
  I2C_GenerateSTART(I2C1, ENABLE);
  
  // Test ob I2C1 EV5 und clear
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
  
  // Sende Slaveadresse und Mode TRANSMIT
  I2C_Send7bitAddress(I2C1, I2C1_SLAVE_ADDRESS7, I2C_Direction_Transmitter);
  
  // Test ob I2C1 EV6 und clear
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
  
  // Send interne Slave-Adresse
  I2C_SendData(I2C1, 0x00);
  
  // Test ob I2C1 EV8 und clear
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  
  // Send Befehl
  I2C_SendData(I2C1, 0xA0);
  
  // Test ob I2C1 EV8 und clear
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  // Send Befehl
  I2C_SendData(I2C1, 0xAA);
  
  // Test ob I2C1 EV8 und clear
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  // Send Befehl
  I2C_SendData(I2C1, 0xA5);
  
  // Test ob I2C1 EV8 und clear
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  // Send Befehl
  I2C_SendData(I2C1, 0xE2);
  
  // Test ob I2C1 EV8 und clear
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  
    // Send I2C1 STOP Condition 
    I2C_GenerateSTOP(I2C1, ENABLE);  
}

Hat jemand eine Idee, wo der Fehler liegt?

Autor: Tarkan D. (gruetzwurschd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich sitz selber grad an dem Thema mit I2C. Deswegen bin ich nicht 
der Vollprofi. Aber warum initialisierst du das Modul mit folgendem 
Befehl:
I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7;

das heißt du gibt dem µC diese Adresse als eigene adresse,

und anschließend probierst du von dieser adresse zu schreiben/lesen:
I2C_Send7bitAddress(I2C1, I2C1_SLAVE_ADDRESS7, I2C_Direction_Transmitter);

für mich sieht das merkwürdig aus :)


grüße Tarkan

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.