@@ -22,17 +22,21 @@ using namespace mbed;
22
22
23
23
I2CEEBlockDevice::I2CEEBlockDevice (
24
24
PinName sda, PinName scl, uint8_t addr,
25
- bd_size_t size, bd_size_t block, int freq)
26
- : _i2c_addr(addr), _size(size), _block(block)
25
+ bd_size_t size, bd_size_t block, int freq,
26
+ bool address_is_eight_bit)
27
+ : _i2c_addr(addr), _size(size), _block(block),
28
+ _address_is_eight_bit(address_is_eight_bit)
27
29
{
28
30
_i2c = new (_i2c_buffer) I2C (sda, scl);
29
31
_i2c->frequency (freq);
30
32
}
31
33
32
34
I2CEEBlockDevice::I2CEEBlockDevice (
33
35
I2C *i2c_obj, uint8_t addr,
34
- bd_size_t size, bd_size_t block)
35
- : _i2c_addr(addr), _size(size), _block(block)
36
+ bd_size_t size, bd_size_t block,
37
+ bool address_is_eight_bit)
38
+ : _i2c_addr(addr), _size(size), _block(block),
39
+ _address_is_eight_bit(address_is_eight_bit)
36
40
{
37
41
_i2c = i2c_obj;
38
42
}
@@ -58,48 +62,61 @@ int I2CEEBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)
58
62
// Check the address and size fit onto the chip.
59
63
MBED_ASSERT (is_valid_read (addr, size));
60
64
65
+ auto *pBuffer = static_cast <char *>(buffer);
66
+
61
67
_i2c->start ();
62
68
63
- if (!_i2c->write (_i2c_addr | 0 ) ||
64
- !_i2c->write ((char )(addr >> 8 )) ||
65
- !_i2c->write ((char )(addr & 0xff ))) {
69
+ if (1 != _i2c->write (get_paged_device_address (addr))) {
66
70
return BD_ERROR_DEVICE_ERROR;
67
71
}
68
72
69
- _i2c->stop ();
73
+ if (!_address_is_eight_bit && 1 != _i2c->write ((char )(addr >> 8u ))) {
74
+ return BD_ERROR_DEVICE_ERROR;
75
+ }
70
76
71
- auto err = _sync ();
72
- if (err) {
73
- return err;
77
+ if (1 != _i2c->write ((char )(addr & 0xffu ))) {
78
+ return BD_ERROR_DEVICE_ERROR;
74
79
}
75
80
76
- if (0 != _i2c->read (_i2c_addr, static_cast <char *>(buffer), size)) {
81
+ _i2c->stop ();
82
+
83
+ if (0 != _i2c->read (_i2c_addr, pBuffer, size)) {
77
84
return BD_ERROR_DEVICE_ERROR;
78
85
}
79
86
80
- return 0 ;
87
+ return BD_ERROR_OK ;
81
88
}
82
89
83
90
int I2CEEBlockDevice::program (const void *buffer, bd_addr_t addr, bd_size_t size)
84
91
{
85
92
// Check the addr and size fit onto the chip.
86
93
MBED_ASSERT (is_valid_program (addr, size));
87
94
95
+ const auto *pBuffer = static_cast <const char *>(buffer);
96
+
88
97
// While we have some more data to write.
89
98
while (size > 0 ) {
90
99
uint32_t off = addr % _block;
91
100
uint32_t chunk = (off + size < _block) ? size : (_block - off);
92
101
93
102
_i2c->start ();
94
103
95
- if (!_i2c->write (_i2c_addr | 0 ) ||
96
- !_i2c->write ((char )(addr >> 8 )) ||
97
- !_i2c->write ((char )(addr & 0xff ))) {
104
+ if (1 != _i2c->write (get_paged_device_address (addr))) {
105
+ return BD_ERROR_DEVICE_ERROR;
106
+ }
107
+
108
+ if (!_address_is_eight_bit && 1 != _i2c->write ((char )(addr >> 8u ))) {
109
+ return BD_ERROR_DEVICE_ERROR;
110
+ }
111
+
112
+ if (1 != _i2c->write ((char )(addr & 0xffu ))) {
98
113
return BD_ERROR_DEVICE_ERROR;
99
114
}
100
115
101
116
for (unsigned i = 0 ; i < chunk; i++) {
102
- _i2c->write (static_cast <const char *>(buffer)[i]);
117
+ if (1 != _i2c->write (pBuffer[i])) {
118
+ return BD_ERROR_DEVICE_ERROR;
119
+ }
103
120
}
104
121
105
122
_i2c->stop ();
@@ -112,10 +129,10 @@ int I2CEEBlockDevice::program(const void *buffer, bd_addr_t addr, bd_size_t size
112
129
113
130
addr += chunk;
114
131
size -= chunk;
115
- buffer = static_cast < const char *>(buffer) + chunk;
132
+ pBuffer += chunk;
116
133
}
117
134
118
- return 0 ;
135
+ return BD_ERROR_OK ;
119
136
}
120
137
121
138
int I2CEEBlockDevice::erase (bd_addr_t addr, bd_size_t size)
@@ -164,3 +181,15 @@ const char *I2CEEBlockDevice::get_type() const
164
181
{
165
182
return " I2CEE" ;
166
183
}
184
+
185
+ uint8_t I2CEEBlockDevice::get_paged_device_address (bd_addr_t address)
186
+ {
187
+ if (!_address_is_eight_bit) {
188
+ return _i2c_addr;
189
+ } else {
190
+ // Use the three least significant bits of the 2nd byte as the page
191
+ // The page will be bits 2-4 of the user defined addresses.
192
+ return _i2c_addr | ((address & 0x0700u ) >> 7u );
193
+ }
194
+ }
195
+
0 commit comments