paparazzi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[paparazzi-commits] [4263] Add I2C transceive - transmit and receive in


From: Martin Mueller
Subject: [paparazzi-commits] [4263] Add I2C transceive - transmit and receive in one function
Date: Sat, 17 Oct 2009 15:19:12 +0000

Revision: 4263
          http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=4263
Author:   mmm
Date:     2009-10-17 15:19:12 +0000 (Sat, 17 Oct 2009)
Log Message:
-----------
Add I2C transceive - transmit and receive in one function

Modified Paths:
--------------
    paparazzi3/trunk/sw/airborne/i2c.c
    paparazzi3/trunk/sw/airborne/i2c.h

Modified: paparazzi3/trunk/sw/airborne/i2c.c
===================================================================
--- paparazzi3/trunk/sw/airborne/i2c.c  2009-10-17 15:17:59 UTC (rev 4262)
+++ paparazzi3/trunk/sw/airborne/i2c.c  2009-10-17 15:19:12 UTC (rev 4263)
@@ -7,10 +7,12 @@
 
 volatile uint8_t i2c0_status;
 volatile uint8_t i2c0_buf[I2C0_BUF_LEN];
-volatile uint8_t i2c0_len;
+volatile uint16_t i2c0_len_r;
+volatile uint8_t  i2c0_len_w;
 volatile uint8_t i2c0_index;
 volatile uint8_t i2c0_slave_addr;
 volatile bool_t  i2c0_stop_after_transmit;
+volatile uint8_t i2c0_trx;
 
 volatile bool_t* i2c0_finished;
 
@@ -21,16 +23,18 @@
 }
 
 
