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
Obwohl ich nicht weiss, wie dein Code aussieht, bin ich mir sicher, dass das helfen würde :) Ralf
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); }
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); }
Die Routinen habe ich von der Beispiel-Software von IAR embedded workbench. Als Controller benutze ich den STR755.
>void I2C_EE_ByteWrite(.... u8 WriteAddr) >Was meinst Du was ein u8 ist? Upps, da kam ja noch was :(
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.
> 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?
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.