summaryrefslogtreecommitdiff
path: root/tmk_core/tool/mbed/mbed-sdk/libraries/tests/mbed/i2c_eeprom/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tmk_core/tool/mbed/mbed-sdk/libraries/tests/mbed/i2c_eeprom/main.cpp')
-rw-r--r--tmk_core/tool/mbed/mbed-sdk/libraries/tests/mbed/i2c_eeprom/main.cpp155
1 files changed, 155 insertions, 0 deletions
diff --git a/tmk_core/tool/mbed/mbed-sdk/libraries/tests/mbed/i2c_eeprom/main.cpp b/tmk_core/tool/mbed/mbed-sdk/libraries/tests/mbed/i2c_eeprom/main.cpp
new file mode 100644
index 0000000000..e6fd0d0d75
--- /dev/null
+++ b/tmk_core/tool/mbed/mbed-sdk/libraries/tests/mbed/i2c_eeprom/main.cpp
@@ -0,0 +1,155 @@
+#include "test_env.h"
+
+/******************************************************************************
+* This will test an I2C EEPROM connected to mbed by writing a predefined byte at
+* address 0 and then reading it back and comparing it with the known byte value a
+* number of times. This test was written specifically for reproducing the bug
+* reported here:
+*
+* https://mbed.org/forum/bugs-suggestions/topic/4128/
+*
+* Test configuration:
+*
+* set 'ntests' to the number of iterations
+* set 'i2c_speed_hz' to the desired speed of the I2C interface
+* set 'i2c_delay_us' to the delay that will be inserted between 'write' and
+* 'read' I2C operations (https://mbed.org/users/mbed_official/code/mbed/issues/1
+* for more details). '0' disables the delay.
+* define I2C_EEPROM_VERBOSE to get verbose output
+*
+* The test ran with a 24LC256 external EEPROM memory, but any I2C EEPROM memory
+* that uses two byte addresses should work.
+******************************************************************************/
+
+#if defined(TARGET_KL25Z)
+I2C i2c(PTC9, PTC8);
+
+#elif defined(TARGET_KL46Z)
+I2C i2c(PTC9, PTC8);
+
+#elif defined(TARGET_K64F)
+I2C i2c(PTE25, PTE24);
+
+#elif defined(TARGET_K22F)
+I2C i2c(PTE0, PTE1);
+
+#elif defined(TARGET_K20D50M)
+I2C i2c(PTB3, PTB2);
+
+#elif defined(TARGET_LPC812)
+I2C i2c(P0_10, P0_11);
+
+#elif defined(TARGET_LPC1549)
+I2C i2c(P0_23, P0_22);
+
+#elif defined(TARGET_LPC11U68)
+I2C i2c(SDA, SCL);
+
+#elif defined(TARGET_DELTA_DFCM_NNN40)
+I2C i2c(I2C_SDA0, I2C_SCL0);
+
+#elif defined(TARGET_NUCLEO_F030R8) || \
+ defined(TARGET_NUCLEO_F070RB) || \
+ defined(TARGET_NUCLEO_F072RB) || \
+ defined(TARGET_NUCLEO_F091RC) || \
+ defined(TARGET_NUCLEO_F103RB) || \
+ defined(TARGET_NUCLEO_F302R8) || \
+ defined(TARGET_NUCLEO_F303RE) || \
+ defined(TARGET_NUCLEO_F334R8) || \
+ defined(TARGET_NUCLEO_F401RE) || \
+ defined(TARGET_NUCLEO_F411RE) || \
+ defined(TARGET_NUCLEO_L053R8) || \
+ defined(TARGET_NUCLEO_L073RZ) || \
+ defined(TARGET_NUCLEO_L152RE) || \
+ defined(TARGET_FF_ARDUINO)
+I2C i2c(I2C_SDA, I2C_SCL);
+
+#else
+I2C i2c(p28, p27);
+#endif
+
+namespace {
+const int ntests = 10000;
+const int i2c_freq_hz = 400000;
+const int i2c_delay_us = 0;
+}
+
+int main() {
+ MBED_HOSTTEST_TIMEOUT(15);
+ MBED_HOSTTEST_SELECT(default_auto);
+ MBED_HOSTTEST_DESCRIPTION(I2C EEPROM read write test);
+ MBED_HOSTTEST_START("MBED_A19");
+
+ const int EEPROM_MEM_ADDR = 0xA0;
+ const char MARK = 0x66;
+ int fw = 0;
+ int fr = 0;
+ int fc = 0;
+ int i2c_stat = 0;
+ bool result = true;
+
+ i2c.frequency(i2c_freq_hz);
+ printf("I2C: I2C Frequency: %d Hz\r\n", i2c_freq_hz);
+
+ printf("I2C: Write 0x%2X at address 0x0000 test ... \r\n", MARK);
+ // Data write
+ {
+ char data[] = { 0, 0, MARK };
+ if ((i2c_stat = i2c.write(EEPROM_MEM_ADDR, data, sizeof(data))) != 0) {
+ printf("Unable to write data to EEPROM (i2c_stat = 0x%02X), aborting\r\n", i2c_stat);
+ notify_completion(false);
+ return 1;
+ }
+
+ // ACK polling (assumes write will be successful eventually)
+ while (i2c.write(EEPROM_MEM_ADDR, data, 0) != 0)
+ ;
+ }
+
+ printf("I2C: Read data from address 0x0000 test ... \r\n");
+ // Data read (actual test)
+ for (int i = 0; i < ntests; i++) {
+ // Write data to EEPROM memory
+ {
+ char data[] = { 0, 0 };
+ if ((i2c_stat = i2c.write(EEPROM_MEM_ADDR, data, 2, true)) != 0) {
+ printf("Test %d failed at write, i2c_stat is 0x%02X\r\n", i, i2c_stat);
+ fw++;
+ continue;
+ }
+ }
+
+ // us delay if specified
+ if (i2c_delay_us != 0)
+ wait_us(i2c_delay_us);
+
+ // Read data
+ {
+ char data[1] = { 0 };
+ if ((i2c_stat = i2c.read(EEPROM_MEM_ADDR, data, 1)) != 0) {
+ printf("Test %d failed at read, i2c_stat is 0x%02X\r\n", i, i2c_stat);
+ fr++;
+ continue;
+ }
+
+ if (data[0] != MARK) {
+ printf("Test %d failed at data match\r\n", i);
+ fc++;
+ }
+ }
+ }
+
+ result = (fw + fr + fc == 0);
+ printf("EEPROM: Test result ... [%s]\r\n", result ? "OK" : "FAIL");
+
+ if (!result) {
+ printf("Test Statistics:\r\n");
+ printf("\tTotal tests: %d\r\n", ntests);
+ printf("\tFailed at write: %d\r\n", fw);
+ printf("\tFailed at read: %d\r\n", fr);
+ printf("\tData mismatch: %d\r\n", fc);
+ printf("\tTotal failures: %d\r\n", fw + fr + fc);
+ }
+
+ MBED_HOSTTEST_RESULT(result);
+}