/* Is there something wrong with my code I am writing to chip 5 staring at address 60005 to 60008 to update a 32 bit number on a 24LC512, sometimes it works and sometimes it does not do i need longer delays between writes , i am not sure*/
Device = 18F4685
Clock = 25
Config
CP0 = ON,
CP1 = ON,
CP2 = ON,
CP3 = ON,
WDT = OFF
Include "utils.bas"
Include "I2C.bas"
Include "EEPROM.bas"
dim x as longword
dim y as longword
dim button as portb.0
Sub EEPROM_Write(Data As Byte, Memory_Address As Word)
I2C.Start // Write data to
I2C.WriteByte(EEPROM_Control) // the external EEPROM
I2C.WriteByte(Memory_Address.Byte1) //
I2C.WriteByte(Memory_Address.Byte0) //
I2C.WriteByte(Data) //
I2C.Stop //
DelayMS(30) // Small delay
End Sub // between writes
//------------------------------------------------------------------------------------
Function EEPROM_Read(Memory_Address As Word) As Byte
I2C.Start // Read data from
I2C.WriteByte(EEPROM_Control) // the external EEPROM
I2C.WriteByte(Memory_Address.Byte1) //
I2C.WriteByte(Memory_Address.Byte0) //
I2C.Restart //
I2C.WriteByte(EEPROM_Control + 1) //
Result = I2C.ReadByte(I2C_NOT_ACKNOWLEDGE) // Store the functions
I2C.Stop
DelayMS(2) // result
End Function
sub update_y()
I2C.Initialize()
I2C.Initialize(I2C_100_KHZ, I2C_SLEW_OFF)
EEPROM_Address = %101
EEPROM_Family = %1010
EEPROM_Control = (EEPROM_Family << 4) Or (EEPROM_Address << 1)
DelayMS(200)
x.byte0 = EEPROM_Read(60005)
x.byte1 = EEPROM_Read(60006)
x.byte2 = EEPROM_Read(60007)
x.byte3 = EEPROM_Read(60008)
y = x + 10
EEPROM_Write(y.byte0,60005)
EEPROM_Write(y.byte1,60006)
EEPROM_Write(y.byte2,60007)
EEPROM_Write(y.byte3,60008)
end sub
main:
if button = 0 then
update_y()
endif
goto main
Write to an external EE chip with Higher addresses and 32bit
Moderators: David Barker, Jerry Messina
-
- Registered User
- Posts: 9
- Joined: Tue Jul 03, 2007 8:55 pm
- Location: SOUTHAFRICA
-
- Swordfish Developer
- Posts: 1470
- Joined: Fri Jan 30, 2009 6:27 pm
- Location: US
Re: Write to an external EE chip with Higher addresses and 3
You shouldn't need longer delays than what you have there, that's for sure.
As a matter of fact, the byte/page write time for the LC512 is 5ms max, so you should be able to change the 'DelayMS(30)' call in EEPROM_Write to 'DelayMS(5)'.
EEPROM_Read shouldn't need anything but possibly the smallest of delays, say 'DelayUS(5)' just to make sure you meet the 4.7us Bus Free time.
Is the WP pin connected to GND? Bypass caps on VDD & GND? Pullups on SCL & SDA?
As a matter of fact, the byte/page write time for the LC512 is 5ms max, so you should be able to change the 'DelayMS(30)' call in EEPROM_Write to 'DelayMS(5)'.
EEPROM_Read shouldn't need anything but possibly the smallest of delays, say 'DelayUS(5)' just to make sure you meet the 4.7us Bus Free time.
Is the WP pin connected to GND? Bypass caps on VDD & GND? Pullups on SCL & SDA?
-
- Registered User
- Posts: 9
- Joined: Tue Jul 03, 2007 8:55 pm
- Location: SOUTHAFRICA
Re: Write to an external EE chip with Higher addresses and 3
wp is floating, this would make sence
CHRISO