diff --git a/tests/driver_at24cxxx/Makefile b/tests/driver_at24cxxx/Makefile new file mode 100644 index 0000000000..26bcdf18da --- /dev/null +++ b/tests/driver_at24cxxx/Makefile @@ -0,0 +1,5 @@ +include ../Makefile.tests_common + +USEMODULE += at24c256 + +include $(RIOTBASE)/Makefile.include diff --git a/tests/driver_at24cxxx/main.c b/tests/driver_at24cxxx/main.c new file mode 100644 index 0000000000..4282891982 --- /dev/null +++ b/tests/driver_at24cxxx/main.c @@ -0,0 +1,180 @@ +/* + * Copyright (C) 2019 Otto-von-Guericke-Universität Magdeburg + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup tests + * @{ + * + * @file + * @brief AT24CXXX test application + * + * Tested with bluepill and AT24C256 + * + * @} + */ + +#include +#include +#include + +#include "xtimer.h" + +#include "at24cxxx.h" +#include "at24cxxx_params.h" + +#ifndef AT24CXXX_ERASE +#define AT24CXXX_ERASE (0) +#endif + +#define WRITE_BYTE_POSITION (12U) +#define WRITE_BYTE_CHARACTER 'A' + +#define WRITE_POSITION (AT24CXXX_EEPROM_SIZE - \ + 3 * AT24CXXX_PAGE_SIZE - 4) +#define WRITE_CHARACTERS { 'B', 'E', 'E', 'R', '4', \ + 'F', 'R', 'E', 'E', '\0' } + +#define SET_POSITION (AT24CXXX_EEPROM_SIZE - \ + 7 * AT24CXXX_PAGE_SIZE - 4) +#define SET_CHARACTER 'G' +#define SET_LEN (20U) + +int main(void) +{ + puts("Starting tests for module at24cxxx"); + + at24cxxx_t at24cxxx_dev; + int check; + + printf("EEPROM size: %u byte\n", AT24CXXX_EEPROM_SIZE); + printf("Page size : %u byte\n", AT24CXXX_PAGE_SIZE); + + /* Test: Init */ + check = at24cxxx_init(&at24cxxx_dev, &at24cxxx_params[0]); + if (check != AT24CXXX_OK) { + printf("[FAILURE] at24cxxx_init: (%d)\n", check); + return 1; + } + else { + puts("[SUCCESS] at24cxxx_init"); + } + + /* erase EEPROM to exclude side effects from prior test runs */ +#if AT24CXXX_ERASE + check = at24cxxx_erase(&at24cxxx_dev); + if (check != AT24CXXX_OK) { + printf("[FAILURE] at24cxxx_erase: %d (EEPROM size = %" PRId32 ")\n", + check, at24cxxx_dev.params.eeprom_size); + return 1; + } + else { + puts("[SUCCESS] at24cxxx_erase"); + } +#endif + + /* Test: Write/Read Byte */ + check = at24cxxx_write_byte(&at24cxxx_dev, WRITE_BYTE_POSITION, + WRITE_BYTE_CHARACTER); + if (check != AT24CXXX_OK) { + printf("[FAILURE] at24cxxx_write_byte: %d\n", check); + return 1; + } + else { + puts("[SUCCESS] at24cxxx_write_byte"); + } + + uint8_t c; + check = at24cxxx_read_byte(&at24cxxx_dev, WRITE_BYTE_POSITION, &c); + if (check < 0) { + printf("[FAILURE] at24cxxx_read_byte: %d\n", check); + return 1; + } + else { + puts("[SUCCESS] at24cxxx_read_byte"); + } + + if (c != WRITE_BYTE_CHARACTER) { + printf("[FAILURE] write_byte/read_byte: (%" PRId8 " != %d)\n", c, + WRITE_BYTE_CHARACTER); + return 1; + } + else { + puts("[SUCCESS] write_byte/read_byte"); + } + + /* Test: Write */ + uint8_t expected_write_data[] = WRITE_CHARACTERS; + + check = at24cxxx_write(&at24cxxx_dev, WRITE_POSITION, expected_write_data, + sizeof(expected_write_data)); + if (check != AT24CXXX_OK) { + printf("[FAILURE] at24cxxx_write: %d (size = %zu)\n", check, + sizeof(expected_write_data)); + return 1; + } + else { + puts("[SUCCESS] at24cxxx_write"); + } + + /* Test: Read */ + uint8_t actual_write_data[sizeof(expected_write_data)]; + + check = at24cxxx_read(&at24cxxx_dev, WRITE_POSITION, actual_write_data, + sizeof(actual_write_data)); + if (check != AT24CXXX_OK) { + printf("[FAILURE] at24cxxx_read: %d\n", check); + return 1; + } + else { + puts("[SUCCESS] at24cxxx_read"); + } + + if (memcmp(actual_write_data, expected_write_data, + sizeof(actual_write_data)) != 0) { + printf("[FAILURE] write/read: (%s != %s)\n", actual_write_data, + expected_write_data); + return 1; + } + else { + puts("[SUCCESS] write/read"); + } + + /* Test: Set */ + uint8_t expected_set_data[SET_LEN]; + memset(expected_set_data, SET_CHARACTER, SET_LEN); + + uint8_t actual_set_data[sizeof(expected_set_data)]; + + check = at24cxxx_set(&at24cxxx_dev, SET_POSITION, SET_CHARACTER, SET_LEN); + if (check != AT24CXXX_OK) { + printf("[FAILURE] at24cxxx_set: %d (size = %u)\n", check, SET_LEN); + return 1; + } + else { + puts("[SUCCESS] at24cxxx_set"); + } + + check = at24cxxx_read(&at24cxxx_dev, SET_POSITION, + actual_set_data, SET_LEN); + if (check != AT24CXXX_OK) { + printf("[FAILURE] set/read: %d\n", check); + return 1; + } + else if (memcmp(actual_set_data, expected_set_data, SET_LEN) != 0) { + printf("[FAILURE] set/read: (%s != %s)\n", actual_set_data, + expected_set_data); + return 1; + } + else { + puts("[SUCCESS] set/read"); + } + + puts("Finished tests for module at24cxxx"); + + return 0; +}