I2CRTOS Driver by Helmut Schmücker. Removed included mbed-rtos library to prevent multiple definition. Make sure to include mbed-rtos library in your program!

Fork of I2cRtosDriver by Helmut Schmücker

Committer:
pHysiX
Date:
Sat May 17 11:56:46 2014 +0000
Revision:
16:2c6432b37cce
Parent:
13:530968937ccb
Modified to make 400kHz default

Who changed what in which revision?

UserRevisionLine numberNew contents of line
humlet 3:967dde37e712 1 #ifndef I2CSLAVERTOS_H
humlet 3:967dde37e712 2 #define I2CSLAVERTOS_H
humlet 3:967dde37e712 3
humlet 3:967dde37e712 4 #include "I2CDriver.h"
humlet 3:967dde37e712 5
humlet 3:967dde37e712 6 namespace mbed
humlet 3:967dde37e712 7 {
humlet 3:967dde37e712 8
humlet 5:8a418c89e515 9 /// I2C slave interface to the RTOS-I2CDriver.
humlet 3:967dde37e712 10 /// The interface is compatible to the original mbed I2C class.
humlet 3:967dde37e712 11 class I2CSlaveRtos
humlet 3:967dde37e712 12 {
humlet 3:967dde37e712 13 I2CDriver m_drv;
humlet 3:967dde37e712 14
humlet 3:967dde37e712 15 public:
humlet 5:8a418c89e515 16 /// Status returned by the receiveSlave() function
humlet 3:967dde37e712 17 enum RxStatus {
humlet 3:967dde37e712 18 NoData = 0,
humlet 3:967dde37e712 19 ReadAddressed = 1,
humlet 3:967dde37e712 20 WriteGeneral = 2,
humlet 3:967dde37e712 21 WriteAddressed = 3
humlet 3:967dde37e712 22 };
humlet 3:967dde37e712 23
humlet 3:967dde37e712 24 /** Create an I2C Slave interface, connected to the specified pins.
humlet 3:967dde37e712 25 *
humlet 3:967dde37e712 26 * @param sda I2C data line pin
humlet 3:967dde37e712 27 * @param scl I2C clock line pin
humlet 5:8a418c89e515 28 *
humlet 5:8a418c89e515 29 * @note Has to be created in a thread context, i.e. within the main or some other function. A global delaration does not work
humlet 3:967dde37e712 30 */
humlet 3:967dde37e712 31 I2CSlaveRtos(PinName sda, PinName scl, int freq=100000, int address=42)
humlet 3:967dde37e712 32 :m_drv(sda,scl,100000,address) {}
humlet 3:967dde37e712 33
humlet 3:967dde37e712 34 /** Set the frequency of the I2C interface
humlet 3:967dde37e712 35 *
humlet 3:967dde37e712 36 * @param hz The bus frequency in hertz
humlet 3:967dde37e712 37 */
humlet 3:967dde37e712 38 void frequency(int hz) {
humlet 3:967dde37e712 39 m_drv.frequency(hz);
humlet 3:967dde37e712 40 }
humlet 3:967dde37e712 41
humlet 3:967dde37e712 42 /** Checks to see if this I2C Slave has been addressed.
humlet 3:967dde37e712 43 *
humlet 3:967dde37e712 44 * @returns
humlet 3:967dde37e712 45 * A status indicating if the device has been addressed, and how
humlet 3:967dde37e712 46 * - NoData - the slave has not been addressed
humlet 3:967dde37e712 47 * - ReadAddressed - the master has requested a read from this slave
humlet 3:967dde37e712 48 * - WriteAddressed - the master is writing to this slave
humlet 3:967dde37e712 49 * - WriteGeneral - the master is writing to all slave
humlet 3:967dde37e712 50 */
humlet 4:eafa7efcd771 51 int receive(uint32_t timeout_ms=osWaitForever) {
humlet 4:eafa7efcd771 52 return m_drv.receiveSlave(timeout_ms);
humlet 3:967dde37e712 53 }
humlet 3:967dde37e712 54
humlet 3:967dde37e712 55 /** Read from an I2C master.
humlet 3:967dde37e712 56 *
humlet 3:967dde37e712 57 * @param data pointer to the byte array to read data in to
humlet 3:967dde37e712 58 * @param length maximum number of bytes to read
humlet 3:967dde37e712 59 *
humlet 3:967dde37e712 60 * @returns
humlet 3:967dde37e712 61 * 0 on success,
humlet 3:967dde37e712 62 * non-0 otherwise
humlet 13:530968937ccb 63 * ... no! instead it returns number of bytes read minus one ... weird, guess its a bug in the official lib
humlet 3:967dde37e712 64 */
humlet 3:967dde37e712 65 int read(char *data, int length) {
humlet 3:967dde37e712 66 return m_drv.readSlave(data, length);
humlet 3:967dde37e712 67 }
humlet 3:967dde37e712 68
humlet 3:967dde37e712 69 /** Read a single byte from an I2C master.
humlet 3:967dde37e712 70 *
humlet 3:967dde37e712 71 * @returns
humlet 3:967dde37e712 72 * the byte read
humlet 3:967dde37e712 73 */
humlet 3:967dde37e712 74 int read(void) {
humlet 3:967dde37e712 75 return m_drv.readSlave();
humlet 3:967dde37e712 76 }
humlet 3:967dde37e712 77
humlet 3:967dde37e712 78 /** Write to an I2C master.
humlet 3:967dde37e712 79 *
humlet 3:967dde37e712 80 * @param data pointer to the byte array to be transmitted
humlet 3:967dde37e712 81 * @param length the number of bytes to transmite
humlet 3:967dde37e712 82 *
humlet 3:967dde37e712 83 * @returns
humlet 3:967dde37e712 84 * 0 on success,
humlet 3:967dde37e712 85 * non-0 otherwise
humlet 3:967dde37e712 86 */
humlet 3:967dde37e712 87 int write(const char *data, int length) {
humlet 3:967dde37e712 88 return m_drv.writeSlave(data, length);
humlet 3:967dde37e712 89 }
humlet 3:967dde37e712 90
humlet 3:967dde37e712 91 /** Write a single byte to an I2C master.
humlet 3:967dde37e712 92 *
humlet 3:967dde37e712 93 * @data the byte to write
humlet 3:967dde37e712 94 *
humlet 3:967dde37e712 95 * @returns
humlet 3:967dde37e712 96 * '1' if an ACK was received,
humlet 3:967dde37e712 97 * '0' otherwise
humlet 3:967dde37e712 98 */
humlet 3:967dde37e712 99 int write(int data) {
humlet 3:967dde37e712 100 return m_drv.writeSlave(data);
humlet 3:967dde37e712 101 }
humlet 3:967dde37e712 102
humlet 3:967dde37e712 103 /** Sets the I2C slave address.
humlet 3:967dde37e712 104 *
humlet 3:967dde37e712 105 * @param address The address to set for the slave (ignoring the least
humlet 3:967dde37e712 106 * signifcant bit). If set to 0, the slave will only respond to the
humlet 3:967dde37e712 107 * general call address.
humlet 3:967dde37e712 108 */
humlet 3:967dde37e712 109 void address(int address) {
humlet 3:967dde37e712 110 m_drv.addressSlave(address);
humlet 3:967dde37e712 111 }
humlet 3:967dde37e712 112
humlet 3:967dde37e712 113
humlet 3:967dde37e712 114 /** Reset the I2C slave back into the known ready receiving state.
humlet 3:967dde37e712 115 */
humlet 13:530968937ccb 116 void stop(void) {
humlet 3:967dde37e712 117 m_drv.stopSlave();
humlet 3:967dde37e712 118 }
humlet 13:530968937ccb 119
humlet 13:530968937ccb 120
humlet 13:530968937ccb 121 /// Wait until the interface becomes available.
humlet 13:530968937ccb 122 ///
humlet 13:530968937ccb 123 /// Useful if you want to run a sequence of command without interrution by another thread.
humlet 13:530968937ccb 124 /// There's no need to call this function for running single request, because all driver functions
humlet 13:530968937ccb 125 /// will lock the device for exclusive access automatically.
humlet 13:530968937ccb 126 void lock() {
humlet 13:530968937ccb 127 m_drv.lock();
humlet 13:530968937ccb 128 }
humlet 13:530968937ccb 129
humlet 13:530968937ccb 130 /// Unlock the interface that has previously been locked by the same thread.
humlet 13:530968937ccb 131 void unlock() {
humlet 13:530968937ccb 132 m_drv.unlock();
humlet 13:530968937ccb 133 }
humlet 13:530968937ccb 134
humlet 3:967dde37e712 135 };
humlet 3:967dde37e712 136 }
humlet 3:967dde37e712 137
humlet 3:967dde37e712 138 #endif