From 4b42fc5a2254f40ee4c2987364b25a320f18010f Mon Sep 17 00:00:00 2001 From: Erwan GOURIOU Date: Thu, 1 Sep 2016 09:18:47 +0200 Subject: [PATCH] [dev_asynch_i2c] Test Asynch I2C on F411RE Add single board I2C master/slave asynch test --- hal/targets.json | 2 +- libraries/tests/mbed/i2c_master/main.cpp | 8 +- .../mbed/i2c_master_slave_asynch/main.cpp | 135 ++++++++++++++++++ libraries/tests/mbed/i2c_slave/main.cpp | 3 +- tools/tests.py | 5 + 5 files changed, 147 insertions(+), 6 deletions(-) create mode 100644 libraries/tests/mbed/i2c_master_slave_asynch/main.cpp diff --git a/hal/targets.json b/hal/targets.json index 116e4d193c..639e97d4d9 100644 --- a/hal/targets.json +++ b/hal/targets.json @@ -809,7 +809,7 @@ "progen": {"target": "nucleo-f411re"}, "detect_code": ["0740"], "macros": ["TRANSACTION_QUEUE_SIZE_SPI=2"], - "device_has": ["ANALOGIN", "ERROR_RED", "I2C", "I2CSLAVE", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "STDIO_MESSAGES"], + "device_has": ["ANALOGIN", "ERROR_RED", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "STDIO_MESSAGES"], "release_versions": ["2", "5"] }, "ELMO_F411RE": { diff --git a/libraries/tests/mbed/i2c_master/main.cpp b/libraries/tests/mbed/i2c_master/main.cpp index 49efadac82..57eb5ece78 100644 --- a/libraries/tests/mbed/i2c_master/main.cpp +++ b/libraries/tests/mbed/i2c_master/main.cpp @@ -12,6 +12,10 @@ I2C i2c(PTE0, PTE1); #elif defined(TARGET_nRF51822) I2C i2c(p22,p20); +#elif defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_F429ZI) || defined(TARGET_NUCLEO_F446RE) +#define TEST_SDA_PIN PB_9 +#define TEST_SCL_PIN PB_8 +I2C i2c(TEST_SDA_PIN, TEST_SCL_PIN); // I2C_1 (Arduino: D14/D15) #elif defined(TARGET_FF_ARDUINO) || defined(TARGET_MAXWSNENV) I2C i2c(I2C_SDA, I2C_SCL); #elif defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32WG_STK3800) @@ -42,10 +46,6 @@ I2C i2c(TEST_SDA_PIN, TEST_SCL_PIN); #define TEST_SDA_PIN PA10 #define TEST_SCL_PIN PA09 I2C i2c(TEST_SDA_PIN, TEST_SCL_PIN); -#elif defined(TARGET_NUCLEO_F411RE) -#define TEST_SDA_PIN PB_9 -#define TEST_SCL_PIN PB_8 -I2C i2c(TEST_SDA_PIN, TEST_SCL_PIN); // I2C_1 (Arduino: D14/D15) #else I2C i2c(p28, p27); #endif diff --git a/libraries/tests/mbed/i2c_master_slave_asynch/main.cpp b/libraries/tests/mbed/i2c_master_slave_asynch/main.cpp new file mode 100644 index 0000000000..00e1d26acb --- /dev/null +++ b/libraries/tests/mbed/i2c_master_slave_asynch/main.cpp @@ -0,0 +1,135 @@ +#include "mbed.h" +#include "test_env.h" +#include + +#define ADDR (0x90) +#define FREQ 100000 +#define SIZE 10 + +// ******************************************************** +// This tests data transfer between two I2C interfaces on +// the same chip, one configured as master, the other as +// slave. +// +// Wiring: +// D14 <-> D3 +// D15 <-> D6 +// ******************************************************** + +#if defined(TARGET_NUCLEO_F411RE) +I2C master(PB_9, PB_8); // I2C_1 (Arduino: D14/D15) +I2CSlave slave(PB_3, PB_10); // I2C_2 (Arduino: D3/D6) +#endif + +volatile int why; +volatile bool master_complete = false; +void cbmaster_done(int event) { + printf("cbmaster_done\n"); + master_complete = true; + why = event; +} + +int main() +{ + event_callback_t callback; + bool success = true; + char buf_master[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + char buf_slave[SIZE]; + char res_master[SIZE]; + char buf_master_tx[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; + char buf_master_rx[SIZE]; + char buf_slave_txrx[SIZE]; + + callback.attach(cbmaster_done); + + master.frequency(FREQ); + slave.frequency(FREQ); + slave.address(ADDR); + + + // First transfer: master to slave + printf("\nFirst transfer: Master Tx, Repeated Start\n"); + master.transfer(ADDR, buf_master, SIZE, 0, 0, callback, I2C_EVENT_ALL, true); + + while (!master_complete) { + if(slave.receive() == I2CSlave::WriteAddressed) { + slave.read(buf_slave, SIZE); + for(int i = 0; i < SIZE; i++){ + buf_slave[i]++; + } + } + } + if (why != I2C_EVENT_TRANSFER_COMPLETE) { + printf("Transfer result: 0x%x\n", why); + notify_completion(false); + } + master_complete = false; + why = 0; + printf("Transfer result: OK\n"); + + // Second transfer: slave to master + printf("\nSecond transfer: Master Rx\n"); + master.transfer(ADDR, 0, 0, res_master, SIZE, callback, I2C_EVENT_ALL, true); + + while (!master_complete) { + if(slave.receive() == I2CSlave::ReadAddressed) { + slave.write(buf_slave, SIZE); + } + } + if (why != I2C_EVENT_TRANSFER_COMPLETE) { + printf("Transfer result: 0x%x\n", why); + notify_completion(false); + } + master_complete = false; + why = 0; + printf("Transfer result: OK\n"); + + // Check first exchange success + for(int i = 0; i < SIZE; i++) { + if (res_master[i] != (buf_master[i] + 1)) { + printf("Buffer check KO\n"); + printf("res_master[%d]: %d, buf_master[%d]: %d\n",i,res_master[i],i,buf_master[i]); + notify_completion(false); + break; + } + } + printf("Buffer check OK\n"); + + // Third transfer: Tx/Rx + printf("\nThird transfer: Master Tx/Rx\n"); + master.transfer(ADDR, buf_master_tx, SIZE, buf_master_rx, SIZE, callback, I2C_EVENT_ALL, false); + + while (!master_complete) { + + int i = slave.receive(); + + if(i == I2CSlave::WriteAddressed) { + slave.read(buf_slave_txrx, SIZE); + for(int i = 0; i < SIZE; i++){ + buf_slave_txrx[i]++; + } + } + if((i == I2CSlave::ReadAddressed) ) { + slave.write(buf_slave_txrx, SIZE); + } + } + if (why != I2C_EVENT_TRANSFER_COMPLETE) { + printf("Transfer result: 0x%x\n", why); + notify_completion(false); + } + master_complete = false; + why = 0; + printf("Transfer result: OK\n"); + + for(int i = 0; i < SIZE; i++) { + if (buf_master_rx[i] != (buf_master_tx[i] + 1)) { + printf("Buffer check KO\n"); + printf("buf_master_rx[%d]: %d, buf_master_tx[%d]: %d\n",i,buf_master_rx[i],i,buf_master_tx[i]); + notify_completion(false); + break; + } + } + printf("Buffer check OK\n"); + notify_completion(success); +} + diff --git a/libraries/tests/mbed/i2c_slave/main.cpp b/libraries/tests/mbed/i2c_slave/main.cpp index 95f88317a6..cd8f390ab1 100644 --- a/libraries/tests/mbed/i2c_slave/main.cpp +++ b/libraries/tests/mbed/i2c_slave/main.cpp @@ -16,7 +16,8 @@ I2CSlave slave(p9, p10); I2CSlave slave(PA16, PA17); #elif defined(TARGET_SAMD21J18A) || defined(TARGET_SAMD21G18A) || defined(TARGET_SAML21J18A) I2CSlave slave(PA08, PA09); -#elif defined TARGET_NUCLEO_F411RE +#elif defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_F429ZI) || defined(TARGET_NUCLEO_F446RE) +//I2C master(PB_9, PB_8); // I2C_1 (Arduino: D14/D15) I2CSlave slave(PB_3, PB_10); // I2C_2 (Arduino: D3/D6) #elif defined(TARGET_FF_ARDUINO) I2CSlave slave(I2C_SDA, I2C_SCL); diff --git a/tools/tests.py b/tools/tests.py index 26ca23f344..67570fe868 100644 --- a/tools/tests.py +++ b/tools/tests.py @@ -1165,6 +1165,11 @@ TESTS = [ "automated": True, #"host_test" : "detect_auto", }, + { + "id": "I2C_MASTER_SLAVE_ASYNCH", "description": "i2c_master_slave_asynch", + "source_dir": join(TEST_DIR, "mbed", "i2c_master_slave_asynch"), + "dependencies": [MBED_LIBRARIES, TEST_MBED_LIB], + }, ]