Hi Vasile, Thanks for sharing. Jallib already has similar code. It refers to 24lc256 and does not mention the 24lc512 but I think it does support it.
Regards, Joep 2012/4/23 vasile surducan <[email protected]>: > > > On Mon, Apr 23, 2012 at 1:19 PM, Joep Suijs <[email protected]> wrote: >> >> Hi guys, >> >> I am working on a more advanced version of the 24lcxx libs. The name >> of the current basic version is eeprom_24lcxxx.jal (e.g. >> eeprom_24lc256.jal) >> >> The things that will be different in the new libraries: >> >> + page write is supported (up to 128 times faster, my estimate is >> sequential filling an 24lc512 takes 2.5 secs instead of 6 minutes) >> + advanced handling of required delay-after-write, so no (possible >> unnecessary) delay of 5 ms after each write >> + more devices supported (2, 4, 8, 32, 64 and 128kx8 are on my list; >> don't have all devices to test though). >> + success/error indication is propagated back to the user. >> - the library uses more resources (flash and ram) >> - only one device per application is supported (well... you could use >> more, but that is more complex) >> >> I have two questions: >> - Would such a library set be a valuable addition to jallib? > > > > I do not know. But if the following i2c software lib it somehow helps, I've > used it some years ago: > > -- I2C_512 , i2c software library for 24LC256/24LC512 memory > -- for jalV2 ver 2.4c may 2008 [email protected] > -- based on previous work of: Wouter van Ooijen, Javier Martinez, Ziya > Erdemir > > -- 24C512 device address is 0b_1010_0000 (write address) > -- the library is changing automatically the RD/WR bit so > -- read address will be 0b_1010_0001 > -- both i2c_clock and i2c_data needs pull up resitors according > -- to i2c device datasheet, higher frequency means lower resistor values > -- WP pin must be connected to GND if you want to program the memory > -- this library can work for you with some luck > -- having a good scope and understanding before how i2c works will be better > > -- This library is free software; you can redistribute it and/or > -- modify it under the terms of the GNU Library General Public > -- License as published by the Free Software Foundation; either > -- version 2 of the License, or (at your option) any later version. > > -- copyright (c) 1999-2008 > > > -- change the following pins for your own design > var volatile bit i2c_clock_in is pin_b4 > var volatile bit i2c_clock_out is pin_b4_direction > var volatile bit i2c_data_in is pin_b1 > var volatile bit i2c_data_out is pin_b1_direction > > > procedure _i2c_init is > i2c_clock_in = low > i2c_clock_out = output > i2c_data_in = low > i2c_data_out = output > end procedure > > procedure _i2c_wait is > _usec_delay ( 5 ) ; adjust for bus speed > end procedure > > -- output a start condition > procedure i2c_put_start is > _i2c_wait > i2c_data_out = high -- data high > _i2c_wait > i2c_clock_out = high -- clock high > _i2c_wait > i2c_data_out = low -- data low > _i2c_wait > i2c_clock_out = low -- clock low > _i2c_wait > end procedure > > -- output stop condition > procedure i2c_put_stop is > _i2c_wait > i2c_data_out = low -- data low > _i2c_wait > i2c_clock_out = low -- clock low > _i2c_wait > i2c_clock_out = high -- clock high > _i2c_wait > i2c_data_out = high -- data high > _i2c_wait > end procedure > > _i2c_init > i2c_put_stop > _i2c_wait > > -- output a single bit (for internal use only) > procedure _i2c_bit_out( bit in x ) is > _i2c_wait > i2c_data_out = x -- high data bit > _i2c_wait > i2c_clock_out = high -- clock high > _i2c_wait > while i2c_clock_in == low loop > end loop -- wait for slow slave > ; _i2c_wait > i2c_clock_out = low -- clock low > _i2c_wait > end procedure > > -- input a single bit (for internal use only) > procedure _i2c_bit_in( bit out x ) is > _i2c_wait > i2c_data_out = high -- data open > _i2c_wait > i2c_clock_out = high -- clock high > _i2c_wait > while i2c_clock_in == low loop > end loop -- wait for slow slave > ; _i2c_wait > x = i2c_data_in -- sample data > _i2c_wait > i2c_clock_out = low -- clock low > _i2c_wait > end procedure > > -- wait for an ack condition > -- Return LOW for ACK and HIGH for NACK. > function i2c_wait_ack return bit is > var bit acktemp > _i2c_wait > i2c_data_out = high -- data open > _i2c_wait > i2c_clock_out = high -- clock high > _i2c_wait > while i2c_clock_in == low loop > end loop -- wait for slow slave > -- a check for the slave's acknowledge > -- (data should be low) > -- could be added here > acktemp = i2c_data_in -- sample data > _i2c_wait > i2c_clock_out = low -- clock low > _i2c_wait > return acktemp > end function > > -- output an ack condition > procedure i2c_put_ack is > _i2c_bit_out( low ) > end procedure > > -- output a nack condition > procedure i2c_put_nack is > _i2c_bit_out( high ) > end procedure > > -- output one byte > procedure i2c_put_data( byte in x ) is > var bit b at x : 7 > for 8 loop > _i2c_bit_out( b ) > x = x << 1 > end loop > end procedure > > -- input one byte > procedure i2c_get_data( byte out x ) is > var bit b at x : 0 > for 8 loop > x = x << 1 > _i2c_bit_in( b ) > end loop > end procedure > > -- address I2c device > function i2c_put_write_address( byte in x ) return bit is > i2c_put_start > i2c_put_data ( x ) > return i2c_wait_ack > end function > > function i2c_put_read_address( byte in x ) return bit is > i2c_put_start > i2c_put_data ( x + 0b_0000_0001 ) > return i2c_wait_ack > end function > > -- two byte address version > procedure i2c_wr_512( byte in dev_adr, byte in adr_hi, byte in adr_lo, byte > in data ) is > while i2c_put_write_address( dev_adr ) loop ; only for debug purposes > i2c_put_stop > end loop > ; i2c_put_write_address( dev_adr ) > i2c_put_data( adr_hi ) > i2c_wait_ack > i2c_put_data( adr_lo ) > i2c_wait_ack > i2c_put_data( data ) > i2c_wait_ack > i2c_put_stop > end procedure > > -- two byte address version > procedure i2c_rd_512( byte in dev_adr, byte in adr_hi, byte in adr_lo , byte > out data) is > while i2c_put_write_address( dev_adr ) loop ; only for debug purposes > i2c_put_stop > end loop > ; i2c_put_write_address( dev_adr ) > i2c_put_data( adr_hi ) > i2c_put_ack > i2c_put_data( adr_lo ) > i2c_put_ack > i2c_put_read_address( dev_adr ) > i2c_get_data( data ) > i2c_put_nack > i2c_put_stop > end procedure > > -- one word address version > procedure i2c_wr_512w( byte in dev_adr, byte*2 in adr, byte in data ) is > var byte adr_lohi [2] at adr > while i2c_put_write_address( dev_adr ) loop ; only for debug purposes > i2c_put_stop > end loop > ; i2c_put_write_address( dev_adr ) > i2c_put_data( adr_lohi [1] ) ; hi byte > i2c_wait_ack > i2c_put_data( adr_lohi [0] ) ; lo byte > i2c_wait_ack > i2c_put_data( data ) > i2c_wait_ack > i2c_put_stop > end procedure > > -- one word address version > procedure i2c_rd_512w( byte in dev_adr, byte*2 in adr, byte out data) is > var byte adr_lohi [2] at adr > while i2c_put_write_address( dev_adr ) loop ; only for debug purposes > i2c_put_stop > end loop > ; i2c_put_write_address( dev_adr ) > i2c_put_data( adr_lohi [1] ) ; hi_byte > i2c_put_ack > i2c_put_data( adr_lohi [0] ) ; lo_byte > i2c_put_ack > i2c_put_read_address( dev_adr ) > i2c_get_data( data ) > i2c_put_nack > i2c_put_stop > end procedure > > > -- > You received this message because you are subscribed to the Google Groups > "jallib" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/jallib?hl=en. -- You received this message because you are subscribed to the Google Groups "jallib" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/jallib?hl=en.
