Forum: Mikrocontroller und Digitale Elektronik EEPROM 24LC1025


von Jörg Gerke (Gast)


Lesenswert?

Hallo,

ich habe ein Problem mit dem 24LC1025.
Obwohl ich eine Adressierung des High Bytes vornehme, reagiert das 
EEPROM, als würde ich dieses mi 0x00 ansteuern, so dass mir zur 
Speicherung nur 256 byte zur Verfügung stehen.

Hat jemand der mit dem 24LC1025 oder ähnlichen EEPROMs gearbeitet hat, 
da eine Lösung für mich?

Gruß Jörg

von Ralf (Gast)


Lesenswert?

Obwohl ich nicht weiss, wie dein Code aussieht, bin ich mir sicher, dass 
das helfen würde :)

Ralf

von Jörg Gerke (Gast)


Lesenswert?

Mit diesem Code funktionert wenigstens das Low-Byte:

/*********************************************************************** 
********
* Function Name  : I2C_EE_ByteWrite
* Description    : Writes one byte to the I2C EEPROM.
* Input          : - pBuffer : pointer to the buffer  containing the 
data to be
*                    written to the EEPROM.
*                  - WriteAddr : EEPROM's internal address to write to.
* Output         : None
* Return         : None
************************************************************************ 
*******/
void I2C_EE_ByteWrite(u8* pBuffer, u8 WriteAddr)
{

  /* Send STRAT condition */
  I2C_GenerateSTART(ENABLE);

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

  /* Send EEPROM address for write */
  I2C_Send7bitAddress(EEPROM_ADDRESS, I2C_MODE_TRANSMITTER);

  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECTED));

  /* Clear EV6 by setting again the PE bit */
  I2C_Cmd(ENABLE);

  //##################################### HIGHBYTE ADDR
  /* Send the EEPROM's internal address to write to */
  I2C_SendData(0x00);

  /* Test on EV8 and clear it */
  while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
   //##################################### HIGHBYTE ADDR

  //##################################### LOWBYTE ADDR
  /* Send the EEPROM's internal address to write to */
  I2C_SendData(WriteAddr);

  /* Test on EV8 and clear it */
  while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 //##################################### LOWBYTE ADDR

  /* Send the byte to be written */
  I2C_SendData(*pBuffer);

  /* Test on EV8 and clear it */
  while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  /* Send STOP condition */
  I2C_GenerateSTOP(ENABLE);
}

von Jörg Gerke (Gast)


Lesenswert?

Mit diesem Code funktioniert gar nichts mehr:

/*********************************************************************** 
********
* Function Name  : I2C_EE_ByteWrite
* Description    : Writes one byte to the I2C EEPROM.
* Input          : - pBuffer : pointer to the buffer  containing the 
data to be
*                    written to the EEPROM.
*                  - WriteAddr : EEPROM's internal address to write to.
* Output         : None
* Return         : None
************************************************************************ 
*******/
void I2C_EE_ByteWrite(u8* pBuffer, u32 WriteAddr)
{
  u8 WriteAddr_Hi;
  u8 WriteAddr_Lo;

  WriteAddr_Lo=WriteAddr%0x100;
  WriteAddr_Hi=(WriteAddr-WriteAddr_Lo)/0x100;

  /* Send STRAT condition */
  I2C_GenerateSTART(ENABLE);

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

  /* Send EEPROM address for write */
  I2C_Send7bitAddress(EEPROM_ADDRESS, I2C_MODE_TRANSMITTER);

  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECTED));

  /* Clear EV6 by setting again the PE bit */
  I2C_Cmd(ENABLE);

  //##################################### HIGHBYTE ADDR
  /* Send the EEPROM's internal address to write to */
  I2C_SendData(WriteAddr_Hi);    //vorher 0x00

  /* Test on EV8 and clear it */
  while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
   //##################################### HIGHBYTE ADDR

  //##################################### LOWBYTE ADDR
  /* Send the EEPROM's internal address to write to */
  I2C_SendData(WriteAddr_Lo);

  /* Test on EV8 and clear it */
  while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 //##################################### LOWBYTE ADDR

  /* Send the byte to be written */
  I2C_SendData(*pBuffer);

  /* Test on EV8 and clear it */
  while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  /* Send STOP condition */
  I2C_GenerateSTOP(ENABLE);
}

von Jörg Gerke (Gast)


Lesenswert?

Die Routinen habe ich von der Beispiel-Software von IAR embedded 
workbench.
Als Controller benutze ich den STR755.

von holger (Gast)


Lesenswert?

void I2C_EE_ByteWrite(.... u8 WriteAddr)

Was meinst Du was ein u8 ist?

von holger (Gast)


Lesenswert?

>void I2C_EE_ByteWrite(.... u8 WriteAddr)
>Was meinst Du was ein u8 ist?

Upps, da kam ja noch was :(

von Jörg Gerke (Gast)


Lesenswert?

Das ich mit dem oberen Code nicht auf das High Byte zu greifen kann, ist 
mir schon klar. Warum dies aber auch nicht beim unteren Code funzt, will 
mir nicht ganz einleuchten.

von holger (Gast)


Lesenswert?

>  WriteAddr_Lo=WriteAddr%0x100;
>  WriteAddr_Hi=(WriteAddr-WriteAddr_Lo)/0x100;

Das würde ich anders machen

  WriteAddr_Lo=(u8)WriteAddr;
  WriteAddr_Hi=(u8)((WriteAddr >> 8) & 0xFF);

Warum siehst du erst wenn du über 64kB gehst.

Unter 64kB müsste es aber eigentlich auch so funktionieren.
Hast du dir WriteAddr_Lo und WriteAddr_Hi schon mal
ausgeben lassen?

von holger (Gast)


Lesenswert?

>Warum siehst du erst wenn du über 64kB gehst.

So ein Quatsch, was rede ich denn da?
Allerdings kommst du gar nicht über 64kB wenn
du das Blockbit in der I2C Adresse nicht entsprechend mitsetzt.

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.