summaryrefslogtreecommitdiff
path: root/n/avr
diff options
context:
space:
mode:
authordemonchy2005-04-16 00:04:41 +0000
committerdemonchy2005-04-16 00:04:41 +0000
commitc77555a08c233d37d4f985e725a7af7dade66f86 (patch)
tree43d6ae12f4aa26827b61a4ac92664bd01b4bac8a /n/avr
parentc7cdb580d8657f911f1269de1fcd12ffcb7ac424 (diff)
Passage en non bloquant
Diffstat (limited to 'n/avr')
-rw-r--r--n/avr/twi-master/twi_master.c119
1 files changed, 67 insertions, 52 deletions
diff --git a/n/avr/twi-master/twi_master.c b/n/avr/twi-master/twi_master.c
index ee556ca..9bde94c 100644
--- a/n/avr/twi-master/twi_master.c
+++ b/n/avr/twi-master/twi_master.c
@@ -7,11 +7,20 @@
#include <avr/signal.h>
#include <string.h>
+enum
+{
+ TWI_SUCCESS,
+ TWI_BUSY,
+ TWI_FREE,
+ TWI_ECHEC
+};
+
+#define TWI_DEBUG(x) rs232_putc (x)
#define NB_ITER_WAIT 40000
#define NB_RETRY 5
-static uint8_t buffer[TWI_BUF_SIZE];
+static uint8_t *buffer;
static uint8_t twi_dest_addr;
static uint8_t twi_len;
static uint8_t twi_idx;
@@ -34,64 +43,70 @@ twi_master_init (void)
}
int8_t
-twi_master_send (uint8_t addr, uint8_t data[], uint8_t len)
+twi_is_finished ()
+{
+ if (twi_state == TWI_SUCCESS)
+ return 1;
+ else
+ return 0;
+}
+
+int8_t
+twi_master_send (uint8_t addr, uint8_t *data, uint8_t len)
{
- rs232_putc ('a');
- twi_state = 0;
- twi_nb_retry = 0;
- if (len > TWI_BUF_SIZE)
+ if (twi_state == TWI_FREE)
+ {
+ TWI_DEBUG ('a');
+ twi_state = TWI_BUSY;
+ twi_nb_retry = 0;
+ twi_dest_addr = addr & 0xfe;
+ twi_len = len;
+ buffer = data;
+ /* envoie du start */
+ TWCR |= _BV(TWSTA);
+ TWCR |= _BV(TWINT);
+ return 0;
+ }
+ else
return -1;
- twi_dest_addr = addr & 0xfe;
- twi_len = len;
- memcpy (buffer, data, len);
- /* envoie du start */
- TWCR |= _BV(TWSTA);
- TWCR |= _BV(TWINT);
- rs232_putc ('b');
- while (!twi_state)
- ;
- rs232_putc ('c');
- return twi_state;
}
int8_t
-twi_master_read (uint8_t addr, uint8_t data[], uint8_t len)
+twi_master_read (uint8_t addr, uint8_t *data, uint8_t len)
{
- rs232_putc ('a');
- twi_state = 0;
- twi_nb_retry = 0;
- if (len > TWI_BUF_SIZE)
+ if (twi_state == TWI_FREE)
+ {
+ TWI_DEBUG ('a');
+ twi_state = TWI_BUSY;
+ twi_nb_retry = 0;
+ twi_dest_addr = addr | 0x01;
+ twi_len = len;
+ buffer = data;
+ //TWCR &= ~_BV (TWSTO);
+ TWCR |= _BV(TWSTA) | _BV (TWINT);
+ return 0;
+ }
+ else
return -1;
- twi_dest_addr = addr | 0x01;
- twi_len = len;
- //TWCR &= ~_BV (TWSTO);
- TWCR |= _BV(TWSTA) | _BV (TWINT);
- rs232_putc ('z');
- while (!twi_state)
- ;
- rs232_putc ('x');
- memcpy (data, buffer, len);
- rs232_putc ('w');
- return twi_state;
}
SIGNAL (SIG_2WIRE_SERIAL)
{
- rs232_putc ('y');
+ TWI_DEBUG ('y');
switch (TW_STATUS)
{
/* Master */
case TW_START:
case TW_REP_START:
/* start transmis, on envoie l'adresse */
- rs232_putc ('d');
+ TWI_DEBUG ('d');
TWCR &= ~ (_BV (TWSTA) | _BV (TWSTO) | _BV (TWINT));
TWDR = twi_dest_addr;
twi_idx = 0;
break;
case TW_MT_ARB_LOST: /* valable pour le receiver aussi */
/* todo */
- rs232_putc ('e');
+ TWI_DEBUG ('e');
break;
/* Master Transmitter */
case TW_MT_DATA_ACK:
@@ -101,14 +116,14 @@ SIGNAL (SIG_2WIRE_SERIAL)
*/
if (twi_idx < twi_len)
{
- rs232_putc ('f');
+ TWI_DEBUG ('f');
TWDR = buffer[twi_idx ++];
}
else
{
TWCR |= _BV (TWSTO);
- rs232_putc ('g');
- twi_state = 1;
+ TWI_DEBUG ('g');
+ twi_state = TWI_SUCCESS;
}
break;
case TW_MT_SLA_NACK:
@@ -117,54 +132,54 @@ SIGNAL (SIG_2WIRE_SERIAL)
*/
if (twi_nb_retry < NB_RETRY)
{
- rs232_putc ('h');
+ TWI_DEBUG ('h');
TWCR |= _BV (TWSTA);
twi_nb_retry ++;
}
else
{
- rs232_putc ('i');
+ TWI_DEBUG ('i');
TWCR |= _BV (TWSTO);
- twi_state = 2;
+ twi_state = TWI_ECHEC;
}
break;
case TW_MT_DATA_NACK:
/* le slave ne veut plus de donnée */
- rs232_putc ('j');
+ TWI_DEBUG ('j');
TWCR |= _BV (TWSTO);
- twi_state = 1;
+ twi_state = TWI_SUCCESS;
break;
/* Master Receiver */
case TW_MR_SLA_ACK:
- rs232_putc ('p');
+ TWI_DEBUG ('p');
if (twi_len > 1) /* on recoit plusieurs octet */
{
- rs232_putc ('k');
+ TWI_DEBUG ('k');
TWCR |= _BV (TWEA);
}
break;
case TW_MR_SLA_NACK:
if (twi_nb_retry < NB_RETRY)
{
- rs232_putc ('l');
+ TWI_DEBUG ('l');
TWCR |= _BV (TWEA);
}
else
{
- rs232_putc ('m');
+ TWI_DEBUG ('m');
TWCR |= _BV (TWSTO);
- twi_state = -2;
+ twi_state = TWI_ECHEC;
}
break;
case TW_MR_DATA_ACK:
buffer[twi_idx ++] = TWDR;
- rs232_putc ('n');
+ TWI_DEBUG ('n');
if (twi_idx == (twi_len - 1))
TWCR |= _BV (TWEA);
break;
case TW_MR_DATA_NACK: /* dernier byte */
- twi_state = 1;
- rs232_putc ('o');
+ twi_state = TWI_SUCCESS;
+ TWI_DEBUG ('o');
buffer[twi_idx ++] = TWDR;
TWCR |= _BV (TWSTO);
break;