EEPROM 24LC1025

Gast #1328318
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
Gast #1328328
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);
}
Gast #1328332
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);
}
Gast #1328377
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren