Rtos API example
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Sun Jul 17 2022 08:25:26 by
1.7.2