Skip to content

Commit 3839563

Browse files
authored
Merge pull request #4 from pilotak/master
option to pass I2C object
2 parents 286a260 + b440d72 commit 3839563

File tree

2 files changed

+50
-17
lines changed

2 files changed

+50
-17
lines changed

I2CEEBlockDevice.cpp

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,24 @@
2121
I2CEEBlockDevice::I2CEEBlockDevice(
2222
PinName sda, PinName scl, uint8_t addr,
2323
bd_size_t size, bd_size_t block, int freq)
24-
: _i2c(sda, scl), _i2c_addr(addr), _size(size), _block(block)
24+
: _i2c_addr(addr), _size(size), _block(block)
2525
{
26-
_i2c.frequency(freq);
26+
_i2c = new (_i2c_buffer) I2C(sda, scl);
27+
_i2c->frequency(freq);
28+
}
29+
30+
I2CEEBlockDevice::I2CEEBlockDevice(
31+
I2C * i2c_obj, uint8_t addr,
32+
bd_size_t size, bd_size_t block)
33+
: _i2c_addr(addr), _size(size), _block(block)
34+
{
35+
_i2c = i2c_obj;
36+
}
37+
I2CEEBlockDevice::~I2CEEBlockDevice()
38+
{
39+
if (_i2c == (I2C*)_i2c_buffer) {
40+
_i2c->~I2C();
41+
}
2742
}
2843

2944
int I2CEEBlockDevice::init()
@@ -41,15 +56,15 @@ int I2CEEBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)
4156
// Check the address and size fit onto the chip.
4257
MBED_ASSERT(is_valid_read(addr, size));
4358

44-
_i2c.start();
45-
if (!_i2c.write(_i2c_addr | 0) ||
46-
!_i2c.write((char)(addr >> 8)) ||
47-
!_i2c.write((char)(addr & 0xff))) {
59+
_i2c->start();
60+
if (!_i2c->write(_i2c_addr | 0) ||
61+
!_i2c->write((char)(addr >> 8)) ||
62+
!_i2c->write((char)(addr & 0xff))) {
4863
return BD_ERROR_DEVICE_ERROR;
4964
}
50-
_i2c.stop();
65+
_i2c->stop();
5166

52-
if (_i2c.read(_i2c_addr, static_cast<char*>(buffer), size) < 0) {
67+
if (_i2c->read(_i2c_addr, static_cast<char*>(buffer), size) < 0) {
5368
return BD_ERROR_DEVICE_ERROR;
5469
}
5570

@@ -66,17 +81,17 @@ int I2CEEBlockDevice::program(const void *buffer, bd_addr_t addr, bd_size_t size
6681
uint32_t off = addr % _block;
6782
uint32_t chunk = (off + size < _block) ? size : (_block - off);
6883

69-
_i2c.start();
70-
if (!_i2c.write(_i2c_addr | 0) ||
71-
!_i2c.write((char)(addr >> 8)) ||
72-
!_i2c.write((char)(addr & 0xff))) {
84+
_i2c->start();
85+
if (!_i2c->write(_i2c_addr | 0) ||
86+
!_i2c->write((char)(addr >> 8)) ||
87+
!_i2c->write((char)(addr & 0xff))) {
7388
return BD_ERROR_DEVICE_ERROR;
7489
}
7590

7691
for (unsigned i = 0; i < chunk; i++) {
77-
_i2c.write(static_cast<const char*>(buffer)[i]);
92+
_i2c->write(static_cast<const char*>(buffer)[i]);
7893
}
79-
_i2c.stop();
94+
_i2c->stop();
8095

8196
int err = _sync();
8297
if (err) {
@@ -103,7 +118,7 @@ int I2CEEBlockDevice::_sync()
103118
// so loop trying to do a zero byte write until it is ACKed
104119
// by the chip.
105120
for (int i = 0; i < I2CEE_TIMEOUT; i++) {
106-
if (_i2c.write(_i2c_addr | 0, 0, 0) < 1) {
121+
if (_i2c->write(_i2c_addr | 0, 0, 0) < 1) {
107122
return 0;
108123
}
109124

I2CEEBlockDevice.h

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,24 @@ class I2CEEBlockDevice : public BlockDevice {
7070
I2CEEBlockDevice(
7171
PinName sda, PinName scl, uint8_t address,
7272
bd_size_t size, bd_size_t block=32,
73-
int bus_speed=400000);
73+
int bus_speed=400000);
74+
75+
/** Constructor to create an I2CEEBlockDevice on I2C pins
76+
*
77+
* @param i2c The I2C instance pointer
78+
* @param addr The 8bit I2C address of the chip, common range 0xa0 - 0xae.
79+
* @param size The size of the device in bytes
80+
* @param block The page size of the device in bytes, defaults to 32bytes
81+
* @param freq The frequency of the I2C bus, defaults to 400K.
82+
*/
83+
I2CEEBlockDevice(
84+
I2C * i2c_obj, uint8_t address,
85+
bd_size_t size, bd_size_t block=32);
86+
87+
/** Destructor of I2CEEBlockDevice
88+
*/
89+
90+
virtual ~I2CEEBlockDevice();
7491

7592
/** Initialize a block device
7693
*
@@ -141,7 +158,8 @@ class I2CEEBlockDevice : public BlockDevice {
141158
virtual bd_size_t size() const;
142159

143160
private:
144-
I2C _i2c;
161+
I2C * _i2c;
162+
uint32_t _i2c_buffer[sizeof(I2C) / sizeof(uint32_t)];
145163
uint8_t _i2c_addr;
146164
uint32_t _size;
147165
uint32_t _block;

0 commit comments

Comments
 (0)