Forum: Mikrocontroller und Digitale Elektronik I2C mit STM32 und ITG3200 Sensor will nicht loslegen


von Cell85 (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

ich hab einen STM32 F103ZE mit 16mhz quarz statt 8 - ist aber alles 
eigentlich soweit richtig beachtet und konfiguriert (siehe screenshot 
"clocks").

Ich versuche gerade via I2C einen ITG3200 auszulesen.

Leider hängt es beim debuggen bzw. ausführen immer bei
1
/* Test on EV5 and clear it */
2
  while(!I2C_CheckEvent(ITG_I2C, I2C_EVENT_MASTER_MODE_SELECT));

(siehe screenshot 1.jpg)

Ich weiß nicht woran das liegen mag. Ehrlich gesagt, ist es auch das 
erste mal das ich mit dem I2C an einem STM32 arbeite.

Hier mein Code für den I2C
1
/******************************************************************************/
2
/* IRG3200_1.C: GYRO                                     */
3
/*Info: Gyro1 und 2 an I2C-1 und I2C-2; Accel1 und 2 an SPI1 und SP2;       */
4
/*Gyro I2C Adresse: bin: 1101000  hex: 0x68                                   */
5
/******************************************************************************/
6
7
/* Includes */
8
#include "ITG3200_1.h"
9
#include "stm32f10x.h"
10
#include "misc.h"
11
12
13
float gyr_adj[3]={0};//ITG 0-bias
14
15
/**
16
* @defgroup ITG
17
* @{
18
*/
19
20
/** @defgroup ITG_I2C_Function
21
* @{
22
*/
23
24
/**
25
* @brief  Initializes the I2C peripheral used to drive the ITG
26
* @param  None
27
* @retval None
28
*/
29
void ITG_I2C_Init(void)
30
{
31
  I2C_InitTypeDef  I2C_InitStructure;
32
  GPIO_InitTypeDef GPIO_InitStructure;
33
34
  /* Enable I2C and GPIO clocks */
35
  RCC_APB1PeriphClockCmd(ITG_I2C_RCC_Periph, ENABLE);
36
  RCC_APB2PeriphClockCmd(ITG_I2C_RCC_Port, ENABLE);
37
38
  /* Configure I2C pins: SCL and SDA */
39
  GPIO_InitStructure.GPIO_Pin =  ITG_I2C_SCL_Pin | ITG_I2C_SDA_Pin;
40
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
41
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
42
  GPIO_Init(ITG_I2C_Port, &GPIO_InitStructure);
43
44
  /* I2C configuration */
45
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
46
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
47
  I2C_InitStructure.I2C_OwnAddress1 = 0x00;
48
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
49
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
50
  I2C_InitStructure.I2C_ClockSpeed = ITG_I2C_Speed;
51
52
  /* Apply I2C configuration after enabling it */
53
  I2C_Init(ITG_I2C, &I2C_InitStructure);
54
55
  /* I2C Peripheral Enable */
56
  I2C_Cmd(ITG_I2C, ENABLE);
57
}
58
59
/**
60
* @brief  Writes one byte to the  ITG.
61
* @param  slAddr : slave address ITG_A_I2C_ADDRESS or ITG_M_I2C_ADDRESS
62
* @param  pBuffer : pointer to the buffer  containing the data to be written to the ITG.
63
* @param  WriteAddr : address of the register in which the data will be written
64
* @retval None
65
*/
66
void ITG_I2C_ByteWrite(u8 slAddr, u8* pBuffer, u8 WriteAddr)
67
{
68
  /* Send START condition */
69
  I2C_GenerateSTART(ITG_I2C, ENABLE);
70
71
  /* Test on EV5 and clear it */
72
  while(!I2C_CheckEvent(ITG_I2C, I2C_EVENT_MASTER_MODE_SELECT));
73
74
  /* Send ITG address for write */
75
  I2C_Send7bitAddress(ITG_I2C, slAddr, I2C_Direction_Transmitter);
76
77
  /* Test on EV6 and clear it */
78
  while(!I2C_CheckEvent(ITG_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
79
80
  /* Send the ITG internal address to write to */
81
  I2C_SendData(ITG_I2C, WriteAddr);
82
83
  /* Test on EV8 and clear it */
84
  while(!I2C_CheckEvent(ITG_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
85
86
  /* Send the byte to be written */
87
  I2C_SendData(ITG_I2C, *pBuffer);
88
89
  /* Test on EV8 and clear it */
90
  while(!I2C_CheckEvent(ITG_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
91
92
  /* Send STOP condition */
93
  I2C_GenerateSTOP(ITG_I2C, ENABLE);
94
 
95
}
96
97
/**
98
* @brief  Reads a block of data from the ITG.
99
* @param  slAddr  : slave address ITG_A_I2C_ADDRESS or ITG_M_I2C_ADDRESS
100
* @param  pBuffer : pointer to the buffer that receives the data read from the ITG.
101
* @param  ReadAddr : ITG's internal address to read from.
102
* @param  NumByteToRead : number of bytes to read from the ITG ( NumByteToRead >1  only for the gyro readinf).
103
* @retval None
104
*/
105
106
void ITG_I2C_BufferRead(u8 slAddr, u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)
107
{
108
109
  /* While the bus is busy */
110
  while(I2C_GetFlagStatus(ITG_I2C, I2C_FLAG_BUSY));
111
112
  /* Send START condition */
113
  I2C_GenerateSTART(ITG_I2C, ENABLE);
114
115
  /* Test on EV5 and clear it */
116
  while(!I2C_CheckEvent(ITG_I2C, I2C_EVENT_MASTER_MODE_SELECT));
117
118
  /* Send ITG_Magn address for write */
119
  I2C_Send7bitAddress(ITG_I2C, slAddr, I2C_Direction_Transmitter);
120
121
  /* Test on EV6 and clear it */
122
  while(!I2C_CheckEvent(ITG_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
123
124
  /* Clear EV6 by setting again the PE bit */
125
  I2C_Cmd(ITG_I2C, ENABLE);
126
127
  /* Send the ITG_Magn's internal address to write to */
128
  I2C_SendData(ITG_I2C, ReadAddr);
129
130
  /* Test on EV8 and clear it */
131
  while(!I2C_CheckEvent(ITG_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
132
133
  /* Send STRAT condition a second time */
134
  I2C_GenerateSTART(ITG_I2C, ENABLE);
135
136
  /* Test on EV5 and clear it */
137
  while(!I2C_CheckEvent(ITG_I2C, I2C_EVENT_MASTER_MODE_SELECT));
138
139
  /* Send ITG address for read */
140
  I2C_Send7bitAddress(ITG_I2C, slAddr, I2C_Direction_Receiver);
141
142
  /* Test on EV6 and clear it */
143
  while(!I2C_CheckEvent(ITG_I2C, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
144
145
  /* While there is data to be read */
146
  while(NumByteToRead)
147
  {
148
    if(NumByteToRead == 1)
149
    {
150
      /* Disable Acknowledgement */
151
      I2C_AcknowledgeConfig(ITG_I2C, DISABLE);
152
153
      /* Send STOP Condition */
154
      I2C_GenerateSTOP(ITG_I2C, ENABLE);
155
    }
156
157
    /* Test on EV7 and clear it */
158
    if(I2C_CheckEvent(ITG_I2C, I2C_EVENT_MASTER_BYTE_RECEIVED))
159
    {
160
      /* Read a byte from the ITG */
161
      *pBuffer = I2C_ReceiveData(ITG_I2C);
162
163
      /* Point to the next location where the byte read will be saved */
164
      pBuffer++;
165
166
      /* Decrement the read bytes counter */
167
      NumByteToRead--;
168
    }
169
  }
170
171
  /* Enable Acknowledgement to be ready for another reception */
172
  I2C_AcknowledgeConfig(ITG_I2C, ENABLE);
173
174
}
175
176
void ITG_Init(ITG_ConfigTypeDef *ITG_Config_Struct)
177
{
178
  u32 i=100000;
179
  GPIO_InitTypeDef GPIO_InitStructure;
180
181
  u8 FS_LPF=ITG_Config_Struct->FS | ITG_Config_Struct->LPFBandwidth;
182
    ITG_I2C_ByteWrite(ITG_I2C_ADDRESS,&(ITG_Config_Struct->ClkSel),ITG_POWERMANAGE_REG_ADDR);
183
  ITG_I2C_ByteWrite(ITG_I2C_ADDRESS,&(ITG_Config_Struct->SamRate),ITG_SR_DIVIDER_REG_ADDR);
184
  ITG_I2C_ByteWrite(ITG_I2C_ADDRESS,&FS_LPF,ITG_FULL_SCALE_REG_ADDR);
185
  ITG_I2C_ByteWrite(ITG_I2C_ADDRESS,&(ITG_Config_Struct->IntMode),ITG_INT_CONFIG_ADDR);
186
  while(i--);
187
//  RCC_APB2PeriphClockCmd(ITG_DRDY_RCC_Port, ENABLE);    //GPIOE
188
  GPIO_InitStructure.GPIO_Pin = ITG_DRDY_Pin ;     
189
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
190
  GPIO_Init(ITG_DRDY_Port, &GPIO_InitStructure);
191
192
}
193
194
void ITG_Read_RawData(s16* out)
195
{
196
  u8 buffer[6];
197
  u8 testReady;
198
  u8 intStatus;
199
  u8 i;
200
  
201
  testReady = GPIO_ReadInputDataBit(ITG_DRDY_Port , ITG_DRDY_Pin);
202
  if(testReady == 0)
203
  {
204
    ITG_I2C_BufferRead(ITG_I2C_ADDRESS, &intStatus, ITG_INT_STATUS_REG_ADDR, 1);
205
    if(intStatus==0x01)
206
    {    
207
      ITG_I2C_BufferRead(ITG_I2C_ADDRESS, buffer, ITG_XOUT_H_ADDR, 6);
208
      for(i=0;i<3;i++)
209
      {
210
        out[i] = buffer[2*i] & 0x00ff;
211
        out[i] <<= 8;
212
        out[i] |= buffer[2*i+1];
213
      }
214
    }
215
  }
216
}
217
218
void ITG_Cali(void)
219
{
220
  s16 rawData[3];
221
  u16 i;
222
  u32 delay;
223
  for(i=0;i<500;i++)
224
  {
225
    ITG_Read_RawData(rawData);
226
    gyr_adj[0] += rawData[0];
227
    gyr_adj[1] += rawData[1];
228
    gyr_adj[2] += rawData[2];
229
    delay=1000;
230
    while(delay--);
231
  }
232
  for(i=0;i<3;i++)
233
  {
234
     gyr_adj[i] /= 500.0;
235
  }
236
}
237
/**
238
* @brief   Read ITG output register
239
* @param  out : buffer to store data
240
* @retval None
241
*/
242
243
void ITG_Read_GyroRate(float* out)
244
{
245
  s16 rawData[3];
246
  u8 i;
247
  float temp;
248
  ITG_Read_RawData(rawData);
249
  for(i=0;i<3;i++)
250
  {
251
    out[i]=-(float)(rawData[i]-gyr_adj[i])/5868.0;
252
  } 
253
   temp=out[0];
254
   out[0]=out[1];
255
   out[1]=temp;   
256
}



Hier die Defines für das I2C
1
/* Define to prevent recursive inclusion*/
2
#ifndef __HAL_ITG3200_1_H_
3
#define __HAL_ITG3200_1_H_
4
5
#ifdef __cplusplus
6
 extern "C" {
7
#endif 
8
  
9
/* Includes */
10
#include "stm32f10x.h"
11
#include "misc.h"
12
13
/**
14
* @addtogroup ITG3200 
15
* @{
16
*/
17
18
/**
19
* @addtogroup  ITG3200_I2C_Define
20
* @{
21
*/
22
23
#define ITG_I2C                  I2C2
24
#define ITG_I2C_RCC_Periph       RCC_APB1Periph_I2C2
25
#define ITG_I2C_Port             GPIOB
26
#define ITG_I2C_SCL_Pin          GPIO_Pin_10
27
#define ITG_I2C_SDA_Pin          GPIO_Pin_11
28
#define ITG_I2C_RCC_Port         RCC_APB2Periph_GPIOB
29
#define ITG_I2C_Speed            200000
30
31
/**
32
*@}
33
*/ /* end of group ITG3200_I2C_Define */ 
34
35
/**
36
* @addtogroup Gyro_DRDY_Pin_Define
37
* @{
38
*/
39
40
//#ifdef  ITG_DRDY_ENABLE
41
#define ITG_DRDY_Pin                   GPIO_Pin_3
42
#define ITG_DRDY_Port                  GPIOE
43
#define ITG_DRDY_RCC_Port              RCC_APB2Periph_GPIOE
44
#define ITG_DRDY_Port_Source           GPIO_PortSourceGPIOE
45
#define ITG_DRDY_Pin_Source            GPIO_PinSource3
46
#define ITG_DRDY_EXTI_Line             EXTI_Line3
47
#define ITG_DRDY_Edge                  EXTI_Trigger_Falling
48
#define ITG_DRDY_EXTI_IRQCHANNEL       EXTI3_5_IRQChannel
49
#define ITG_DRDY_Preemption_Priority   3    
50
#define ITG_DRDY_Sub_Priority          3    
51
//#endif
52
53
/**
54
* @}
55
*/ /* end of group ITG_DRDY_Pin_Define */
56
57
/**
58
 * @}
59
 */ /* end of group ITG */
60
61
62
#endif /* __HAL_ITG3200_H */

und die main
1
/**
2
  * IMU200 Basic Firmware Rednd-Sensors Only
3
  * 
4
  */  
5
6
/* Includes ------------------------------------------------------------------*/
7
#include "stm32f10x.h"
8
#include <stdio.h>
9
#include "setup.h"
10
#include "ITG3200_1.h"
11
12
13
14
int main (void)
15
{
16
  s16 gyroRate[3];
17
  SetupClock();
18
  SetupLED  ();
19
  IMU_Led1_Off();
20
  IMU_Led2_Off();
21
  
22
  //Gyro1
23
  
24
  ITG_I2C_Init();
25
  ITG_Config();
26
  IMU_Led1_On();   //IMU_Led2_On();
27
     
28
       
29
    while(1)    
30
    {                        
31
             ITG_Read_RawData(gyroRate); //Read Gyro
32
    }
33
    
34
   
35
}
36
37
38
39
40
#ifdef  USE_FULL_ASSERT
41
42
void assert_failed(uint8_t* file, uint32_t line)
43
{ 
44
/
45
  while (1)
46
  {
47
  }
48
}
49
#endif

von Cell85 (Gast)


Lesenswert?

Vielleicht könnt ihr mir weiterhelfen.

Viele Grüße
Sven!

von holger (Gast)


Lesenswert?

Versuchs mal so:

  RCC_APB2PeriphClockCmd(ITG_I2C_RCC_Port | RCC_APB2Periph_AFIO, 
ENABLE);

Und schau mal nach ob dein I2C evtl. remapped ist.

von Cell85 (Gast)


Angehängte Dateien:

Lesenswert?

Hi, danke für die Antwort.

Leider hat das nichts gebracht. Ich hab mal die Registerübersicht vom 
I2C angehängt.

Wenn ich Schritt für Schritt Debugge hab ich oft einen Fehler 
Errorstatus Flag vom SR1 und SR2
gemeldet aus der STM32 Std. Periph. Library.

Hmm. Remapped habe ich eigentlich nichts, es ist alles auf Standardt.


Viele Grüße
Sven

von holger (Gast)


Lesenswert?

>Wenn ich Schritt für Schritt Debugge hab ich oft einen Fehler
>Errorstatus Flag vom SR1 und SR2
>gemeldet aus der STM32 Std. Periph. Library.

Das solltest du besser lassen mit dem debuggen. Schau mal ins
Errata Sheet von deinem STM32. Das I2C Modul
ist sowas von vergurkt;)

von Cell85 (Gast)


Lesenswert?

schlecht ... aber irgendwie muss ich das hinbekommen :((

von holger (Gast)


Lesenswert?

>schlecht ... aber irgendwie muss ich das hinbekommen :((

Mach Software I2C. Und das ist kein Witz.

von Cell85 (Gast)


Lesenswert?

ich hab auch gerade bei CHR etwas mit dem itg3200 gesehen, die machen 
das tatsächlich. Hast du vielleicht ein Beispiel oder ein Link parat?

ansonsten versuch ich mal das hier:

was hällst du davon ?

http://um6firmware.svn.sourceforge.net/viewvc/um6firmware/trunk/UM6%20Firmware/CHR_i2c.c?revision=28&view=markup

von Cell85 (Gast)


Lesenswert?

Ich hab auf meiner Platine keine Pullups für die I2C Leitung ist das 
sehr schlimm? Kann das Problem deswegen sein?

von Oliver J. (skriptkiddy)


Lesenswert?

Cell85 schrieb:
> Ich hab auf meiner Platine keine Pullups für die I2C Leitung ist das
> sehr schlimm? Kann das Problem deswegen sein?
Die Pullups gehören bei I2C immer hin.

So 4,7k...10k

Gruß Oliver

von Cell85 (Gast)


Lesenswert?

also die beim Application note von invensense haben 2,2k benutzt. um 
400khz zu schaffen, was jetzt nicht mein Ziel ist.
Jedenfalls kann ich mit bissl Geschick, den da dran löten :D

von Gerhard O. (gerhard_)


Lesenswert?

holger schrieb:
>>Wenn ich Schritt für Schritt Debugge hab ich oft einen Fehler
>>Errorstatus Flag vom SR1 und SR2
>>gemeldet aus der STM32 Std. Periph. Library.
>
> Das solltest du besser lassen mit dem debuggen. Schau mal ins
> Errata Sheet von deinem STM32. Das I2C Modul
> ist sowas von vergurkt;)

Bei mir funktionieren beide I2C Peripherien auf einem STM32F103RB und 
VE6 einwandfrei. Hatte aber Anfangs wie Cell85 tolle Probleme damit.

Das Geheimnis ist dass man sich gewissenhaft an die "CheckEvent" EVn 
Zugriffe in der richtigen Reihenfolge wie im Referenz Manual beschrieben 
hält. Wenn man sich nicht genau daran hält dann benimmt sich der STM32 
ganz gemein.;-)

Für Experimentierzwecke habe ich mir eine einfache I2C Ueber-Library 
aufgebaut die z. T. auf Grundfunktionen der ST-Peripheral Lib Library 
3.5.0 zugreift.

Es stehen nun einfache I2C Baustein Funktionen zur Verfügung mit der es 
sich genauso leicht wie beim AVR oder PIC arbeiten lässt. Hier ein paar 
Beispiele:

i2c_start(I2Cx)

return_status = i2c_write7bitAddress(I2Cx, address, I2C_DIR_TX)

// I2C_DIR_TX steuert das SLAVE Address READ/WRITE bit
return_status = i2c_write7bitAddress(I2Cx, address, I2C_DIR_RX)

i2c_write(I2Cx, data);

data = i2c_read(I2Cx, ACK)

data = i2c_read(I2Cx, NO_ACK)

i2c_stop(I2Cx)


Hier ein Beispiel zum Lesen eines TMP101 Temperatursensor:

/**
 * @brief  Reads current TMP101 temperature value
 * @param  pointer to I2C bus, TMP101 slave address
 * @retval signed 16-bit tmp101 result
 */
s16 read_TMP101(I2C_TypeDef* I2Cx, u8 address)
{

u8 msb_data, lsb_data;
u16 temp=0;
s16 result = -15984; // Error value for sensor communications problem 
(-62.4 DEG C)

i2c_start(I2Cx); // Set I2C Start condition
// Check for timeout to detect missing or malfunctioning sensor
if(!i2c_write7bitAddress(I2Cx, address, I2C_DIR_TX))
{
    i2c_write(I2Cx, 0x00);  // Configuration register = read temperature
    i2c_start(I2Cx);        // Start Read sequence
    i2c_write7bitAddress(I2Cx, address, I2C_DIR_RX);
    // Read MSB/LSB data from TMP101 and assemble output word
    result = (s16) i2c_read(I2Cx, ACK) << 8;
    result += (s16) i2c_read(I2Cx, ACK);
    i2c_stop(I2Cx);
}
else
{
   i2c_stop(I2Cx);
}
return(result);
}


Aufruf Beispiel:

#define TMP101_SLAVE_ADR 0x94

temperature = read_TMP101(I2C1, TMP101_SLAVE_ADR)

I2C1 oder I2C2 ist in der ST Library definiert

Bei EEPROMs steht mir auch noch eine spezielle "Acknowledgement Poll" 
Funktion zur Verfuegung die nach Setzen des STOP bits periodisch (1ms) 
die ACK Antwort vom EEPROM pollt um auf das Ende des Schreibvorgangs zu 
warten. Dabei muss man aufpassen weil sich sonst die Peripherie 
aufhängt.

Man könnte das auch mit einem Interrupt machen. Zum Experimentieren mit 
I2C Bausteinen reicht der Funktionsumfang.

(Die ST I2C EEPROM Beispiele funktionieren zumindest bei mir nicht)

Mit "I2Cx" wird mit I2C1 oder I2C2 der entsprechende I2C Bus 
spezifiziert welche in den ST Libs definiert sind.

Bis jetzt habe ich damit erfolgreich bei 400kHz auf beiden I2C Bussen 
mit den folgenden I2C Bausteinen gearbeitet:

24C08, 24C1024, TMP101, LM75, AD5245, AD5243


mfg,
Gerhrad

von Cell85 (Gast)


Lesenswert?

Das hört sich cool an!

Meinst du, du könntest mir deine "über-Lib" zur Verfügung stellen ? :-D

Ich werde jetzt erstmal versuchen Pullups dran zu löten, das wird eine 
Friemelarbeit  :((

Gruß
Sven

von Gerhard O. (gerhard_)


Angehängte Dateien:

Lesenswert?

Hallo Sven,

im Anhang findest Du eine funktionierende I2C Test Version mit einem 
TMP101 als externen Baustein.

Beide I2C Peripheren sind aktiv und sofort verwendbar.

Wenn Du einen andere Tool Chain verwendest wirst Du gewisse Sachen 
selber anpassen müssen.

Hoffe es hilf Dir. Viel Erfolg mit Deinem Projekt.!

mfg,
Gerhard


Cell85 schrieb:
> Das hört sich cool an!
>
> Meinst du, du könntest mir deine "über-Lib" zur Verfügung stellen ? :-D
>
> Ich werde jetzt erstmal versuchen Pullups dran zu löten, das wird eine
> Friemelarbeit  :((
>
> Gruß
> Sven

von Cell85 (Gast)


Lesenswert?

Vielen Dank Gerhard!

Ich habe jetzt auch mall den Pull up von einem Sensor angelötet und er 
scheint zu funktionieren.

Das was sich da aber ST mit dem I2C geleistet hat ist echt eine heftige 
Wurst!

von Gerhard O. (gerhard_)


Lesenswert?

Cell85 schrieb:
> Vielen Dank Gerhard!
>
> Ich habe jetzt auch mal den Pull up von einem Sensor angelötet und er
> scheint zu funktionieren.
>
Bei mir habe ich 2K dran weil 5 verschiedene I2C Bausteine am Bus 
haengen. Mit 3.9K dauert die Vorderflanke deutlich länger. Bei 400kHz 
habe ich allerdings noch keine Probleme gehabt.

> Das was sich da aber ST mit dem I2C geleistet hat ist echt eine heftige
> Wurst!

Ja, da gebe ich Dir recht. Die Errata sind tatsächlich 
"katastrophfuerchterbar";-) Bin nur froh dass die I2C Schnittstelle 
trotzdem brauchbar ist.

Gruß,
Gerhard

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.