-void i2c0_receive(uint8_t slave_addr, uint8_t len, volatile bool_t* finished) {
-  i2c0_len = len;
+void i2c0_receive(uint8_t slave_addr, uint16_t len, volatile bool_t* finished) 
{
+  i2c0_len_r = len;
   i2c0_slave_addr = slave_addr | I2C_RECEIVE;
   i2c0_finished = finished;
   i2c0_status = I2C_BUSY;
+  i2c0_stop_after_transmit = TRUE; /** Default "historic" behaviour */
   I2c0SendStart();
 }
 
 static inline void i2c0_init_transmit(uint8_t slave_addr, uint8_t len, 
volatile bool_t* finished) {
-  i2c0_len = len;
+  i2c0_trx = 0;
+  i2c0_len_w = len;
   i2c0_slave_addr = slave_addr & ~I2C_RECEIVE;
   i2c0_finished = finished;
   i2c0_status = I2C_BUSY;
@@ -38,26 +42,41 @@
 
 
 void i2c0_transmit(uint8_t slave_addr, uint8_t len, volatile bool_t* finished) 
{
+  i2c0_trx = 0;
   i2c0_init_transmit(slave_addr, len, finished);
   i2c0_stop_after_transmit = TRUE; /** Default "historic" behaviour */
   I2c0SendStart();
 }
 
 void i2c0_transmit_no_stop(uint8_t slave_addr, uint8_t len, volatile bool_t* 
finished) {
+  i2c0_trx = 0;
   i2c0_init_transmit(slave_addr, len, finished);
   i2c0_stop_after_transmit = FALSE; /** Default "historic" behaviour */
   I2c0SendStart();
 }
 
+void i2c0_transceive(uint8_t slave_addr, uint8_t len_w, uint16_t len_r, 
volatile bool_t* finished) {
+  i2c0_trx = 1;
+  i2c0_len_w = len_w;
+  i2c0_len_r = len_r;
+  i2c0_slave_addr = slave_addr & ~I2C_RECEIVE;
+  i2c0_finished = finished;
+  i2c0_status = I2C_BUSY;
+  I2c0SendStart();
+}
+
+
 #endif /* USE_I2C0 */
 
 #ifdef USE_I2C1
 
 volatile uint8_t i2c1_status;
 volatile uint8_t i2c1_buf[I2C1_BUF_LEN];
-volatile uint8_t i2c1_len;
-volatile uint8_t i2c1_index;
+volatile uint16_t i2c1_len_r;
+volatile uint8_t  i2c1_len_w;
+volatile uint16_t i2c1_index;
 volatile uint8_t i2c1_slave_addr;
+volatile uint8_t i2c1_trx;
 
 volatile bool_t* i2c1_finished;
 
@@ -68,8 +87,9 @@
 }
 
 
-void i2c1_receive(uint8_t slave_addr, uint8_t len, volatile bool_t* finished) {
-  i2c1_len = len;
+void i2c1_receive(uint8_t slave_addr, uint16_t len, volatile bool_t* finished) 
{
+  i2c1_trx = 0;
+  i2c1_len_r = len;
   i2c1_slave_addr = slave_addr | I2C_RECEIVE;
   i2c1_finished = finished;
   i2c1_status = I2C_BUSY;
@@ -77,11 +97,22 @@
 }
 
 void i2c1_transmit(uint8_t slave_addr, uint8_t len, volatile bool_t* finished) 
{
-  i2c1_len = len;
+  i2c1_trx = 0;
+  i2c1_len_w = len;
   i2c1_slave_addr = slave_addr & ~I2C_RECEIVE;
   i2c1_finished = finished;
   i2c1_status = I2C_BUSY;
   I2c1SendStart();
 }
 
+void i2c1_transceive(uint8_t slave_addr, uint8_t len_w, uint16_t len_r, 
volatile bool_t* finished) {
+  i2c1_trx = 1;
+  i2c1_len_w = len_w;
+  i2c1_len_r = len_r;
+  i2c1_slave_addr = slave_addr & ~I2C_RECEIVE;
+  i2c1_finished = finished;
+  i2c1_status = I2C_BUSY;
+  I2c1SendStart();
+}
+
 #endif /* USE_I2C1 */

Modified: paparazzi3/trunk/sw/airborne/i2c.h
===================================================================
--- paparazzi3/trunk/sw/airborne/i2c.h  2009-10-17 15:17:59 UTC (rev 4262)
+++ paparazzi3/trunk/sw/airborne/i2c.h  2009-10-17 15:19:12 UTC (rev 4263)
@@ -22,9 +22,10 @@
 #ifdef USE_I2C0
 
 extern void i2c0_init(void);
-extern void i2c0_receive(uint8_t slave_addr, uint8_t len, volatile bool_t* 
finished);
+extern void i2c0_receive(uint8_t slave_addr, uint16_t len, volatile bool_t* 
finished);
 extern void i2c0_transmit(uint8_t slave_addr, uint8_t len, volatile bool_t* 
finished);
 extern void i2c0_transmit_no_stop(uint8_t slave_addr, uint8_t len, volatile 
bool_t* finished);
+extern void i2c0_transceive(uint8_t slave_addr, uint8_t len_w, uint16_t len_r, 
volatile bool_t* finished);
 
 extern volatile uint8_t i2c0_status;
 extern volatile bool_t  i2c0_stop_after_transmit;
@@ -35,9 +36,11 @@
 #endif
 
 extern volatile uint8_t i2c0_buf[I2C0_BUF_LEN];
-extern volatile uint8_t i2c0_len;
+extern volatile uint16_t i2c0_len_r;
+extern volatile uint8_t  i2c0_len_w;
 extern volatile uint8_t i2c0_index;
 extern volatile uint8_t i2c0_slave_addr;
+extern volatile uint8_t i2c0_trx;
 
 extern volatile bool_t* i2c0_finished;
 
@@ -50,10 +53,10 @@
       i2c0_index = 0;                                                  \
       break;                                                           \
     case I2C_MR_DATA_ACK:                                              \
-      if (i2c0_index < i2c0_len) {                                     \
+      if (i2c0_index < i2c0_len_r) {                                   \
        i2c0_buf[i2c0_index] = I2C_DATA_REG;                            \
        i2c0_index++;                                                   \
-       I2c0Receive(i2c0_index < i2c0_len - 1);                         \
+       I2c0Receive(i2c0_index < i2c0_len_r - 1);                               
\
       }                                                                        
\
       else {                                                           \
        /* error , we should have got NACK */                           \
@@ -62,7 +65,7 @@
       break;                                                           \
     case I2C_MR_SLA_ACK: /* At least one char */                       \
       /* Wait and reply with ACK or NACK */                            \
-      I2c0Receive(i2c0_index < i2c0_len - 1);                          \
+      I2c0Receive(i2c0_index < i2c0_len_r - 1);                                
\
       break;                                                           \
     case I2C_MR_SLA_NACK:                                              \
     case I2C_MT_SLA_NACK:                                              \
@@ -70,19 +73,26 @@
       break;                                                           \
     case I2C_MT_SLA_ACK:                                               \
     case I2C_MT_DATA_ACK:                                              \
-      if (i2c0_index < i2c0_len) {                                     \
+      if (i2c0_index < i2c0_len_w) {                                   \
        I2c0SendByte(i2c0_buf[i2c0_index]);                             \
        i2c0_index++;                                                   \
       } else {                                                         \
-       if (i2c0_stop_after_transmit) {                                 \
-          I2c0SendStop();                                               \
-        } else {                                                        \
-          I2c0Finished();                                               \
-        }                                                               \
+        if (i2c0_trx) {                  \
+          i2c0_trx = 0;                      \
+          i2c0_index = 0;                      \
+          i2c0_slave_addr |= 1;                \
+          I2c0SendStart();                     \
+        } else {                              \
+             if (i2c0_stop_after_transmit) {                                 \
+            I2c0SendStop();                                               \
+          } else {                                                        \
+            I2c0Finished();                                               \
+          }                                                               \
+           }                                     \
       }                                                                        
\
       break;                                                           \
     case I2C_MR_DATA_NACK:                                             \
-      if (i2c0_index < i2c0_len) {                                     \
+      if (i2c0_index < i2c0_len_r) {                                   \
        i2c0_buf[i2c0_index] = I2C_DATA_REG;                            \
       }                                                                        
\
       I2c0SendStop();                                                  \
@@ -100,6 +110,7 @@
 extern void i2c1_init(void);
 extern void i2c1_receive(uint8_t slave_addr, uint8_t len, volatile bool_t* 
finished);
 extern void i2c1_transmit(uint8_t slave_addr, uint8_t len, volatile bool_t* 
finished);
+extern void i2c1_transceive(uint8_t slave_addr, uint8_t len_w, uint16_t len_r, 
volatile bool_t* finished);
 
 extern volatile uint8_t i2c1_status;
 
@@ -108,9 +119,11 @@
 #endif
 
 extern volatile uint8_t i2c1_buf[I2C1_BUF_LEN];
-extern volatile uint8_t i2c1_len;
+extern volatile uint16_t i2c1_len_r;
+extern volatile uint8_t  i2c1_len_w;
 extern volatile uint8_t i2c1_index;
 extern volatile uint8_t i2c1_slave_addr;
+extern volatile uint8_t i2c1_trx;
 
 extern volatile bool_t* i2c1_finished;
 
@@ -123,10 +136,10 @@
       i2c1_index = 0;                                                  \
       break;                                                           \
     case I2C_MR_DATA_ACK:                                              \
-      if (i2c1_index < i2c1_len) {                                     \
+      if (i2c1_index < i2c1_len_r) {                                   \
        i2c1_buf[i2c1_index] = I2C1_DATA_REG;                           \
        i2c1_index++;                                                   \
-       I2c1Receive(i2c1_index < i2c1_len - 1);                         \
+       I2c1Receive(i2c1_index < i2c1_len_r - 1);                               
\
       }                                                                        
\
       else {                                                           \
        /* error , we should have got NACK */                           \
@@ -135,7 +148,7 @@
       break;                                                           \
     case I2C_MR_SLA_ACK: /* At least one char */                       \
       /* Wait and reply with ACK or NACK */                            \
-      I2c1Receive(i2c1_index < i2c1_len - 1);                          \
+      I2c1Receive(i2c1_index < i2c1_len_r - 1);                                
\
       break;                                                           \
     case I2C_MR_SLA_NACK:                                              \
     case I2C_MT_SLA_NACK:                                              \
@@ -143,15 +156,22 @@
       break;                                                           \
     case I2C_MT_SLA_ACK:                                               \
     case I2C_MT_DATA_ACK:                                              \
-      if (i2c1_index < i2c1_len) {                                     \
+      if (i2c1_index < i2c1_len_w) {                                   \
        I2c1SendByte(i2c1_buf[i2c1_index]);                             \
        i2c1_index++;                                                   \
       } else {                                                         \
-       I2c1SendStop();                                                 \
+        if (i2c1_trx) {                  \
+          i2c1_trx = 0;                      \
+          i2c1_index = 0;                      \
+          i2c1_slave_addr |= 1;                \
+          I2c1SendStart();                     \
+        } else {                              \
+             I2c1SendStop();                                    \
+           }                                     \
       }                                                                        
\
       break;                                                           \
     case I2C_MR_DATA_NACK:                                             \
-      if (i2c1_index < i2c1_len) {                                     \
+      if (i2c1_index < i2c1_len_r) {                                   \
        i2c1_buf[i2c1_index] = I2C1_DATA_REG;                           \
       }                                                                        
\
       I2c1SendStop();                                                  \
@@ -162,8 +182,6 @@
     }                                                                  \
   }                                                                    \
    
-
-
 #endif /* USE_I2C1 */
 
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]