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 #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