From c77555a08c233d37d4f985e725a7af7dade66f86 Mon Sep 17 00:00:00 2001 From: demonchy Date: Sat, 16 Apr 2005 00:04:41 +0000 Subject: Passage en non bloquant --- n/avr/twi-master/twi_master.c | 119 ++++++++++++++++++++++++------------------ 1 file changed, 67 insertions(+), 52 deletions(-) (limited to 'n/avr/twi-master') 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 #include +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; -- cgit v1.2.3