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 I2CMASTERRTOS_H
humlet 3:967dde37e712 2 #define I2CMASTERRTOS_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 3:967dde37e712 9 /// I2C master interface to the RTOS-I2CDriver.
humlet 3:967dde37e712 10 /// The interface is compatible to the original mbed I2C class.
humlet 5:8a418c89e515 11 /// Provides an additonal "read from register"-function.
humlet 3:967dde37e712 12 class I2CMasterRtos
humlet 3:967dde37e712 13 {
humlet 3:967dde37e712 14 I2CDriver m_drv;
humlet 3:967dde37e712 15
humlet 3:967dde37e712 16 public:
humlet 3:967dde37e712 17 /** Create an I2C Master interface, connected to the specified pins
humlet 3:967dde37e712 18 *
humlet 3:967dde37e712 19 * @param sda I2C data line pin
humlet 3:967dde37e712 20 * @param scl I2C clock line pin
humlet 5:8a418c89e515 21 *
humlet 5:8a418c89e515 22 * @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 23 */
pHysiX 16:2c6432b37cce 24 I2CMasterRtos(PinName sda, PinName scl, int freq=400000):m_drv(sda,scl,freq) {}
humlet 3:967dde37e712 25
humlet 3:967dde37e712 26 /** Set the frequency of the I2C interface
humlet 3:967dde37e712 27 *
humlet 3:967dde37e712 28 * @param hz The bus frequency in hertz
humlet 3:967dde37e712 29 */
humlet 3:967dde37e712 30 void frequency(int hz) {
humlet 3:967dde37e712 31 m_drv.frequency(hz);
humlet 3:967dde37e712 32 }
humlet 3:967dde37e712 33
humlet 3:967dde37e712 34 /** Read from an I2C slave
humlet 3:967dde37e712 35 *
humlet 3:967dde37e712 36 * Performs a complete read transaction. The bottom bit of
humlet 3:967dde37e712 37 * the address is forced to 1 to indicate a read.
humlet 3:967dde37e712 38 *
humlet 3:967dde37e712 39 * @param address 8-bit I2C slave address [ addr | 1 ]
humlet 3:967dde37e712 40 * @param data Pointer to the byte-array to read data in to
humlet 3:967dde37e712 41 * @param length Number of bytes to read
humlet 3:967dde37e712 42 * @param repeated Repeated start, true - don't send stop at end
humlet 3:967dde37e712 43 *
humlet 3:967dde37e712 44 * @returns
humlet 3:967dde37e712 45 * 0 on success (ack),
humlet 3:967dde37e712 46 * non-0 on failure (nack)
humlet 3:967dde37e712 47 */
humlet 3:967dde37e712 48 int read(int address, char *data, int length, bool repeated = false) {
humlet 3:967dde37e712 49 return m_drv.readMaster( address, data, length, repeated);
humlet 3:967dde37e712 50 }
humlet 3:967dde37e712 51
humlet 3:967dde37e712 52 /** Read from a given I2C slave register
humlet 3:967dde37e712 53 *
humlet 3:967dde37e712 54 * Performs a complete write-register-read-data-transaction. The bottom bit of
humlet 3:967dde37e712 55 * the address is forced to 1 to indicate a read.
humlet 3:967dde37e712 56 *
humlet 3:967dde37e712 57 * @param address 8-bit I2C slave address [ addr | 1 ]
humlet 3:967dde37e712 58 * @param _register 8-bit regster address
humlet 3:967dde37e712 59 * @param data Pointer to the byte-array to read data in to
humlet 3:967dde37e712 60 * @param length Number of bytes to read
humlet 3:967dde37e712 61 * @param repeated Repeated start, true - don't send stop at end
humlet 3:967dde37e712 62 *
humlet 3:967dde37e712 63 * @returns
humlet 3:967dde37e712 64 * 0 on success (ack),
humlet 3:967dde37e712 65 * non-0 on failure (nack)
humlet 3:967dde37e712 66 */
humlet 7:04824382eafb 67 int read(int address, uint8_t _register, char* data, int length, bool repeated = false) {
humlet 3:967dde37e712 68 return m_drv.readMaster( address, _register, data, length, repeated);
humlet 3:967dde37e712 69 }
humlet 3:967dde37e712 70
humlet 3:967dde37e712 71 /** Read a single byte from the I2C bus
humlet 3:967dde37e712 72 *
humlet 3:967dde37e712 73 * @param ack indicates if the byte is to be acknowledged (1 = acknowledge)
humlet 3:967dde37e712 74 *
humlet 3:967dde37e712 75 * @returns
humlet 3:967dde37e712 76 * the byte read
humlet 3:967dde37e712 77 */
humlet 3:967dde37e712 78 int read(int ack) {
humlet 3:967dde37e712 79 return m_drv.readMaster(ack);
humlet 3:967dde37e712 80 }
humlet 3:967dde37e712 81
humlet 3:967dde37e712 82 /** Write to an I2C slave
humlet 3:967dde37e712 83 *
humlet 3:967dde37e712 84 * Performs a complete write transaction. The bottom bit of
humlet 3:967dde37e712 85 * the address is forced to 0 to indicate a write.
humlet 3:967dde37e712 86 *
humlet 3:967dde37e712 87 * @param address 8-bit I2C slave address [ addr | 0 ]
humlet 3:967dde37e712 88 * @param data Pointer to the byte-array data to send
humlet 3:967dde37e712 89 * @param length Number of bytes to send
humlet 3:967dde37e712 90 * @param repeated Repeated start, true - do not send stop at end
humlet 3:967dde37e712 91 *
humlet 3:967dde37e712 92 * @returns
humlet 3:967dde37e712 93 * 0 on success (ack),
humlet 3:967dde37e712 94 * non-0 on failure (nack)
humlet 3:967dde37e712 95 */
humlet 3:967dde37e712 96 int write(int address, const char *data, int length, bool repeated = false) {
humlet 3:967dde37e712 97 return m_drv.writeMaster(address, data, length, repeated);
humlet 3:967dde37e712 98 }
humlet 3:967dde37e712 99
humlet 3:967dde37e712 100 /** Write single byte out on the I2C bus
humlet 3:967dde37e712 101 *
humlet 3:967dde37e712 102 * @param data data to write out on bus
humlet 3:967dde37e712 103 *
humlet 3:967dde37e712 104 * @returns
humlet 3:967dde37e712 105 * '1' if an ACK was received,
humlet 3:967dde37e712 106 * '0' otherwise
humlet 3:967dde37e712 107 */
humlet 3:967dde37e712 108 int write(int data) {
humlet 3:967dde37e712 109 return m_drv.writeMaster(data);
humlet 3:967dde37e712 110 }
humlet 3:967dde37e712 111
humlet 3:967dde37e712 112 /** Creates a start condition on the I2C bus
humlet 3:967dde37e712 113 */
humlet 3:967dde37e712 114
humlet 13:530968937ccb 115 void start(void) {
humlet 3:967dde37e712 116 m_drv.startMaster();
humlet 3:967dde37e712 117 }
humlet 3:967dde37e712 118
humlet 13:530968937ccb 119 /// Creates a stop condition on the I2C bus
humlet 13:530968937ccb 120 /// If unsccessful because someone on the bus holds the scl line down it returns "false" after 23µs
humlet 13:530968937ccb 121 /// In normal operation the stop shouldn't take longer than 12µs @ 100kHz and 3-4µs @ 400kHz.
humlet 13:530968937ccb 122 bool stop(void) {
humlet 13:530968937ccb 123 return m_drv.stopMaster();
humlet 13:530968937ccb 124 }
humlet 13:530968937ccb 125
humlet 13:530968937ccb 126 /// Wait until the interface becomes available.
humlet 13:530968937ccb 127 ///
humlet 13:530968937ccb 128 /// Useful if you want to run a sequence of command without interrution by another thread.
humlet 13:530968937ccb 129 /// There's no need to call this function for running single request, because all driver functions
humlet 13:530968937ccb 130 /// will lock the device for exclusive access automatically.
humlet 13:530968937ccb 131 void lock() {
humlet 13:530968937ccb 132 m_drv.lock();
humlet 13:530968937ccb 133 }
humlet 13:530968937ccb 134
humlet 13:530968937ccb 135 /// Unlock the interface that has previously been locked by the same thread.
humlet 13:530968937ccb 136 void unlock() {
humlet 13:530968937ccb 137 m_drv.unlock();
humlet 3:967dde37e712 138 }
humlet 3:967dde37e712 139
humlet 3:967dde37e712 140 };
humlet 3:967dde37e712 141 }
humlet 3:967dde37e712 142
humlet 3:967dde37e712 143
humlet 3:967dde37e712 144 #endif