summaryrefslogtreecommitdiffhomepage
path: root/digital/avr/modules/twi/test/test_twi_master.c
diff options
context:
space:
mode:
Diffstat (limited to 'digital/avr/modules/twi/test/test_twi_master.c')
-rw-r--r--digital/avr/modules/twi/test/test_twi_master.c94
1 files changed, 85 insertions, 9 deletions
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;
}