[Top][All Lists]
[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 */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [paparazzi-commits] [4263] Add I2C transceive - transmit and receive in one function,
Martin Mueller <=