\ \ I2C EEPROM driver for BLOCK wordset \ \ call i2c.ee.blockinit to activate the driver \ for the BLOCK words. #require blocks.frt #require bounds.frt #require i2c-eeprom.frt #require ms.frt \ select a eeprom module. \ the pages differ in size. \ do not overrun them #16 constant 24c08 #16 constant 24c16 #32 constant 24c32 #32 constant 24c64 #64 constant 24c128 #64 constant 24c256 #128 constant 24c512 #256 constant 24c1024 \ runtime configurable parameters, taken from or \ calculated in i2c.ee.blockinit. Never change them directly variable i2c.ee.hwid variable i2c.ee.pagesize variable i2c.ee.pages/block : i2c.ee.read-page ( addr len page hwid -- ) dup i2c.begin swap i2c.ee.pagesize @ * i2c.ee.send-addr i2c.restart \ repeated start i2c.rd i2c.tx 1- bounds over >r ?do i2c.rx i c! loop i2c.rxn r> c! \ last byte i2c.end ; : i2c.ee.load-buffer ( a-addr u -- ) \ BLOCK API 1- i2c.ee.pages/block @ * \ start address i2c.ee.pages/block @ bounds ?do dup i2c.ee.pagesize @ i i2c.ee.hwid @ i2c.ee.read-page i2c.ee.pagesize @ + loop drop ; : i2c.ee.write-page ( addr len page hwid -- ) i2c.begin i2c.ee.pagesize @ * i2c.ee.send-addr bounds ?do i c@ i2c.tx loop i2c.end 5 ms \ make sure the eeprom gets ready again ; : i2c.ee.save-buffer ( a-addr u -- ) \ BLOCK API 1- i2c.ee.pages/block @ * \ start address i2c.ee.pages/block @ bounds ?do dup i2c.ee.pagesize @ i i2c.ee.hwid @ i2c.ee.write-page i2c.ee.pagesize @ + loop drop ; \ adjust the page size and update the #pages per block buffer : i2c.ee.setpagesize ( 24cxx -- ) blocksize over / i2c.ee.pages/block ! i2c.ee.pagesize ! ; \ for turnkey \ does not initialize TWI/I2C interface! (i2c.init.default) : i2c.ee.blockinit ( pagesize hwid -- ) block:init ['] i2c.ee.load-buffer is load-buffer ['] i2c.ee.save-buffer is save-buffer i2c.ee.hwid ! i2c.ee.setpagesize ;