This fork of the MBED Library allows you to use counters on the external counter pins (15/16 for Timer 3, 29/30 for Timer 2) by switching internal timing functions in MBED to utilize Timer 0

Fork of mbed-src by mbed official

Files at this revision

API Documentation at this revision

Comitter:
mbed_official
Date:
Thu Sep 11 13:15:08 2014 +0100
Parent:
313:b7d035234249
Child:
315:1d806f4588f1
Commit message:
Synchronized with git revision 31f43a330576b420154e9459b856d93f92b5ed71

Full URL: https://github.com/mbedmicro/mbed/commit/31f43a330576b420154e9459b856d93f92b5ed71/

[nrf51822] avoid using a global variable and fix I2C read sequence

Changed in this revision

targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/i2c_api.c Show annotated file Show diff for this revision Revisions of this file
targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/objects.h Show annotated file Show diff for this revision Revisions of this file
--- a/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/i2c_api.c	Thu Sep 11 13:00:06 2014 +0100
+++ b/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/i2c_api.c	Thu Sep 11 13:15:08 2014 +0100
@@ -30,8 +30,6 @@
     {NC, NC,    0}
 };
 
-uint8_t addrSet = 0;
-
 void i2c_interface_enable(i2c_t *obj)
 {
     obj->i2c->ENABLE = (TWI_ENABLE_ENABLE_Enabled << TWI_ENABLE_ENABLE_Pos);
@@ -97,7 +95,7 @@
 {
     int status = 0;
     i2c_reset(obj);
-    addrSet = 0;
+    obj->address_set = 0;
     return status;
 }
 
@@ -113,7 +111,7 @@
             return 1;
         }
     }
-    addrSet = 0;
+    obj->address_set = 0;
     i2c_reset(obj);
     return 0;
 }
@@ -137,8 +135,13 @@
     int timeOut = 100000;
 
     if (last) {
-        obj->i2c->TASKS_STOP = 1;
+        // To trigger stop task when a byte is received,
+        // must be set before resume task.
+        obj->i2c->SHORTS = 2;
     }
+
+    obj->i2c->TASKS_RESUME = 1;
+
     while (!obj->i2c->EVENTS_RXDREADY) {
         timeOut--;
         if (timeOut<0) {
@@ -146,14 +149,8 @@
         }
     }
     obj->i2c->EVENTS_RXDREADY = 0;
-
     *data = obj->i2c->RXD;
 
-    for (int i = 0; i<320; i++) {
-    }
-
-    obj->i2c->TASKS_RESUME = 1;
-
     return 0;
 }
 
@@ -191,7 +188,7 @@
 {
     int status, count, errorResult;
     obj->i2c->ADDRESS         = (address >> 1);
-    obj->i2c->SHORTS          = 0;
+    obj->i2c->SHORTS          = 1;  // to trigger suspend task when a byte is received
     obj->i2c->EVENTS_RXDREADY = 0;
     obj->i2c->TASKS_STARTRX   = 1;
 
@@ -266,14 +263,16 @@
 int i2c_byte_write(i2c_t *obj, int data)
 {
     int status = 0;
-    if (!addrSet) {
-        addrSet           = 1;
+    if (!obj->address_set) {
+        obj->address_set  = 1;
         obj->i2c->ADDRESS = (data >> 1);
 
         if (data & 1) {
             obj->i2c->EVENTS_RXDREADY = 0;
+            obj->i2c->SHORTS          = 1;
             obj->i2c->TASKS_STARTRX   = 1;
         } else {
+            obj->i2c->SHORTS        = 0;
             obj->i2c->TASKS_STARTTX = 1;
         }
     } else {
--- a/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/objects.h	Thu Sep 11 13:00:06 2014 +0100
+++ b/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/objects.h	Thu Sep 11 13:15:08 2014 +0100
@@ -53,6 +53,7 @@
     PinName sda;
     PinName scl;
     int freq;
+    uint8_t address_set;
 };
 
 struct analogin_s {