aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/common/lib/hardware/i2c-eeprom-block.frt
blob: 22351fb1c002c1ae7bf74ef4d67db030ef765326 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
\
\ 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
;