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


von HeikoP (Gast)


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
1
#include "stm32F10x.h"
2
#include "STM32vldiscovery.h"
3
4
#define I2C1_SLAVE_ADDRESS7     0xE0   // Sensor I2C Address
5
#define ClockSpeed              200000 // 200 KHz
6
#define BufferSize1             (countof(Tx1_Buffer)-1)
7
8
void send(u8 *daten,int maxl)
9
{
10
  int i;
11
  /* Send I2C1 START condition */
12
  I2C_GenerateSTART(I2C1, ENABLE);
13
14
  /* Test on I2C1 EV5 and clear it */
15
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
16
17
  /* Send slave Address for write */
18
  I2C_Send7bitAddress(I2C1, I2C1_SLAVE_ADDRESS7, I2C_Direction_Transmitter);
19
20
  /* Test on I2C1 EV6 and clear it */
21
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
22
23
  /* Send I2C1 slave internal address */
24
  for(i=0;i<maxl;i++)
25
  {
26
    I2C_SendData(I2C1, daten[i]);
27
  
28
    /* Test on I2C1 EV8 and clear it */
29
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
30
  }
31
  /* Send I2C1 STOP Condition */
32
  I2C_GenerateSTOP(I2C1, ENABLE);  
33
}
34
35
int main(void)
36
{
37
    char daten[5]={0x00,0xA0,0xAA,0xA5,0xE2};
38
   u8 Tx1_Buffer[] = "/* STM32F10x I2C Firmware ";
39
  u8 Tx2_Buffer[] = "Library Example */";
40
  u8 Rx1_Buffer[10];
41
  u8* pBuffer = Rx1_Buffer;
42
  u8 test = 0;
43
 
44
  GPIO_InitTypeDef GPIO_InitStructure;
45
  I2C_InitTypeDef  I2C_InitStructure;
46
47
  /* Enable I2C1 -------------------------------------------------------------*/
48
  I2C_Cmd(I2C1, ENABLE);
49
50
  /* I2C1 configuration ------------------------------------------------------*/
51
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
52
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
53
  I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7;
54
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
55
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
56
  I2C_InitStructure.I2C_ClockSpeed = ClockSpeed;
57
  I2C_Init(I2C1, &I2C_InitStructure);
58
59
  /* GPIOB Periph clock enable */
60
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
61
62
  /* I2C1 and I2C2 Periph clock enable */
63
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
64
65
  /* Configure I2C1 pins: SCL and SDA ----------------------------------------*/
66
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
67
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
68
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // Open Drain, I2C bus pulled high externally
69
  GPIO_Init(GPIOB, &GPIO_InitStructure);
70
     
71
  //Daten Senden*****************************************************
72
  
73
  send(daten,5);
74
}

von HeikoP (Gast)


Lesenswert?

Also Senden funktioniert (ersichtlich an der LED auf dem SRF02).

Das Problem ist aber weiterhin das Lesen.
1
// Daten lesen
2
void read()
3
{ 
4
  u8 ReceivedData;
5
  /*!< While the bus is busy */
6
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY))
7
  {
8
  }
9
 
10
  /*!< Send START condition */
11
  I2C_GenerateSTART(I2C1, ENABLE);
12
 
13
  /*!< Test on EV5 and clear it */
14
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
15
  {
16
  }
17
  
18
  /*!< Send EEPROM address for write */
19
  I2C_Send7bitAddress(I2C1, I2C1_SLAVE_ADDRESS7, I2C_Direction_Transmitter);
20
21
  /*!< Test on EV6 and clear it */
22
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
23
  {
24
  }
25
   
26
  //send the reg select COMMAND byte
27
  I2C_SendData(I2C1, 2);   
28
 
29
  /*!< Test on EV8 and clear it */
30
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
31
  {
32
  }
33
 
34
  //send START condition a second time
35
  I2C_GenerateSTART(I2C1, ENABLE);
36
 
37
  /*!< Test on EV5 and clear it */
38
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
39
  {
40
  }
41
 
42
  /*!< Send EEPROM address for read */
43
  I2C_Send7bitAddress(I2C1, I2C1_SLAVE_ADDRESS7, I2C_Direction_Receiver);
44
 
45
  /*!< Test on EV6 and clear it */
46
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
47
  {
48
  }
49
50
  //    /*!< Test on EV7 and clear it */
51
  if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) 
52
  { 
53
    /*!< Read a byte from the EEPROM */
54
    ReceivedData = I2C_ReceiveData(I2C1);
55
  }
56
57
  /*!< Disable Acknowledgement */
58
  I2C_AcknowledgeConfig(I2C1, DISABLE);
59
     
60
  /*!< Send STOP Condition */
61
  I2C_GenerateSTOP(I2C1, ENABLE);
62
63
  /*!< Enable Acknowledgement to be ready for another reception */
64
  I2C_AcknowledgeConfig(I2C1, ENABLE);
65
}

Hat jemand eine Ahnung, warum da nix ausgelesen wird?

von HeikoP (Gast)


Lesenswert?

Hab jetzt mal versucht die Slave-ID zu ändern, aber irgendwie klappt das 
nicht.
1
void send(void)
2
{
3
  //int i;
4
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
5
  // sende START
6
  I2C_GenerateSTART(I2C1, ENABLE);
7
  
8
  // Test ob I2C1 EV5 und clear
9
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
10
  
11
  // Sende Slaveadresse und Mode TRANSMIT
12
  I2C_Send7bitAddress(I2C1, I2C1_SLAVE_ADDRESS7, I2C_Direction_Transmitter);
13
  
14
  // Test ob I2C1 EV6 und clear
15
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
16
  
17
  // Send interne Slave-Adresse
18
  I2C_SendData(I2C1, 0x00);
19
  
20
  // Test ob I2C1 EV8 und clear
21
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
22
  
23
  // Send Befehl
24
  I2C_SendData(I2C1, 0xA0);
25
  
26
  // Test ob I2C1 EV8 und clear
27
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
28
29
  // Send Befehl
30
  I2C_SendData(I2C1, 0xAA);
31
  
32
  // Test ob I2C1 EV8 und clear
33
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
34
35
  // Send Befehl
36
  I2C_SendData(I2C1, 0xA5);
37
  
38
  // Test ob I2C1 EV8 und clear
39
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
40
41
  // Send Befehl
42
  I2C_SendData(I2C1, 0xE2);
43
  
44
  // Test ob I2C1 EV8 und clear
45
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
46
  
47
    // Send I2C1 STOP Condition 
48
    I2C_GenerateSTOP(I2C1, ENABLE);  
49
}

Hat jemand eine Idee, wo der Fehler liegt?

von Matze T. (gruetzwurschd)


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:
1
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:
1
I2C_Send7bitAddress(I2C1, I2C1_SLAVE_ADDRESS7, I2C_Direction_Transmitter);

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


grüße Tarkan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.