6969#endif
7070
7171static
72- int _read (const at24cxxx_t * dev , uint32_t pos , void * data , size_t len )
72+ int _read_page (const at24cxxx_t * dev , uint32_t pos , void * data , size_t len )
7373{
7474 int check ;
7575 uint8_t polls = DEV_MAX_POLLS ;
@@ -97,7 +97,31 @@ int _read(const at24cxxx_t *dev, uint32_t pos, void *data, size_t len)
9797 }
9898 xtimer_usleep (AT24CXXX_POLL_DELAY_US );
9999 }
100+
100101 DEBUG ("[at24cxxx] i2c_read_regs(): %d; polls: %d\n" , check , polls );
102+
103+ return check ;
104+ }
105+
106+ static
107+ int _read (const at24cxxx_t * dev , uint32_t pos , void * data , size_t len )
108+ {
109+ int check = 0 ;
110+
111+ while (len ) {
112+ size_t clen = MIN (len , DEV_PAGE_SIZE - MOD_POW2 (pos , DEV_PAGE_SIZE ));
113+
114+ check = _read_page (dev , pos , data , clen );
115+
116+ if (!check ) {
117+ len -= clen ;
118+ pos += clen ;
119+ data += clen ;
120+ }
121+ else {
122+ break ;
123+ }
124+ }
101125 return check ;
102126}
103127
@@ -107,25 +131,24 @@ int _write_page(const at24cxxx_t *dev, uint32_t pos, const void *data, size_t le
107131 int check ;
108132 uint8_t polls = DEV_MAX_POLLS ;
109133 uint8_t dev_addr ;
110- uint16_t _pos ;
111134 uint8_t flags = 0 ;
112135
113136 if (DEV_EEPROM_SIZE > 2048 ) {
114137 /* 2 bytes word address length if more than 11 bits are
115138 used for addressing */
116139 /* append page address bits to device address (if any) */
117140 dev_addr = (DEV_I2C_ADDR | ((pos & 0xFF0000 ) >> 16 ));
118- _pos = ( pos & 0xFFFF ) ;
141+ pos &= 0xFFFF ;
119142 flags = I2C_REG16 ;
120143 }
121144 else {
122145 /* append page address bits to device address (if any) */
123146 dev_addr = (DEV_I2C_ADDR | ((pos & 0xFF00 ) >> 8 ));
124- _pos = pos & 0xFF ;
147+ pos &= 0xFF ;
125148 }
126149
127150 while (- ENXIO == (check = i2c_write_regs (DEV_I2C_BUS , dev_addr ,
128- _pos , data , len , flags ))) {
151+ pos , data , len , flags ))) {
129152 if (-- polls == 0 ) {
130153 break ;
131154 }
@@ -225,6 +248,23 @@ int at24cxxx_read(const at24cxxx_t *dev, uint32_t pos, void *data,
225248 return check ;
226249}
227250
251+ int at24cxxx_read_page (const at24cxxx_t * dev , uint32_t page , uint32_t offset , void * data , size_t len )
252+ {
253+ int check ;
254+
255+ assert (offset < DEV_PAGE_SIZE );
256+
257+ /* read no more than to the end of the current page to prevent wrap-around */
258+ size_t remaining = DEV_PAGE_SIZE - offset ;
259+ len = MIN (len , remaining );
260+
261+ i2c_acquire (DEV_I2C_BUS );
262+ check = _read_page (dev , page * DEV_PAGE_SIZE + offset , data , len );
263+ i2c_release (DEV_I2C_BUS );
264+
265+ return check ? check : (int ) len ;
266+ }
267+
228268int at24cxxx_write_byte (const at24cxxx_t * dev , uint32_t pos , uint8_t data )
229269{
230270 if (pos >= DEV_EEPROM_SIZE ) {
0 commit comments