program for I2C master device

Dependencies:   mbed

Fork of I2C_HelloWorld_Mbed by mbed official

Revision:
10:39dd1d3508c3
Parent:
9:36fc715eb54c
Child:
11:eff597e2366e
--- a/main.cpp	Thu Dec 17 23:04:29 2015 +0000
+++ b/main.cpp	Fri Dec 25 21:35:57 2015 +0000
@@ -1,4 +1,10 @@
-// I2C Master
+/*
+* Project: I2C to UART converter
+* File: main.cpp
+* Utility: simulating I2C Master devices
+* Author: Marek Trojan
+*/
+
 #include "main.h"
 
 int main()
@@ -11,10 +17,12 @@
 void write_and_read()
 {
     if (routine == MEMORY_ROUTINE) {
-        write_data();
-        wait_ms(20);
         read_data(&memory_cell_addr);
+        wait_ms(20); 
+        write_data();  
         memory_cell_addr+=0x10;
+    } else if (routine == TIME_ROUTINE) {
+        rtc_time();
     } else if (routine == SENSOR_ROUTINE) {
         rtc_sensor();
     }
@@ -26,7 +34,20 @@
     if(get_temperature_raw(temperature)) {
         float result = proceed_temperature(temperature);
         pc.printf("> Temperature: %1.2f\n\r",result);
-        wait_ms(5);
+        wait_ms(1);
+    } else {
+        pc.printf("> I2C Error\n\r");
+    }
+}
+
+void rtc_time()
+{
+    char time[3];
+    if(get_time_raw(time)) {
+        uint8_t t[6];
+        proceed_time(time, t);
+        pc.printf("> Time: %x%x:%x%x:%x%x\n\r", t[0], t[1], t[2], t[3], t[4], t[5]);
+        wait_ms(1);
     } else {
         pc.printf("> I2C Error\n\r");
     }
@@ -47,6 +68,19 @@
     return 1;
 }
 
+int get_time_raw(char* time)
+{
+    char reg_addr = TIME_REGISTER;
+    if(i2c.write(RTC_ADDR, &reg_addr, 1)) {
+        return 0;
+    }
+    wait_ms(20);
+    if(i2c.read(RTC_ADDR, time, 3)) {
+        return 0;
+    }
+    return 1;
+}
+
 float proceed_temperature(char * temperature)
 {
     char MSB = temperature[0]; // MSB is a signed int8 and carries temperature in accuracy of 1 Celsius degree
@@ -56,14 +90,29 @@
     return high + low;
 }
 
+void proceed_time(char * time, uint8_t * tiny_time)
+{
+    char secs = time[0];
+    char mins = time[1];
+    char hrs  = time[2];
+
+    *(tiny_time + 0) = ((hrs  >> 4) & 0x01);
+    *(tiny_time + 1) = (hrs  & 0x0F);
+    *(tiny_time + 2) = ((mins >> 4) & 0x0F);
+    *(tiny_time + 3) = (mins & 0x0F);
+    *(tiny_time + 4) = ((secs >> 4) & 0x0F);
+    *(tiny_time + 5) = (secs & 0x0F);
+}
+
 
 void write_data()
 {
+    srand(time(NULL)); 
     for (uint8_t i = 0; i < DATA_SIZE; i++) {
         data[i+1] = (char) (rnd() % 90 + 33);
     }
     data[0] = memory_cell_addr;
-    if (i2c.write(SLAVE_ADDR, data, DATA_SIZE + 1)) {
+    if (i2c.write(EEPROM_ADDRESS, data, DATA_SIZE + 1)) {
         pc.printf("> Writing: Error\n\r");
     } else {
         pc.printf("> Writing: OK\n\r");
@@ -76,29 +125,29 @@
     int success = 1;
     char fromSlave[DATA_SIZE + 1];
     fromSlave[DATA_SIZE] = '\0';
-    if(i2c.write(SLAVE_ADDR, cell_addr, 1)) {
+    if(i2c.write(EEPROM_ADDRESS, cell_addr, 1)) {
         success = 0;
     }
     wait_ms(20);
     if (success) {
-        if(i2c.read(SLAVE_ADDR, fromSlave, DATA_SIZE)) {
+        if(i2c.read(EEPROM_ADDRESS, fromSlave, DATA_SIZE)) {
             //pc.printf("Reading: Error\n\r");
             success = 0;
         }
     }
     if (success) {
-        pc.printf("> Reading: OK, data at %#x is: %s\n\n\r", *cell_addr, fromSlave);
+        pc.printf("> Reading: OK, data at 0x%x is: %s\n\r", *cell_addr, fromSlave);
     } else {
-        pc.printf("> Reading: Error\n\n\r");
+        pc.printf("> Reading: Error\n\r");
     }
 }
 
 void init(void)
 {
-    i2c.frequency(50000);
+    i2c.frequency(I2C_FREQUENCY_STANDARD / 2);
     i2c_ticker.attach(&write_and_read, 2.0f);
     left_but.rise(&memory_routine);
-    right_but.rise(&sensor_routine);
+    right_but.rise(&rtc_routine);
     pc.baud(921600);
     routine = MEMORY_ROUTINE;
     memory_cell_addr = 0x00;
@@ -109,16 +158,17 @@
 {
     routine = MEMORY_ROUTINE;
 }
-void sensor_routine(void)
+void rtc_routine(void)
 {
-    routine = SENSOR_ROUTINE;
+    if (routine == SENSOR_ROUTINE)
+        routine = TIME_ROUTINE;
+    else
+        routine = SENSOR_ROUTINE;
 }
 
-
-
 unsigned int rnd()
 {
     m_z = 36969 * (m_z & 65535) + (m_z >>16);
     m_w = 18000 * (m_w & 65535) + (m_w >>16);
     return ((m_z <<16) + m_w);
-}
+}
\ No newline at end of file