mirror of https://github.com/ARMmbed/mbed-os.git
[dev_asynch_i2c] Test Asynch I2C on F411RE
Add single board I2C master/slave asynch testpull/2622/head
parent
7632f7aa5c
commit
4b42fc5a22
|
|
@ -809,7 +809,7 @@
|
||||||
"progen": {"target": "nucleo-f411re"},
|
"progen": {"target": "nucleo-f411re"},
|
||||||
"detect_code": ["0740"],
|
"detect_code": ["0740"],
|
||||||
"macros": ["TRANSACTION_QUEUE_SIZE_SPI=2"],
|
"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"]
|
"release_versions": ["2", "5"]
|
||||||
},
|
},
|
||||||
"ELMO_F411RE": {
|
"ELMO_F411RE": {
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,10 @@
|
||||||
I2C i2c(PTE0, PTE1);
|
I2C i2c(PTE0, PTE1);
|
||||||
#elif defined(TARGET_nRF51822)
|
#elif defined(TARGET_nRF51822)
|
||||||
I2C i2c(p22,p20);
|
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)
|
#elif defined(TARGET_FF_ARDUINO) || defined(TARGET_MAXWSNENV)
|
||||||
I2C i2c(I2C_SDA, I2C_SCL);
|
I2C i2c(I2C_SDA, I2C_SCL);
|
||||||
#elif defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32WG_STK3800)
|
#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_SDA_PIN PA10
|
||||||
#define TEST_SCL_PIN PA09
|
#define TEST_SCL_PIN PA09
|
||||||
I2C i2c(TEST_SDA_PIN, TEST_SCL_PIN);
|
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
|
#else
|
||||||
I2C i2c(p28, p27);
|
I2C i2c(p28, p27);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,135 @@
|
||||||
|
#include "mbed.h"
|
||||||
|
#include "test_env.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -16,7 +16,8 @@ I2CSlave slave(p9, p10);
|
||||||
I2CSlave slave(PA16, PA17);
|
I2CSlave slave(PA16, PA17);
|
||||||
#elif defined(TARGET_SAMD21J18A) || defined(TARGET_SAMD21G18A) || defined(TARGET_SAML21J18A)
|
#elif defined(TARGET_SAMD21J18A) || defined(TARGET_SAMD21G18A) || defined(TARGET_SAML21J18A)
|
||||||
I2CSlave slave(PA08, PA09);
|
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)
|
I2CSlave slave(PB_3, PB_10); // I2C_2 (Arduino: D3/D6)
|
||||||
#elif defined(TARGET_FF_ARDUINO)
|
#elif defined(TARGET_FF_ARDUINO)
|
||||||
I2CSlave slave(I2C_SDA, I2C_SCL);
|
I2CSlave slave(I2C_SDA, I2C_SCL);
|
||||||
|
|
|
||||||
|
|
@ -1165,6 +1165,11 @@ TESTS = [
|
||||||
"automated": True,
|
"automated": True,
|
||||||
#"host_test" : "detect_auto",
|
#"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],
|
||||||
|
},
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue