From 730778b5bf598cb79cd82ea35dcc4015371cc764 Mon Sep 17 00:00:00 2001 From: Jérémy Dufour Date: Sun, 2 Mar 2008 08:09:35 +0100 Subject: * avr/twi: add a test with multiples random bytes exchange - add on the master a test command to send multiples random bytes to a slave and check if we can read back the same data. --- digital/avr/modules/twi/avrconfig.h | 4 +- digital/avr/modules/twi/test/Makefile.master | 2 +- digital/avr/modules/twi/test/Makefile.slave | 2 +- digital/avr/modules/twi/test/test_twi_master.c | 94 +++++++++++++++++++++++--- 4 files changed, 89 insertions(+), 13 deletions(-) (limited to 'digital') diff --git a/digital/avr/modules/twi/avrconfig.h b/digital/avr/modules/twi/avrconfig.h index 638a773d..139aa55e 100644 --- a/digital/avr/modules/twi/avrconfig.h +++ b/digital/avr/modules/twi/avrconfig.h @@ -25,7 +25,7 @@ * * }}} */ -#define TWI_SL_RCPT_SIZE 1 -#define TWI_SL_SEND_SIZE 1 +#define TWI_SL_RCPT_SIZE 16 +#define TWI_SL_SEND_SIZE 16 #endif /* avrconfig_h */ diff --git a/digital/avr/modules/twi/test/Makefile.master b/digital/avr/modules/twi/test/Makefile.master index 63d6baf8..72762aa2 100644 --- a/digital/avr/modules/twi/test/Makefile.master +++ b/digital/avr/modules/twi/test/Makefile.master @@ -3,7 +3,7 @@ AVR_PROGS = test_twi_master test_twi_master_SOURCES = test_twi_master.c DOC = EXTRACTDOC = -MODULES = twi uart proto +MODULES = twi uart proto math/random CONFIGFILE = avrconfig_master.h diff --git a/digital/avr/modules/twi/test/Makefile.slave b/digital/avr/modules/twi/test/Makefile.slave index 306ee1cf..73d3b01e 100644 --- a/digital/avr/modules/twi/test/Makefile.slave +++ b/digital/avr/modules/twi/test/Makefile.slave @@ -3,7 +3,7 @@ AVR_PROGS = test_twi_sl test_twi_sl_SOURCES = test_twi_sl.c DOC = EXTRACTDOC = -MODULES = twi uart +MODULES = twi uart proto CONFIGFILE = avrconfig_slave.h diff --git a/digital/avr/modules/twi/test/test_twi_master.c b/digital/avr/modules/twi/test/test_twi_master.c index 6349d995..a3301e9a 100644 --- a/digital/avr/modules/twi/test/test_twi_master.c +++ b/digital/avr/modules/twi/test/test_twi_master.c @@ -28,6 +28,7 @@ #include "modules/proto/proto.h" #include "modules/uart/uart.h" #include "modules/utils/utils.h" +#include "modules/math/random/random.h" #include "io.h" void @@ -36,35 +37,110 @@ proto_callback (uint8_t cmd, uint8_t size, uint8_t *args) #define c(cmd, size) (cmd << 8 | size) switch (c (cmd, size)) { - /* Send one byte to a slave address */ case c ('s', 2): - /* s destination_addr data */ + /* Send one byte to a slave address. + * 2 parameters: + * - slave address; + * - data. + */ twi_ms_send (args[0], &args[1], 1); while (!twi_ms_is_finished ()) ; break; - /* Read one byte from an address slave */ case c ('r', 1): - /* c slave_address */ + /* Read one byte from an address slave + * 1 parameter: + * - slave address. + */ { - uint8_t data[1] = {0x00}; - int8_t d = twi_ms_read (args[0], data, 1); + uint8_t data = 0x00; + int8_t d = twi_ms_read (args[0], &data, 1); if (d != 0) proto_send0 ('e'); else { while (!twi_ms_is_finished ()) ; - proto_send ('R', 1, data); + proto_send1b ('R', data); + } + } + break; + case c ('t', 2): + /* Test for sending and receiving multiple data. + * It sends a random number of bytes to the slave and then read back + * from it the same number, checking the data are the same as the sent + * ones. + * 2 parameters: + * - slave address; + * - number of iterations to try on. + */ + { + int error = 0; + uint8_t compt = args[1]; + while (compt-- != 0) + { + /* Maximum number of bytes of the message */ + static const uint8_t max_byte_number = TWI_SL_SEND_SIZE; + /* Get a random number */ + uint32_t random = random_u32 (); + /* Extract a number under max_byte_number */ + uint8_t byte_number = random % max_byte_number + 1; + /* Table which contains the random bytes */ + uint8_t random_bytes[max_byte_number]; + uint8_t i; + for (i = 0; i < byte_number; i++) + { + uint8_t mod = i % 4; + /* Regenerate a new 32 bit random number every 4 bytes */ + if ((mod == 0) && (i != 0)) + random = random_u32 (); + /* Get the part of the random number we need */ + random_bytes[i] = (random >> (mod * 8)) & 0xFF; + } + /* Send data */ + twi_ms_send (args[0], random_bytes, byte_number); + while (!twi_ms_is_finished ()) + ; + + /* Received buffer */ + uint8_t received_buffer[max_byte_number]; + /* Receive data */ + int8_t ret = twi_ms_read (args[0], received_buffer, + byte_number); + /* Check return */ + if (ret != 0) + { + /* Error */ + proto_send0 ('e'); + error = 1; + break; + } + while (!twi_ms_is_finished ()) + ; + for (i = 0; i < byte_number; i++) + { + if (received_buffer[i] != random_bytes[i]) + { + error = 1; + break; + } + } + if (error != 0) + break; + } + /* Check for error */ + if (error == 0) + { + proto_send1b ('T', args[1]); } } break; - /* Reset */ case c ('z', 0): + /* Reset */ utils_reset (); break; - /* Error */ default: + /* Error */ proto_send0 ('?'); return; } -- cgit v1.2.3