www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik EEPROM 24LC1025


Autor: Jörg Gerke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

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

Ralf

Autor: Jörg Gerke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Jörg Gerke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Jörg Gerke (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void I2C_EE_ByteWrite(.... u8 WriteAddr)

Was meinst Du was ein u8 ist?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>void I2C_EE_ByteWrite(.... u8 WriteAddr)
>Was meinst Du was ein u8 ist?

Upps, da kam ja noch was :(

Autor: Jörg Gerke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.