Marco Zecchini
/
Example_RTOS
Rtos API example
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 #include "mbed.h" 00002 #include "test_env.h" 00003 #include <stdio.h> 00004 00005 #if !DEVICE_I2C 00006 #error [NOT_SUPPORTED] I2C is not supported 00007 #endif 00008 00009 #if !DEVICE_I2CSLAVE 00010 #error [NOT_SUPPORTED] I2C Slave is not supported 00011 #endif 00012 00013 #if !DEVICE_I2C_ASYNCH 00014 #error [NOT_SUPPORTED] I2C Async is not supported 00015 #endif 00016 00017 #define ADDR (0x80) 00018 #define FREQ 100000 00019 #define SIZE 10 00020 00021 // ******************************************************** 00022 // This tests data transfer between two I2C interfaces on 00023 // the same chip, one configured as master, the other as 00024 // slave. 00025 // 00026 // Wiring: connect master SCL to slave SCL, and master SDA to slave SDA 00027 // ******************************************************** 00028 00029 #if defined (TARGET_DISCO_F429ZI) 00030 I2C master(PB_9, PB_8); 00031 #elif defined(TARGET_FF_ARDUINO) 00032 I2C master(D14, D15); // I2C_SDA, I2C_SCL 00033 #endif 00034 00035 #if defined (TARGET_NUCLEO_F072RB) || \ 00036 defined (TARGET_NUCLEO_F030R8) || \ 00037 defined (TARGET_NUCLEO_F103RB) || \ 00038 defined (TARGET_NUCLEO_F207ZG) || \ 00039 defined (TARGET_NUCLEO_F446ZE) || \ 00040 defined (TARGET_NUCLEO_F429ZI) || \ 00041 defined (TARGET_DISCO_F429ZI) || \ 00042 defined (TARGET_NUCLEO_F767ZI) || \ 00043 defined (TARGET_NUCLEO_L053R8) || \ 00044 defined (TARGET_NUCLEO_L073RZ) || \ 00045 defined (TARGET_NUCLEO_L152RE) || \ 00046 defined (TARGET_NUCLEO_L476RG) 00047 I2CSlave slave(PB_11, PB_10); 00048 #elif defined(TARGET_NUCLEO_F303RE) 00049 I2CSlave slave(D2, D8); 00050 #elif defined (TARGET_DISCO_L475VG_IOT01A) 00051 I2CSlave slave(A4, A5); 00052 #else 00053 I2CSlave slave(D3, D6); 00054 #endif 00055 00056 volatile int why; 00057 volatile bool master_complete = false; 00058 void cbmaster_done(int event) { 00059 master_complete = true; 00060 why = event; 00061 } 00062 00063 int main() 00064 { 00065 event_callback_t callback; 00066 bool success = true; 00067 char buf_master[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 00068 char buf_slave[SIZE]; 00069 char res_master[SIZE]; 00070 char buf_master_tx[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; 00071 char buf_master_rx[SIZE]; 00072 char buf_slave_txrx[SIZE]; 00073 00074 callback.attach(cbmaster_done); 00075 00076 master.frequency(FREQ); 00077 slave.frequency(FREQ); 00078 slave.address(ADDR); 00079 00080 00081 // First transfer: master to slave 00082 printf("\nFirst transfer: Master Tx, Repeated Start\n"); 00083 if(master.transfer(ADDR, buf_master, SIZE, 0, 0, callback, I2C_EVENT_ALL, true) != 0) 00084 notify_completion(false); 00085 00086 while (!master_complete) { 00087 if(slave.receive() == I2CSlave::WriteAddressed) { 00088 slave.read(buf_slave, SIZE); 00089 for(int i = 0; i < SIZE; i++){ 00090 buf_slave[i]++; 00091 } 00092 } 00093 } 00094 if (why != I2C_EVENT_TRANSFER_COMPLETE) { 00095 printf("Transfer result: 0x%x\n", why); 00096 notify_completion(false); 00097 } 00098 master_complete = false; 00099 why = 0; 00100 printf("Transfer result: OK\n"); 00101 00102 // Second transfer: slave to master 00103 printf("\nSecond transfer: Master Rx\n"); 00104 if(master.transfer(ADDR, 0, 0, res_master, SIZE, callback, I2C_EVENT_ALL, true) != 0) 00105 notify_completion(false); 00106 00107 while (!master_complete) { 00108 if(slave.receive() == I2CSlave::ReadAddressed) { 00109 if(slave.write(buf_slave, SIZE)) 00110 notify_completion(false); 00111 } 00112 } 00113 if (why != I2C_EVENT_TRANSFER_COMPLETE) { 00114 printf("Transfer result: 0x%x\n", why); 00115 notify_completion(false); 00116 } 00117 master_complete = false; 00118 why = 0; 00119 printf("Transfer result: OK\n"); 00120 00121 // Check first exchange success 00122 for(int i = 0; i < SIZE; i++) { 00123 if (res_master[i] != (buf_master[i] + 1)) { 00124 printf("Buffer check KO\n"); 00125 printf("res_master[%d]: %d, buf_master[%d]: %d\n",i,res_master[i],i,buf_master[i]); 00126 notify_completion(false); 00127 break; 00128 } 00129 } 00130 printf("Buffer check OK\n"); 00131 00132 // Third transfer: Tx/Rx 00133 printf("\nThird transfer: Master Tx/Rx\n"); 00134 if(master.transfer(ADDR, buf_master_tx, SIZE, buf_master_rx, SIZE, callback, I2C_EVENT_ALL, false) != 0) 00135 notify_completion(false); 00136 00137 while (!master_complete) { 00138 00139 int i = slave.receive(); 00140 00141 if(i == I2CSlave::WriteAddressed) { 00142 slave.read(buf_slave_txrx, SIZE); 00143 for(int i = 0; i < SIZE; i++){ 00144 buf_slave_txrx[i]++; 00145 } 00146 } 00147 00148 if((i == I2CSlave::ReadAddressed) ) { 00149 slave.write(buf_slave_txrx, SIZE); 00150 } 00151 } 00152 if (why != I2C_EVENT_TRANSFER_COMPLETE) { 00153 printf("Transfer result: 0x%x\n", why); 00154 notify_completion(false); 00155 } 00156 master_complete = false; 00157 why = 0; 00158 printf("Transfer result: OK\n"); 00159 00160 for(int i = 0; i < SIZE; i++) { 00161 if (buf_master_rx[i] != (buf_master_tx[i] + 1)) { 00162 printf("Buffer check KO\n"); 00163 printf("buf_master_rx[%d]: %d, buf_master_tx[%d]: %d\n",i,buf_master_rx[i],i,buf_master_tx[i]); 00164 notify_completion(false); 00165 break; 00166 } 00167 } 00168 printf("Buffer check OK\n"); 00169 notify_completion(success); 00170 } 00171
Generated on Sun Jul 17 2022 08:25:26 by 1.7.2