EEPROM 24LC1025

Gast #1328318
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
Gast
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);
}
Gast
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);
}
Gast
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.
Gast
>  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?
Gast
>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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.