From 990bc98cb0c2a1b511f2fc1865cfb2975d686b60 Mon Sep 17 00:00:00 2001 From: demonchy Date: Sun, 1 May 2005 17:47:09 +0000 Subject: Slave transmitter avec double buffer débuggué --- n/avr/twi-slave/twi_slave.c | 58 ++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 32 deletions(-) (limited to 'n') diff --git a/n/avr/twi-slave/twi_slave.c b/n/avr/twi-slave/twi_slave.c index 777400f..c3d084f 100644 --- a/n/avr/twi-slave/twi_slave.c +++ b/n/avr/twi-slave/twi_slave.c @@ -37,13 +37,19 @@ static volatile uint8_t buf_send1[SIZE_BUF_SEND]; static volatile uint8_t buf_send2[SIZE_BUF_SEND]; static volatile uint8_t *buf_send_sys, *buf_send_user; static volatile int8_t send_switch; -static volatile int8_t state; +static volatile int8_t update; + +#if 0 +#define TWI_DEBUG(x) rs232_putc (x) +#else +#define TWI_DEBUG(x) +#endif void twi_init (uint8_t addr) { - state = 0; send_switch = 0; + update = 0; buf_send_sys = buf_send1; buf_send_user = buf_send2; TWAR = addr; @@ -54,26 +60,32 @@ twi_init (uint8_t addr) SIGNAL (SIG_2WIRE_SERIAL) { - rs232_putc (';'); + TWI_DEBUG (';'); switch (TW_STATUS) { /* slave transmitter mode */ /* START + SLA|W + ACK */ case TW_ST_SLA_ACK: case TW_ST_ARB_LOST_SLA_ACK: - state = 1; - rs232_putc ('a'); + TWI_DEBUG ('a'); + if (send_switch && !update) + { + volatile uint8_t *tmp = buf_send_sys; + buf_send_sys = buf_send_user; + buf_send_user = tmp; + send_switch = 0; + } send_idx = 0; /* no break */ case TW_ST_DATA_ACK: - rs232_putc ('b'); + TWI_DEBUG ('b'); TWDR = buf_send_sys[send_idx++]; if (SIZE_BUF_SEND == send_idx) TWCR &= ~_BV(TWEA); break; case TW_ST_DATA_NACK: case TW_ST_LAST_DATA: - rs232_putc ('c'); + TWI_DEBUG ('c'); TWCR |= _BV (TWEA); break; /* slave receiver mode */ @@ -82,8 +94,7 @@ SIGNAL (SIG_2WIRE_SERIAL) case TW_SR_ARB_LOST_SLA_ACK: case TW_SR_GCALL_ACK: case TW_SR_ARB_LOST_GCALL_ACK: - rs232_putc ('z'); - state = 2; + TWI_DEBUG ('z'); data_ready = 0; twi_rcpt_tail = 0; if (SIZE_BUF_RCPT == 1) @@ -92,7 +103,7 @@ SIGNAL (SIG_2WIRE_SERIAL) /* DATA + ACK */ case TW_SR_DATA_ACK: case TW_SR_GCALL_DATA_ACK: - rs232_putc ('y'); + TWI_DEBUG ('y'); buf_rcpt[twi_rcpt_tail++] = TWDR; if (SIZE_BUF_RCPT - twi_rcpt_tail == 1) TWCR &= ~_BV(TWEA); @@ -100,23 +111,13 @@ SIGNAL (SIG_2WIRE_SERIAL) /* DATA + NACK */ case TW_SR_DATA_NACK: case TW_SR_GCALL_DATA_NACK: - rs232_putc ('x'); + TWI_DEBUG ('x'); buf_rcpt[twi_rcpt_tail++] = TWDR; /* no break */ /* STOP */ case TW_SR_STOP: - rs232_putc ('w'); + TWI_DEBUG ('w'); data_ready = 1; - if (state && send_switch) /* send */ - { - volatile uint8_t *tmp; - /* Thibault paye son coup */ - tmp = buf_send_user; - buf_send_user = buf_send_sys; - buf_send_sys = tmp; - send_switch = 0; - state = 0; - } break; } TWCR |= _BV(TWINT); @@ -142,17 +143,10 @@ twi_poll (uint8_t buf[], uint8_t size) void twi_update (uint8_t buf[], uint8_t size) { - volatile uint8_t *tmp; + update = 1; + send_switch = 1; while (size --) buf_send_user[size] = buf[size]; - /* si pas occupé on swap les pointeurs */ - if (!state) - { - tmp = buf_send_user; - buf_send_user = buf_send_sys; - buf_send_sys = tmp; - } - else - send_switch = 1; + update = 0; } -- cgit v1.2.3