Extension of original I2CSlave library to support multiple slave addresses and interrupts.
I2CSlaveX.cpp
- Committer:
- jaerts
- Date:
- 2014-07-12
- Revision:
- 1:b7e586fffbf2
- Parent:
- 0:f94c714b3b4d
File content as of revision 1:b7e586fffbf2:
#include "I2CSlaveX.h" #if DEVICE_I2CSLAVE namespace mbed { I2CSlaveX* instance; I2CSlaveX::I2CSlaveX(PinName sda, PinName scl) : I2CSlave(sda, scl) { } // Add optional index argument for slaves that accept multiple addresses void I2CSlaveX::address(int address, int idx) { int addr = (address & 0xFF) | 1; i2c_slave_address(&_i2c, idx, addr, 0); } // Add optional argument that will be set with the received data value (usually slave address) int I2CSlaveX::receive(char *data) { if(data) { *data = _i2c.i2c->DAT; } return i2c_slave_receive(&_i2c); } // Return read length rather than match/no match int I2CSlaveX::read(char *data, int length) { return i2c_slave_read(&_i2c, data, length); } // Return write length rather than match/no match int I2CSlaveX::write(const char *data, int length) { return i2c_slave_write(&_i2c, data, length); } void I2CSlaveX::attach(void (*fptr)(void)) { if (fptr) { _receive.attach(fptr); enable_irq(); } else { disable_irq(); } } void I2CSlaveX::_irq_handler(uint32_t id, uint8_t addr, uint8_t state) { instance->_receive.call(); } void I2CSlaveX::enable_irq() { // Hacky way to call this instance instance = this; NVIC_SetVector(I2C_IRQn, (uint32_t)(&I2CSlaveX::_irq_handler)); NVIC_EnableIRQ(I2C_IRQn); } void I2CSlaveX::disable_irq() { NVIC_DisableIRQ(I2C_IRQn); } } #endif