program for I2C master device

Dependencies:   mbed

Fork of I2C_HelloWorld_Mbed by mbed official

Committer:
marcus255
Date:
Fri Dec 25 21:35:57 2015 +0000
Revision:
10:39dd1d3508c3
Parent:
9:36fc715eb54c
Child:
11:eff597e2366e
Final version of I2C Master devices simulator

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcus255 10:39dd1d3508c3 1 /*
marcus255 10:39dd1d3508c3 2 * Project: I2C to UART converter
marcus255 10:39dd1d3508c3 3 * File: main.cpp
marcus255 10:39dd1d3508c3 4 * Utility: simulating I2C Master devices
marcus255 10:39dd1d3508c3 5 * Author: Marek Trojan
marcus255 10:39dd1d3508c3 6 */
marcus255 10:39dd1d3508c3 7
marcus255 4:1ec553356dcc 8 #include "main.h"
marcus255 9:36fc715eb54c 9
marcus255 9:36fc715eb54c 10 int main()
marcus255 9:36fc715eb54c 11 {
marcus255 4:1ec553356dcc 12 init();
marcus255 8:3e6945d5d9a1 13 wait_ms(1000);
marcus255 4:1ec553356dcc 14 while (1) {}
marcus255 4:1ec553356dcc 15 }
mbed_official 0:f76c26307f9a 16
marcus255 9:36fc715eb54c 17 void write_and_read()
marcus255 9:36fc715eb54c 18 {
marcus255 9:36fc715eb54c 19 if (routine == MEMORY_ROUTINE) {
marcus255 9:36fc715eb54c 20 read_data(&memory_cell_addr);
marcus255 10:39dd1d3508c3 21 wait_ms(20);
marcus255 10:39dd1d3508c3 22 write_data();
marcus255 9:36fc715eb54c 23 memory_cell_addr+=0x10;
marcus255 10:39dd1d3508c3 24 } else if (routine == TIME_ROUTINE) {
marcus255 10:39dd1d3508c3 25 rtc_time();
marcus255 9:36fc715eb54c 26 } else if (routine == SENSOR_ROUTINE) {
marcus255 9:36fc715eb54c 27 rtc_sensor();
marcus255 9:36fc715eb54c 28 }
marcus255 9:36fc715eb54c 29 }
marcus255 8:3e6945d5d9a1 30
marcus255 8:3e6945d5d9a1 31 void rtc_sensor()
marcus255 8:3e6945d5d9a1 32 {
marcus255 8:3e6945d5d9a1 33 char temperature[2];
marcus255 9:36fc715eb54c 34 if(get_temperature_raw(temperature)) {
marcus255 9:36fc715eb54c 35 float result = proceed_temperature(temperature);
marcus255 9:36fc715eb54c 36 pc.printf("> Temperature: %1.2f\n\r",result);
marcus255 10:39dd1d3508c3 37 wait_ms(1);
marcus255 10:39dd1d3508c3 38 } else {
marcus255 10:39dd1d3508c3 39 pc.printf("> I2C Error\n\r");
marcus255 10:39dd1d3508c3 40 }
marcus255 10:39dd1d3508c3 41 }
marcus255 10:39dd1d3508c3 42
marcus255 10:39dd1d3508c3 43 void rtc_time()
marcus255 10:39dd1d3508c3 44 {
marcus255 10:39dd1d3508c3 45 char time[3];
marcus255 10:39dd1d3508c3 46 if(get_time_raw(time)) {
marcus255 10:39dd1d3508c3 47 uint8_t t[6];
marcus255 10:39dd1d3508c3 48 proceed_time(time, t);
marcus255 10:39dd1d3508c3 49 pc.printf("> Time: %x%x:%x%x:%x%x\n\r", t[0], t[1], t[2], t[3], t[4], t[5]);
marcus255 10:39dd1d3508c3 50 wait_ms(1);
marcus255 9:36fc715eb54c 51 } else {
marcus255 9:36fc715eb54c 52 pc.printf("> I2C Error\n\r");
marcus255 9:36fc715eb54c 53 }
marcus255 8:3e6945d5d9a1 54 }
marcus255 8:3e6945d5d9a1 55
marcus255 9:36fc715eb54c 56 int get_temperature_raw(char* temperature)
marcus255 8:3e6945d5d9a1 57 {
marcus255 8:3e6945d5d9a1 58 char reg_addr = TEMPERATURE_REGISTER;
marcus255 9:36fc715eb54c 59 if(i2c.write(RTC_ADDR, &reg_addr, 1)) {
marcus255 9:36fc715eb54c 60 //pc.printf("Writing: Error\n\r");
marcus255 9:36fc715eb54c 61 return 0;
marcus255 9:36fc715eb54c 62 }
marcus255 8:3e6945d5d9a1 63 wait_ms(20);
marcus255 9:36fc715eb54c 64 if(i2c.read(RTC_ADDR, temperature, 2)) {
marcus255 9:36fc715eb54c 65 //pc.printf("Reading: Error\n\r");
marcus255 9:36fc715eb54c 66 return 0;
marcus255 9:36fc715eb54c 67 }
marcus255 9:36fc715eb54c 68 return 1;
marcus255 8:3e6945d5d9a1 69 }
marcus255 8:3e6945d5d9a1 70
marcus255 10:39dd1d3508c3 71 int get_time_raw(char* time)
marcus255 10:39dd1d3508c3 72 {
marcus255 10:39dd1d3508c3 73 char reg_addr = TIME_REGISTER;
marcus255 10:39dd1d3508c3 74 if(i2c.write(RTC_ADDR, &reg_addr, 1)) {
marcus255 10:39dd1d3508c3 75 return 0;
marcus255 10:39dd1d3508c3 76 }
marcus255 10:39dd1d3508c3 77 wait_ms(20);
marcus255 10:39dd1d3508c3 78 if(i2c.read(RTC_ADDR, time, 3)) {
marcus255 10:39dd1d3508c3 79 return 0;
marcus255 10:39dd1d3508c3 80 }
marcus255 10:39dd1d3508c3 81 return 1;
marcus255 10:39dd1d3508c3 82 }
marcus255 10:39dd1d3508c3 83
marcus255 8:3e6945d5d9a1 84 float proceed_temperature(char * temperature)
marcus255 8:3e6945d5d9a1 85 {
marcus255 9:36fc715eb54c 86 char MSB = temperature[0]; // MSB is a signed int8 and carries temperature in accuracy of 1 Celsius degree
marcus255 8:3e6945d5d9a1 87 char LSB = temperature[1]; // LSB carries fraction part of temperature. Possible values are 0, 0.25, 0.5, 0.75
marcus255 8:3e6945d5d9a1 88 float high = (float)MSB;
marcus255 8:3e6945d5d9a1 89 float low = ((float)((uint8_t)LSB >> 6) * 0.25f);
marcus255 8:3e6945d5d9a1 90 return high + low;
marcus255 8:3e6945d5d9a1 91 }
marcus255 8:3e6945d5d9a1 92
marcus255 10:39dd1d3508c3 93 void proceed_time(char * time, uint8_t * tiny_time)
marcus255 10:39dd1d3508c3 94 {
marcus255 10:39dd1d3508c3 95 char secs = time[0];
marcus255 10:39dd1d3508c3 96 char mins = time[1];
marcus255 10:39dd1d3508c3 97 char hrs = time[2];
marcus255 10:39dd1d3508c3 98
marcus255 10:39dd1d3508c3 99 *(tiny_time + 0) = ((hrs >> 4) & 0x01);
marcus255 10:39dd1d3508c3 100 *(tiny_time + 1) = (hrs & 0x0F);
marcus255 10:39dd1d3508c3 101 *(tiny_time + 2) = ((mins >> 4) & 0x0F);
marcus255 10:39dd1d3508c3 102 *(tiny_time + 3) = (mins & 0x0F);
marcus255 10:39dd1d3508c3 103 *(tiny_time + 4) = ((secs >> 4) & 0x0F);
marcus255 10:39dd1d3508c3 104 *(tiny_time + 5) = (secs & 0x0F);
marcus255 10:39dd1d3508c3 105 }
marcus255 10:39dd1d3508c3 106
marcus255 5:8dc6d7d81250 107
marcus255 9:36fc715eb54c 108 void write_data()
marcus255 9:36fc715eb54c 109 {
marcus255 10:39dd1d3508c3 110 srand(time(NULL));
marcus255 9:36fc715eb54c 111 for (uint8_t i = 0; i < DATA_SIZE; i++) {
marcus255 9:36fc715eb54c 112 data[i+1] = (char) (rnd() % 90 + 33);
marcus255 4:1ec553356dcc 113 }
marcus255 9:36fc715eb54c 114 data[0] = memory_cell_addr;
marcus255 10:39dd1d3508c3 115 if (i2c.write(EEPROM_ADDRESS, data, DATA_SIZE + 1)) {
marcus255 9:36fc715eb54c 116 pc.printf("> Writing: Error\n\r");
marcus255 9:36fc715eb54c 117 } else {
marcus255 9:36fc715eb54c 118 pc.printf("> Writing: OK\n\r");
marcus255 9:36fc715eb54c 119 }
marcus255 9:36fc715eb54c 120
marcus255 5:8dc6d7d81250 121 }
marcus255 5:8dc6d7d81250 122
marcus255 9:36fc715eb54c 123 void read_data(char* cell_addr)
marcus255 9:36fc715eb54c 124 {
marcus255 9:36fc715eb54c 125 int success = 1;
marcus255 9:36fc715eb54c 126 char fromSlave[DATA_SIZE + 1];
marcus255 9:36fc715eb54c 127 fromSlave[DATA_SIZE] = '\0';
marcus255 10:39dd1d3508c3 128 if(i2c.write(EEPROM_ADDRESS, cell_addr, 1)) {
marcus255 9:36fc715eb54c 129 success = 0;
marcus255 7:b07706b16279 130 }
marcus255 9:36fc715eb54c 131 wait_ms(20);
marcus255 9:36fc715eb54c 132 if (success) {
marcus255 10:39dd1d3508c3 133 if(i2c.read(EEPROM_ADDRESS, fromSlave, DATA_SIZE)) {
marcus255 9:36fc715eb54c 134 //pc.printf("Reading: Error\n\r");
marcus255 9:36fc715eb54c 135 success = 0;
marcus255 5:8dc6d7d81250 136 }
marcus255 9:36fc715eb54c 137 }
marcus255 9:36fc715eb54c 138 if (success) {
marcus255 10:39dd1d3508c3 139 pc.printf("> Reading: OK, data at 0x%x is: %s\n\r", *cell_addr, fromSlave);
marcus255 9:36fc715eb54c 140 } else {
marcus255 10:39dd1d3508c3 141 pc.printf("> Reading: Error\n\r");
marcus255 9:36fc715eb54c 142 }
marcus255 5:8dc6d7d81250 143 }
marcus255 9:36fc715eb54c 144
marcus255 9:36fc715eb54c 145 void init(void)
marcus255 9:36fc715eb54c 146 {
marcus255 10:39dd1d3508c3 147 i2c.frequency(I2C_FREQUENCY_STANDARD / 2);
marcus255 9:36fc715eb54c 148 i2c_ticker.attach(&write_and_read, 2.0f);
marcus255 9:36fc715eb54c 149 left_but.rise(&memory_routine);
marcus255 10:39dd1d3508c3 150 right_but.rise(&rtc_routine);
marcus255 9:36fc715eb54c 151 pc.baud(921600);
marcus255 9:36fc715eb54c 152 routine = MEMORY_ROUTINE;
marcus255 9:36fc715eb54c 153 memory_cell_addr = 0x00;
marcus255 9:36fc715eb54c 154 m_z=12434,m_w=33254;
marcus255 9:36fc715eb54c 155 }
mbed_official 0:f76c26307f9a 156
marcus255 9:36fc715eb54c 157 void memory_routine(void)
marcus255 9:36fc715eb54c 158 {
marcus255 9:36fc715eb54c 159 routine = MEMORY_ROUTINE;
marcus255 9:36fc715eb54c 160 }
marcus255 10:39dd1d3508c3 161 void rtc_routine(void)
marcus255 9:36fc715eb54c 162 {
marcus255 10:39dd1d3508c3 163 if (routine == SENSOR_ROUTINE)
marcus255 10:39dd1d3508c3 164 routine = TIME_ROUTINE;
marcus255 10:39dd1d3508c3 165 else
marcus255 10:39dd1d3508c3 166 routine = SENSOR_ROUTINE;
marcus255 9:36fc715eb54c 167 }
marcus255 4:1ec553356dcc 168
marcus255 9:36fc715eb54c 169 unsigned int rnd()
marcus255 9:36fc715eb54c 170 {
marcus255 9:36fc715eb54c 171 m_z = 36969 * (m_z & 65535) + (m_z >>16);
marcus255 9:36fc715eb54c 172 m_w = 18000 * (m_w & 65535) + (m_w >>16);
marcus255 9:36fc715eb54c 173 return ((m_z <<16) + m_w);
marcus255 10:39dd1d3508c3 174 }