Arduino-TWI
Two-Wire Interface (TWI) library for Arduino
AT24CXX.h
Go to the documentation of this file.
1 
19 #ifndef AT24CXX_H
20 #define AT24CXX_H
21 
22 #include "TWI.h"
23 
24 #ifndef CHARBITS
25 #define CHARBITS 8
26 #endif
27 
48 class AT24CXX : protected TWI::Device {
49 public:
51  const uint16_t PAGE_MAX;
52 
54  const uint16_t PAGE_MASK;
55 
57  const size_t SIZE;
58 
68  uint8_t subaddr = 0,
69  const size_t size = 32,
70  const uint16_t page_max = 32) :
71  TWI::Device(twi, 0x50 | (subaddr & 0x07)),
72  PAGE_MAX(page_max),
73  PAGE_MASK(page_max - 1),
74  SIZE((size / CHARBITS) * 1024)
75  {}
76 
82  bool is_ready()
83  {
84  if (!acquire()) return (false);
85  int res = write(NULL);
86  if (!release()) return (false);
87  return (res == 0);
88  }
89 
98  int read(void* dest, uint16_t src, size_t count)
99  {
100  uint8_t retry = RETRY_MAX;
101  src = __builtin_bswap16(src);
102  do {
103  if (!acquire()) return (-1);
104  int res = write(&src, sizeof(src));
105  if (res == sizeof(src)) {
106  res = read(dest, count);
107  if (!release()) break;
108  if (res == (int) count) return (res);
109  }
110  if (!release()) return (-1);
111  delay(RETRY_DELAY_MS);
112  } while (--retry);
113  return (-1);
114  }
115 
124  int write(uint16_t dest, const void* src, size_t count)
125  {
126  uint8_t* p = (uint8_t*) src;
127  size_t s = count;
128  size_t n = PAGE_MAX - (dest & PAGE_MASK);
129  if (n > s) n = s;
130  while (1) {
131  uint8_t retry = RETRY_MAX;
132  uint16_t addr = __builtin_bswap16(dest);
133  iovec_t vec[3];
134  iovec_t* vp = vec;
135  int res = -1;
136  iovec_arg(vp, &addr, sizeof(addr));
137  iovec_arg(vp, p, n);
138  iovec_end(vp);
139  do {
140  if (!acquire()) continue;
141  res = write(vec);
142  if (!release()) continue;
143  if (res > 0) break;
144  delay(RETRY_DELAY_MS);
145  } while (--retry);
146  if (res < 0) return (-1);
147  s -= n;
148  if (s == 0) return (count);
149  dest += n;
150  p += n;
151  n = (s < PAGE_MAX ? s : PAGE_MAX);
152  }
153  }
154 
155  using TWI::Device::read;
156  using TWI::Device::write;
157 
158 private:
160  static const uint8_t RETRY_MAX = 20;
161 
163  static const uint8_t RETRY_DELAY_MS = 1;
164 };
165 
174 class AT24C32 : public AT24CXX {
175 public:
176  AT24C32(TWI& twi, uint8_t subaddr = 0) :
177  AT24CXX(twi, subaddr, 32, 32)
178  {}
179 };
180 
189 class AT24C64 : public AT24CXX {
190 public:
191  AT24C64(TWI& twi, uint8_t subaddr = 0) :
192  AT24CXX(twi, subaddr, 64, 32)
193  {}
194 };
195 
204 class AT24C128 : public AT24CXX {
205 public:
206  AT24C128(TWI& twi, uint8_t subaddr = 0) :
207  AT24CXX(twi, subaddr, 128, 64)
208  {}
209 };
210 
219 class AT24C256 : public AT24CXX {
220 public:
221  AT24C256(TWI& twi, uint8_t subaddr = 0) :
222  AT24CXX(twi, subaddr, 256, 64)
223  {}
224 };
225 
234 class AT24C512 : public AT24CXX {
235 public:
236  AT24C512(TWI& twi, uint8_t subaddr = 0) :
237  AT24CXX(twi, subaddr, 512, 128)
238  {}
239 };
240 #endif
Definition: TWI.h:27
AT24C32(TWI &twi, uint8_t subaddr=0)
Definition: AT24CXX.h:176
bool release()
Definition: TWI.h:61
const size_t SIZE
Definition: AT24CXX.h:57
const uint16_t PAGE_MAX
Definition: AT24CXX.h:51
void iovec_arg(iovec_t *&vp, const void *buf, size_t size)
Definition: iovec.h:59
AT24CXX(TWI &twi, uint8_t subaddr=0, const size_t size=32, const uint16_t page_max=32)
Definition: AT24CXX.h:67
Definition: iovec.h:25
AT24C128(TWI &twi, uint8_t subaddr=0)
Definition: AT24CXX.h:206
bool is_ready()
Definition: AT24CXX.h:82
AT24C512(TWI &twi, uint8_t subaddr=0)
Definition: AT24CXX.h:236
void iovec_end(iovec_t *&vp)
Definition: iovec.h:78
int read(void *dest, uint16_t src, size_t count)
Definition: AT24CXX.h:98
int write(uint16_t dest, const void *src, size_t count)
Definition: AT24CXX.h:124
AT24C256(TWI &twi, uint8_t subaddr=0)
Definition: AT24CXX.h:221
int write(const void *buf, size_t count)
Definition: TWI.h:83
Device(TWI &twi, uint8_t addr)
Definition: TWI.h:40
Software::TWI< BOARD::D6, BOARD::D7 > twi
Definition: AT24CXX.ino:15
bool acquire()
Definition: TWI.h:51
const uint16_t PAGE_MASK
Definition: AT24CXX.h:54
int read(void *buf, size_t count)
Definition: TWI.h:72
AT24C64(TWI &twi, uint8_t subaddr=0)
Definition: AT24CXX.h:191
#define CHARBITS
Definition: AT24CXX.h:25