Helmut Schmücker / mbed-RtosI2cDriver

Dependencies:   mbed-rtos mbed-src

Revision:
0:13c962fecb13
Child:
1:90455d5bdd8c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/I2CDriver.cpp	Sat Apr 13 13:37:29 2013 +0000
@@ -0,0 +1,102 @@
+#include "I2CDriver.h"
+#include "error.h"
+
+#define ISR2DRV_SIG (1<<0);
+#define DRV_USR_SIG (1<<1);
+
+Channel I2CDriver::channels[2]= {0,0};
+
+
+void I2CDriver::channel_0_ISR()
+{
+    osSignalSet( channels[0].driver, ISR2DRV_SIG);
+    NVIC_DisableIRQ(I2C1_IRQn); //I2C_IRQn
+}
+
+
+void I2CDriver::channel_1_ISR()
+{
+    osSignalSet( channels[1].driver, ISR2DRV_SIG);
+    NVIC_DisableIRQ(I2C2_IRQn); //I2C_IRQn
+}
+
+
+void I2CDriver::threadFun(void* const args)
+{
+    int channelIdx = (int)args;
+    Channel channel;
+    s_channels[channelIdx] = &channel;
+
+    channel.driver = Thread::gettid();
+
+    if(channelIdx==0)NVIC_SetVector(I2C1_IRQn, (uint32_t)I2CDriver::channel_0_ISR);
+    if(channelIdx==1)NVIC_SetVector(I2C2_IRQn, (uint32_t)I2CDriver::channel_1_ISR);
+
+    I2C i2c(c_sda[channelIdx], c_scl[channelIdx]);
+
+    while(1) {
+        osSignalWait(DRV_USR_SIG,0);
+        switch(channels[channel].transfer.cmd) {
+            case START:
+                if(channel.freq!=channel.transfer.freq) i2c.frequency
+                i2c.start();
+                break;
+            case STOP:
+                i2c.stop();
+                break;
+        }
+        s_threads[2]
+    }
+}
+
+
+I2CDriver::I2CDriver(PinName sda, PinName scl)
+{
+    // check pins and determine i2c channel
+    int channel=0;
+    if(sda==sdas[0] && scl==scls[0]) channel=0; // I2C_1
+    else if (sda==sdas[1] && scl==scls[1]) channel=1; //I2C_2
+    else error("I2CDriver: Invalid I2C pinns selected");
+
+    if(s_channels[channel]==0)
+        new Thread(threadFun,(void *)channel,osPriorityRealtime);
+        
+    m_channel = *(s_channel[channel]);
+}
+
+void I2CDriver::sendNwait(){
+    osSignalSet( m_channel.driver, DRV_USR_SIG);
+    osSignalWait(DRV_USR_SIG,osWaitForever);
+}
+
+void I2CDriver::frequency(int hz);
+
+
+int I2CDriver::read(int address, char *data, int length, bool repeated = false);
+
+
+int I2CDriver::read(int ack);
+
+
+int I2CDriver::write(int address, const char *data, int length, bool repeated = false);
+
+
+int I2CDriver::write(int data);
+
+
+void I2CDriver::start(void){
+    lock();
+    m_channel.transfer.freq = _hz;
+    m_channel.transfer.cmd = START;
+    sendNwait();
+    unlock();   
+}
+
+
+void I2CDriver::stop(void){
+    lock();
+    m_channel.transfer.freq = _hz;
+    m_channel.transfer.cmd = STOP;
+    sendNwait();
+    unlock();   
+}