Rtos API example

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "test_env.h"
00003 
00004 #if !DEVICE_I2C || !DEVICE_I2C_ASYNCH
00005   #error [NOT_SUPPORTED] I2C ASYNCH is not supported
00006 #endif
00007 
00008 #define SIZE (10)
00009 #define ADDR (0x90)
00010 #define FREQ 100000
00011 
00012 #if defined(TARGET_KL25Z)
00013 I2C i2c(PTE0, PTE1);
00014 #elif defined(TARGET_nRF51822)
00015 I2C i2c(p22,p20);
00016 #elif defined(TARGET_NUCLEO_F411RE) || defined (TARGET_DISCO_F469NI)
00017 #define TEST_SDA_PIN PB_9
00018 #define TEST_SCL_PIN PB_8
00019 I2C i2c(TEST_SDA_PIN, TEST_SCL_PIN); // I2C_1 (Arduino: D14/D15)
00020 #elif defined(TARGET_FF_ARDUINO) || defined(TARGET_MAXWSNENV)
00021 I2C i2c(I2C_SDA, I2C_SCL);
00022 #define TEST_SDA_PIN PB_9
00023 #define TEST_SCL_PIN PB_8
00024 #elif defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32GG_STK3700) || defined(TARGET_EFM32WG_STK3800)
00025 #define TEST_SDA_PIN PD6
00026 #define TEST_SCL_PIN PD7
00027 I2C i2c(TEST_SDA_PIN, TEST_SCL_PIN);
00028 #elif defined(TARGET_EFM32ZG_STK3200)
00029 #define TEST_SDA_PIN PE12
00030 #define TEST_SCL_PIN PE13
00031 I2C i2c(TEST_SDA_PIN, TEST_SCL_PIN);
00032 #elif defined(TARGET_EFM32HG_STK3400)
00033 #define TEST_SDA_PIN PD6
00034 #define TEST_SCL_PIN PD7
00035 I2C i2c(TEST_SDA_PIN, TEST_SCL_PIN);
00036 #elif defined(TARGET_EFM32PG_STK3401)
00037 #define TEST_SDA_PIN PC10
00038 #define TEST_SCL_PIN PC11
00039 I2C i2c(TEST_SDA_PIN, TEST_SCL_PIN);
00040 #elif defined(TARGET_SAMR21G18A)
00041 #define TEST_SDA_PIN PA16
00042 #define TEST_SCL_PIN PA17
00043 I2C i2c(TEST_SDA_PIN, TEST_SCL_PIN);
00044 #elif defined(TARGET_SAMD21J18A) || defined(TARGET_SAMD21G18A) || defined(TARGET_SAML21J18A)
00045 #define TEST_SDA_PIN PA08
00046 #define TEST_SCL_PIN PA09
00047 I2C i2c(TEST_SDA_PIN, TEST_SCL_PIN);
00048 #elif defined(TARGET_SAMG55J19)
00049 #define TEST_SDA_PIN PA10
00050 #define TEST_SCL_PIN PA09
00051 I2C i2c(TEST_SDA_PIN, TEST_SCL_PIN);
00052 #else
00053 //I2C i2c(p28, p27);
00054 #endif
00055 
00056 volatile int why;
00057 volatile bool complete = false;
00058 void cbdone(int event) {
00059     complete = true;
00060     why = event;
00061 }
00062 
00063 
00064 int main() {
00065     
00066     event_callback_t callback;
00067     char buf[] = {3, 2, 1, 4, 5, 6, 7, 8, 9, 10};
00068     char res[SIZE];
00069     char buf_master_tx[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
00070     char buf_master_rx[SIZE];
00071     int rc;
00072     
00073     printf("\n\nTest init\n");
00074     
00075     callback.attach(cbdone);
00076 
00077     i2c.frequency(FREQ);
00078     
00079     // First transfer: Tx/Rx
00080     printf("\nFirst transfer: Master Tx\n");    
00081     rc = i2c.transfer(ADDR, buf, SIZE, 0, 0, callback, I2C_EVENT_ALL, true);
00082     if (rc != 0) {
00083         notify_completion(false);
00084     }
00085     while (!complete) {
00086         sleep();
00087     }
00088     if (why != I2C_EVENT_TRANSFER_COMPLETE) {
00089         notify_completion(false);
00090     }    
00091     printf("Why: %d\n", (int)why);
00092     why = 0;
00093     complete = false;    
00094 
00095     // Second transfer: Rx
00096     printf("\nSecond transfer: Master Rx\n");    
00097     rc = i2c.transfer(ADDR, 0, 0, res, SIZE, callback, I2C_EVENT_ALL, false);
00098     if (rc != 0) {
00099         notify_completion(false);
00100     }
00101     while (!complete) {
00102         sleep();
00103     }
00104     if (why != I2C_EVENT_TRANSFER_COMPLETE) {
00105         notify_completion(false);
00106     }
00107     printf("Why: %d\n", (int)why);
00108     
00109     // Check buffers
00110     for(int i = 0; i < SIZE; i++) {
00111         if (res[i] != (buf[i] + 1)) {
00112             printf("Buffer check KO\n");
00113             notify_completion(false);
00114             break;
00115         }
00116     }
00117 
00118     // Third transfer: Tx/Rx
00119     printf("\nThird transfer: Master Tx/Rx\n");
00120     rc = i2c.transfer(ADDR, buf_master_tx, SIZE, buf_master_rx, SIZE, callback, I2C_EVENT_ALL, false);
00121     if (rc != 0) {
00122         notify_completion(false);
00123     }
00124     while (!complete) {
00125     sleep();
00126     }
00127     if (why != I2C_EVENT_TRANSFER_COMPLETE) {
00128         printf("Transfer result: 0x%x\n", why);
00129         notify_completion(false);
00130     }
00131     complete = false;
00132     why = 0;
00133     printf("Transfer result: OK\n");
00134 
00135     for(int i = 0; i < SIZE; i++) {
00136         if (buf_master_rx[i] != (buf_master_tx[i] + 1)) {
00137             printf("Buffer check KO\n");
00138             printf("buf_master_rx[%d]: %d, buf_master_tx[%d]: %d\n",i,buf_master_rx[i],i,buf_master_tx[i]);
00139             notify_completion(false);
00140             break;
00141         }
00142     }
00143     printf("Buffer check OK\n");
00144     notify_completion(true);
00145 }