mbed library sources

Dependents:   frdm_kl05z_gpio_test

Fork of mbed-src by mbed official

Revision:
300:55638feb26a4
Parent:
270:e2babe29baf8
Child:
314:b682143dd337
--- a/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/i2c_api.c	Wed Aug 27 04:00:07 2014 +0100
+++ b/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/i2c_api.c	Wed Aug 27 08:45:06 2014 +0100
@@ -21,175 +21,187 @@
 static const PinMap PinMap_I2C_SDA[] = {
     {p22, I2C_0, 1},
     {p13, I2C_1, 2},
-    {NC  , NC   , 0}
+    {NC, NC, 0}
 };
 
 static const PinMap PinMap_I2C_SCL[] = {
     {p20, I2C_0, 1},
     {p15, I2C_1, 2},
-    {NC  , NC,    0}
+    {NC, NC,    0}
 };
 
-uint8_t addrSet=0;
+uint8_t addrSet = 0;
 
-void i2c_interface_enable(i2c_t *obj){
+void i2c_interface_enable(i2c_t *obj)
+{
     obj->i2c->ENABLE = (TWI_ENABLE_ENABLE_Enabled << TWI_ENABLE_ENABLE_Pos);
 }
 
-void twi_master_init(i2c_t *obj, PinName sda, PinName scl, int frequency) {
-    NRF_GPIO->PIN_CNF[scl]  = ((GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
-                               (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
-                               (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
-                               (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) |
-                               (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos));
+void twi_master_init(i2c_t *obj, PinName sda, PinName scl, int frequency)
+{
+    NRF_GPIO->PIN_CNF[scl] = ((GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
+                              (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
+                              (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
+                              (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) |
+                              (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos));
 
-    NRF_GPIO->PIN_CNF[sda]  = ((GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
-                               (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
-                               (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
-                               (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) |
-                               (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos));
+    NRF_GPIO->PIN_CNF[sda] = ((GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
+                              (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
+                              (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
+                              (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) |
+                              (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos));
 
-    obj->i2c->PSELSCL               = scl;
-    obj->i2c->PSELSDA               = sda;
+    obj->i2c->PSELSCL = scl;
+    obj->i2c->PSELSDA = sda;
     // set default frequency at 100k
     i2c_frequency(obj, frequency);
     i2c_interface_enable(obj);
 }
-void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
+
+void i2c_init(i2c_t *obj, PinName sda, PinName scl)
+{
     // determine the SPI to use
     I2CName i2c_sda = (I2CName)pinmap_peripheral(sda, PinMap_I2C_SDA);
     I2CName i2c_scl = (I2CName)pinmap_peripheral(scl, PinMap_I2C_SCL);
-    I2CName i2c     = (I2CName)pinmap_merge(i2c_sda,i2c_scl);
-    obj->i2c        = (NRF_TWI_Type            *)i2c;
-    
+    I2CName i2c     = (I2CName)pinmap_merge(i2c_sda, i2c_scl);
+    obj->i2c = (NRF_TWI_Type *)i2c;
+
     MBED_ASSERT((int)obj->i2c != NC);
 
-    obj->scl=scl;
-    obj->sda=sda;
+    obj->scl               = scl;
+    obj->sda               = sda;
     obj->i2c->EVENTS_ERROR = 0;
     obj->i2c->ENABLE       = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
     obj->i2c->POWER        = 0;
-    
-    for(int i=0;i<100;i++){
+
+    for (int i = 0; i<100; i++) {
     }
-    
-    obj->i2c->POWER        = 1;
-    twi_master_init(obj,sda,scl,100000);
+
+    obj->i2c->POWER = 1;
+    twi_master_init(obj, sda, scl, 100000);
 }
-void i2c_reset(i2c_t *obj) {
+
+void i2c_reset(i2c_t *obj)
+{
     obj->i2c->EVENTS_ERROR = 0;
     obj->i2c->ENABLE       = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
     obj->i2c->POWER        = 0;
-    for(int i=0;i<100;i++){
+    for (int i = 0; i<100; i++) {
     }
-    
-    obj->i2c->POWER        = 1;
-    twi_master_init(obj,obj->sda,obj->scl,obj->freq);
+
+    obj->i2c->POWER = 1;
+    twi_master_init(obj, obj->sda, obj->scl, obj->freq);
 }
 
-int i2c_start(i2c_t *obj) {
+int i2c_start(i2c_t *obj)
+{
     int status = 0;
     i2c_reset(obj);
-    addrSet=0;
+    addrSet = 0;
     return status;
 }
 
-int i2c_stop(i2c_t *obj) {
+int i2c_stop(i2c_t *obj)
+{
     int timeOut = 100000;
     obj->i2c->EVENTS_STOPPED = 0;
     // write the stop bit
     obj->i2c->TASKS_STOP = 1;
-    while(!obj->i2c->EVENTS_STOPPED){
+    while (!obj->i2c->EVENTS_STOPPED) {
         timeOut--;
-        if(timeOut<0)
+        if (timeOut<0) {
             return 1;
+        }
     }
     addrSet = 0;
     i2c_reset(obj);
     return 0;
 }
 
-
-int i2c_do_write(i2c_t *obj, int value) {
+int i2c_do_write(i2c_t *obj, int value)
+{
     int timeOut = 100000;
     obj->i2c->TXD = value;
-    while(!obj->i2c->EVENTS_TXDSENT){
+    while (!obj->i2c->EVENTS_TXDSENT) {
         timeOut--;
-        if(timeOut<0)
+        if (timeOut<0) {
             return 1;
+        }
     }
     obj->i2c->EVENTS_TXDSENT = 0;
     return 0;
 }
 
-int i2c_do_read(i2c_t *obj, char * data, int last) {
+int i2c_do_read(i2c_t *obj, char *data, int last)
+{
     int timeOut = 100000;
 
-    if (last){
+    if (last) {
         obj->i2c->TASKS_STOP = 1;
     }
-    while(!obj->i2c->EVENTS_RXDREADY){
+    while (!obj->i2c->EVENTS_RXDREADY) {
         timeOut--;
-        if(timeOut<0)
+        if (timeOut<0) {
             return 1;
+        }
     }
-    obj->i2c->EVENTS_RXDREADY       = 0;
-    
+    obj->i2c->EVENTS_RXDREADY = 0;
+
     *data = obj->i2c->RXD;
-    
-    for(int i=0;i<320;i++){
+
+    for (int i = 0; i<320; i++) {
     }
-    
+
     obj->i2c->TASKS_RESUME = 1;
-    
+
     return 0;
 }
 
-
-void i2c_frequency(i2c_t *obj, int hz) {
-    if(hz<250000){
+void i2c_frequency(i2c_t *obj, int hz)
+{
+    if (hz<250000) {
         obj->freq           = 100000;
         obj->i2c->FREQUENCY = (TWI_FREQUENCY_FREQUENCY_K100 << TWI_FREQUENCY_FREQUENCY_Pos);
-    }
-    else if(hz<400000){
+    } else if (hz<400000) {
         obj->freq           = 250000;
         obj->i2c->FREQUENCY = (TWI_FREQUENCY_FREQUENCY_K250 << TWI_FREQUENCY_FREQUENCY_Pos);
-    }
-    else{
+    } else {
         obj->freq           = 400000;
         obj->i2c->FREQUENCY = (TWI_FREQUENCY_FREQUENCY_K400 << TWI_FREQUENCY_FREQUENCY_Pos);
     }
 }
 
-int checkError(i2c_t *obj){
-    if (obj->i2c->EVENTS_ERROR == 1){
-        if (obj->i2c->ERRORSRC & TWI_ERRORSRC_ANACK_Msk){
-            obj->i2c->EVENTS_ERROR  = 0;
-            obj->i2c->TASKS_STOP    = 1;
+int checkError(i2c_t *obj)
+{
+    if (obj->i2c->EVENTS_ERROR == 1) {
+        if (obj->i2c->ERRORSRC & TWI_ERRORSRC_ANACK_Msk) {
+            obj->i2c->EVENTS_ERROR = 0;
+            obj->i2c->TASKS_STOP   = 1;
             return I2C_ERROR_BUS_BUSY;
         }
-        
-        obj->i2c->EVENTS_ERROR  = 0;
-        obj->i2c->TASKS_STOP    = 1;
+
+        obj->i2c->EVENTS_ERROR = 0;
+        obj->i2c->TASKS_STOP   = 1;
         return I2C_ERROR_NO_SLAVE;
     }
     return 0;
 }
 
-int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
-    int status,count,errorResult;
-    obj->i2c->ADDRESS         = (address>>1);
+int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
+{
+    int status, count, errorResult;
+    obj->i2c->ADDRESS         = (address >> 1);
     obj->i2c->SHORTS          = 0;
     obj->i2c->EVENTS_RXDREADY = 0;
     obj->i2c->TASKS_STARTRX   = 1;
-    
+
     // Read in all except last byte
     for (count = 0; count < (length - 1); count++) {
-        status = i2c_do_read(obj,&data[count], 0);
+        status = i2c_do_read(obj, &data[count], 0);
         if (status) {
             errorResult = checkError(obj);
             i2c_reset(obj);
-            if(errorResult<0){
+            if (errorResult<0) {
                 return errorResult;
             }
             return count;
@@ -197,77 +209,78 @@
     }
 
     // read in last byte
-    status = i2c_do_read(obj,&data[length-1], 1);
+    status = i2c_do_read(obj, &data[length - 1], 1);
     if (status) {
         i2c_reset(obj);
         return length - 1;
     }
     // If not repeated start, send stop.
     if (stop) {
-        while(!obj->i2c->EVENTS_STOPPED){
+        while (!obj->i2c->EVENTS_STOPPED) {
         }
         obj->i2c->EVENTS_STOPPED = 0;
     }
     return length;
 }
 
-int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
+int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
+{
     int status, errorResult;
-    obj->i2c->ADDRESS       = (address>>1);
+    obj->i2c->ADDRESS       = (address >> 1);
     obj->i2c->SHORTS        = 0;
     obj->i2c->TASKS_STARTTX = 1;
- 
-    for (int i=0; i<length; i++) {
+
+    for (int i = 0; i<length; i++) {
         status = i2c_do_write(obj, data[i]);
-        if(status) {
+        if (status) {
             i2c_reset(obj);
             errorResult = checkError(obj);
-            if(errorResult<0){
+            if (errorResult<0) {
                 return errorResult;
             }
             return i;
         }
     }
-    
+
     // If not repeated start, send stop.
     if (stop) {
-        if(i2c_stop(obj)){
+        if (i2c_stop(obj)) {
             return I2C_ERROR_NO_SLAVE;
         }
     }
     return length;
 }
 
-int i2c_byte_read(i2c_t *obj, int last) {
+int i2c_byte_read(i2c_t *obj, int last)
+{
     char data;
     int status;
-    
-    status = i2c_do_read(obj,&data, last);
+
+    status = i2c_do_read(obj, &data, last);
     if (status) {
         i2c_reset(obj);
     }
     return data;
 }
 
-int i2c_byte_write(i2c_t *obj, int data) {
+int i2c_byte_write(i2c_t *obj, int data)
+{
     int status = 0;
-    if(!addrSet){
-        addrSet = 1;
-        obj->i2c->ADDRESS = (data>>1);
-        
-        if(data&1){
+    if (!addrSet) {
+        addrSet           = 1;
+        obj->i2c->ADDRESS = (data >> 1);
+
+        if (data & 1) {
             obj->i2c->EVENTS_RXDREADY = 0;
             obj->i2c->TASKS_STARTRX   = 1;
-        }
-        else{
-            obj->i2c->TASKS_STARTTX   = 1;
+        } else {
+            obj->i2c->TASKS_STARTTX = 1;
         }
-    }
-    else{
+    } else {
         status = i2c_do_write(obj, data);
-        if(status) {
+        if (status) {
             i2c_reset(obj);
         }
     }
-    return (1-status);
+    return (1 - status);
 }