Forum: Mikrocontroller und Digitale Elektronik STM32F103: I2C EEPROM schreiben


von Michl (Gast)


Lesenswert?

Hallo zusammen,

ich komme nicht weiter, und weiß nicht mehr wo ich ansetzen soll.

Stand: es existiert in voll funktionsfähiges STM32 Projekt (SW/HW).
Dieses Projekt wurde von Hardware seite minimal verändert: ein ext. 
Interrupt weniger, andere Bauform des EEPROMs, etwas andere ADC 
beschaltung.

Nunja, es funktioniert mittlerweile alles bis auf das Lesen und 
Schreiben des EEPROMs.

An der Configuration/Ini wurde im Vergleich zu dem alten Projekt nichts 
verändert, lediglich wie gesagt die Bauform (gleiche Pinbelegung) was ja 
völligst egal ist.
1
void I2c_Configuration(void)
2
{
3
  // Deinitialize I2C1 interface
4
  I2C_DeInit(I2C1);
5
6
  // I2C1 configuration
7
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
8
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
9
  I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS;
10
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
11
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
12
  I2C_InitStructure.I2C_ClockSpeed = I2C1_SPEED;
13
  I2C_Init(I2C1, &I2C_InitStructure);
14
15
   // I2C1 Peripheral Enable
16
  I2C_Cmd(I2C1, ENABLE);
17
}

Zum debuggen habe ich das mal in die main eingebaut
1
 uint8_t nBuffer[2];
2
    nBuffer[0]=6;
3
    nBuffer[1]=6;
4
5
    if(Epr_WriteBuffer(nBuffer, 100, 2) == ERROR)
6
       EH_SetErrorCode(ERR_EEPROM);

In der Epr_WriteBuffer Routine bleib ich beim debuggen in : 
Epr_WaitStandbyState(); hängen
1
ErrorStatus Epr_WriteBuffer(uint8_t* pBuffer, uint16_t WriteAddr, uint16_t NumByteToWrite)
2
{
3
  uint16_t nAddr, nPage, nCount, nNumOfBytes;
4
  ErrorStatus status = ERROR;
5
6
  nAddr = WriteAddr;
7
  nPage = 0;
8
  nCount = 0;
9
  nNumOfBytes = 0;
10
11
  while (NumByteToWrite > 0)
12
  {
13
    // get page where to write to
14
    nPage  = nAddr / I2C_PAGE_SIZE;
15
16
    // get number of bytes which can be written to this page
17
    nNumOfBytes = ((nPage + 1) * I2C_PAGE_SIZE) - nAddr;
18
19
    // if there are more bytes to write than remaining space in this page -> fill up this page completely
20
    if(NumByteToWrite > nNumOfBytes)
21
      nCount = nNumOfBytes;
22
    else
23
      nCount = NumByteToWrite;
24
25
    // write data to EEPROM
26
    status = Epr_WritePage(pBuffer, nAddr, nCount);
27
    Epr_WaitStandbyState();
28
29
    // update variables
30
    NumByteToWrite -= nCount;
31
    nAddr += nCount;
32
    pBuffer += nCount;
33
  }
34
35
  return status;
36
}

In dieser Routine bleib er in der Zeile: while(!(I2C_ReadRegister(I2C1, 
I2C_Register_SR1) & 0x0002) hängen
1
void Epr_WaitStandbyState(void)
2
{
3
  __IO uint16_t SR1_Tmp = 0;
4
5
  do
6
  {
7
    /* Send START condition */
8
    I2C_GenerateSTART(I2C1, ENABLE);
9
    /* Read I2C1 SR1 register */
10
    SR1_Tmp = I2C_ReadRegister(I2C1, I2C_Register_SR1);
11
    /* Send EEPROM address for write */
12
    I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);
13
  }while(!(I2C_ReadRegister(I2C1, I2C_Register_SR1) & 0x0002));
14
15
  /* Clear AF flag */
16
  I2C_ClearFlag(I2C1, I2C_FLAG_AF);
17
18
  /* STOP condition */
19
  I2C_GenerateSTOP(I2C1, ENABLE);
20
}

Aber warum er das tut kann ich nicht sagen.
Die Funtion I2C_ReadRegister läuft durch und folgende Werte von "tmp" 
werden nacheinander angenommen.
0
1073763328
1073763348

Ich verstehe nicht warum er in der oberen while!(...) Schleife hängen 
bleibt, bzw. grundsätzlich nicht warum es hier Probleme gibt mit dem 
EEPROM obwohl alles gleich bis auf die Bauform ist...

Wäre super wenn mir jemand einen GEdankenanstoß geben kann.

PS: Ich arbeite mit Eclipse und debugge über GDB-Server. Allerdings 
steigt mir bei diesem Projekt immer der GDB server aus wenn er einen 
breakpoint erreicht. So konnte ich mich an die Stelle wo er hängt vor 
tasten.

Gruß Michl

von Michl (Gast)


Lesenswert?

... es ist wie immer...

Ich bin eine Woche damit beschäftigt und schreib wenn ich wort wörtlich 
am Ende bin einen Post. 10min später habe ich das Problem.

Das Problem war ein mechanisches:
Das Pad von VCC am EEPROM war ausgerissen. Wenn ich mit der Messspitze 
drauf gegangen bin, habe ich den Kontakt hergestellt, und 3,3V gemessen. 
Im normalzustand war kein VCC am IC.

Sorry für unnötigen Thread...

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.