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 defined(TARGET_NUCLEO_F031K6) || \
00014     defined (TARGET_NUCLEO_L011K4) || \
00015     defined (TARGET_NUCLEO_L031K6) || \
00016     defined (TARGET_DISCO_F746NG) || \
00017     defined (TARGET_DISCO_L476VG) || \
00018     defined (TARGET_NUCLEO_F303K8) || \
00019     defined (TARGET_NUCLEO_F334R8) || \
00020     defined (TARGET_DISCO_F334C8) || \
00021     defined (TARGET_NUCLEO_F042K6)
00022   #error [NOT_SUPPORTED] Target has only one I2C instance
00023 #endif
00024 
00025 #define ADDR (0x80)
00026 #define FREQ 100000
00027 
00028 // ********************************************************
00029 // This tests data transfer between two I2C interfaces on
00030 // the same chip, one configured as master, the other as
00031 // slave.
00032 //
00033 // Wiring: connect master SCL to slave SCL, and master SDA to slave SDA
00034 // ********************************************************
00035 
00036 #if defined (TARGET_DISCO_F429ZI) || \
00037     defined (TARGET_DISCO_L053C8)
00038 I2C master(PB_9, PB_8);
00039 
00040 #elif defined(TARGET_FF_ARDUINO)
00041 I2C master(D14, D15); // I2C_SDA, I2C_SCL
00042 #endif
00043 
00044 
00045 #if defined (TARGET_NUCLEO_F429ZI) || \
00046     defined (TARGET_NUCLEO_F767ZI) || \
00047     defined (TARGET_NUCLEO_L053R8) || \
00048     defined (TARGET_NUCLEO_L073RZ) || \
00049     defined (TARGET_NUCLEO_L152RE) || \
00050     defined (TARGET_NUCLEO_L476RG) || \
00051     defined (TARGET_NUCLEO_F207ZG) || \
00052     defined (TARGET_NUCLEO_F103RB) || \
00053     defined (TARGET_NUCLEO_F091RC) || \
00054     defined (TARGET_DISCO_F429ZI) || \
00055     defined (TARGET_DISCO_F469NI) || \
00056     defined (TARGET_DISCO_L053C8) || \
00057     defined (TARGET_NUCLEO_F446ZE)
00058 I2CSlave slave(PB_11, PB_10);
00059 
00060 #elif defined (TARGET_NUCLEO_F303RE) || \
00061     defined (TARGET_NUCLEO_F302R8)
00062 I2CSlave slave(D2, D8);
00063 
00064 #elif defined (TARGET_NUCLEO_F303ZE)
00065 I2CSlave slave(PC_9, PA_8);
00066 
00067 #elif defined (TARGET_NUCLEO_F746ZG)
00068 I2CSlave slave(D2, D4);
00069 
00070 #elif defined (TARGET_NUCLEO_F030R8) || \
00071     defined (TARGET_NUCLEO_F070RB) || \
00072     defined (TARGET_NUCLEO_F072RB)
00073 I2CSlave slave(PB_11, D6);
00074 
00075 #elif defined (TARGET_DISCO_L475VG_IOT01A)
00076 I2CSlave slave(A4, A5);
00077 
00078 #else
00079 I2CSlave slave(D3, D6);
00080 
00081 #endif
00082 
00083 int main()
00084 {
00085     char sent = 'T', received;
00086 
00087     master.frequency(FREQ);
00088     slave.frequency(FREQ);
00089     slave.address(ADDR);
00090 
00091     // First transfer: master to slave
00092     master.start();
00093     master.write(ADDR);
00094     master.write(sent);
00095     while(slave.receive() != I2CSlave::WriteAddressed);
00096 
00097     slave.read(&received, 1);
00098     if(sent != received)
00099     {
00100         notify_completion(false);
00101         return 1;
00102     }
00103     master.stop();
00104 
00105     // Second transfer: slave to master
00106     master.start();
00107     master.write(ADDR | 1);
00108     while(slave.receive() != I2CSlave::ReadAddressed);
00109 
00110     slave.write(received);
00111     received = master.read(0);
00112     master.stop();
00113     notify_completion(received == sent);
00114 }
00115