program for I2C master device

Dependencies:   mbed

Fork of I2C_HelloWorld_Mbed by mbed official

Revision:
9:36fc715eb54c
Parent:
8:3e6945d5d9a1
Child:
10:39dd1d3508c3
--- a/main.cpp	Wed Dec 16 19:42:37 2015 +0000
+++ b/main.cpp	Thu Dec 17 23:04:29 2015 +0000
@@ -1,43 +1,55 @@
 // I2C Master
 #include "main.h"
- 
-int main() {
+
+int main()
+{
     init();
     wait_ms(1000);
     while (1) {}
 }
 
-void write_and_read(){
-   /* write_data();    
-    wait_ms(20);
-    char regaddr = 0x24;
-    read_data(&regaddr); // works OK (pure read, without pointer setting)*/
-   
-    rtc_sensor();
-}  
+void write_and_read()
+{
+    if (routine == MEMORY_ROUTINE) {
+        write_data();
+        wait_ms(20);
+        read_data(&memory_cell_addr);
+        memory_cell_addr+=0x10;
+    } else if (routine == SENSOR_ROUTINE) {
+        rtc_sensor();
+    }
+}
 
 void rtc_sensor()
 {
     char temperature[2];
-    get_temperature_raw(temperature);
-    float result = proceed_temperature(temperature);
-    pc.printf("<Temperature: %1.2f\n\r",result);
-    wait_ms(20);
+    if(get_temperature_raw(temperature)) {
+        float result = proceed_temperature(temperature);
+        pc.printf("> Temperature: %1.2f\n\r",result);
+        wait_ms(5);
+    } else {
+        pc.printf("> I2C Error\n\r");
+    }
 }
 
-void get_temperature_raw(char* temperature)
+int get_temperature_raw(char* temperature)
 {
     char reg_addr = TEMPERATURE_REGISTER;
-    if(i2c.write(RTC_ADDR, &reg_addr, 1)) 
-        pc.printf("Writing: Error\n\r");
+    if(i2c.write(RTC_ADDR, &reg_addr, 1)) {
+        //pc.printf("Writing: Error\n\r");
+        return 0;
+    }
     wait_ms(20);
-    if(i2c.read(RTC_ADDR, temperature, 2))
-        pc.printf("Reading: Error\n\r");
+    if(i2c.read(RTC_ADDR, temperature, 2)) {
+        //pc.printf("Reading: Error\n\r");
+        return 0;
+    }
+    return 1;
 }
 
 float proceed_temperature(char * temperature)
 {
-    char MSB = temperature[0]; // MSB is a signed int8 and carries temperature in accuracy 1 Celsius degree
+    char MSB = temperature[0]; // MSB is a signed int8 and carries temperature in accuracy of 1 Celsius degree
     char LSB = temperature[1]; // LSB carries fraction part of temperature. Possible values are 0, 0.25, 0.5, 0.75
     float high = (float)MSB;
     float low = ((float)((uint8_t)LSB >> 6) * 0.25f);
@@ -45,73 +57,68 @@
 }
 
 
-void write_data(){
-     //writing to slave
-    int write_ack = i2c.write(SLAVE_ADDR, data, DATA_SIZE);
-    if (!write_ack) {
-        //i2c.stop();
-        pc.printf("<Writing>    OK\n\r");
+void write_data()
+{
+    for (uint8_t i = 0; i < DATA_SIZE; i++) {
+        data[i+1] = (char) (rnd() % 90 + 33);
     }
-    else 
-        pc.printf("<Writing>    Error\n\r");
-    //wait_ms(20);   
+    data[0] = memory_cell_addr;
+    if (i2c.write(SLAVE_ADDR, data, DATA_SIZE + 1)) {
+        pc.printf("> Writing: Error\n\r");
+    } else {
+        pc.printf("> Writing: OK\n\r");
+    }
+
 }
 
-void read_data(char* cell_addr){     
-    /*int write_ack = i2c.write(SLAVE_ADDR, cell_addr, 1);
-    if (!write_ack) {
-        //i2c.stop();
-        pc.printf("<Addressing> OK\n\r");
-    }
-    else {
-        pc.printf("<Addressing> Error\n\r");
-        return;
+void read_data(char* cell_addr)
+{
+    int success = 1;
+    char fromSlave[DATA_SIZE + 1];
+    fromSlave[DATA_SIZE] = '\0';
+    if(i2c.write(SLAVE_ADDR, cell_addr, 1)) {
+        success = 0;
     }
-    //wait_ms(5);   
-    */
-    //reading from slave
-    char fromSlave[DATA_SIZE + 1];
-    int read_ack = i2c.read(SLAVE_ADDR, fromSlave, DATA_SIZE);
-    if (!read_ack) {
-        //i2c.stop();
-        pc.printf("<Reading>    OK\n\r");
-        fromSlave[DATA_SIZE] = '\0';
-        pc.printf("Data from Slave: %s\n\n\r", fromSlave);  
-        
+    wait_ms(20);
+    if (success) {
+        if(i2c.read(SLAVE_ADDR, fromSlave, DATA_SIZE)) {
+            //pc.printf("Reading: Error\n\r");
+            success = 0;
         }
-    else 
-        pc.printf("<Reading>    Error\n\r");   
+    }
+    if (success) {
+        pc.printf("> Reading: OK, data at %#x is: %s\n\n\r", *cell_addr, fromSlave);
+    } else {
+        pc.printf("> Reading: Error\n\n\r");
+    }
 }
-  
-/*
-void i2cReadWrite(void){
-    for(int a = 0; a < MSG_SIZE; a++) fromSlave[a] = 0;
-    
-    int ack = i2c.write(SLAVE_ADDR, data, strlen(data));
-    if (!ack) 
-        pc.printf("data send to slave\n\r");
-    else 
-        pc.printf("NACK!\n\r");
+
+void init(void)
+{
+    i2c.frequency(50000);
+    i2c_ticker.attach(&write_and_read, 2.0f);
+    left_but.rise(&memory_routine);
+    right_but.rise(&sensor_routine);
+    pc.baud(921600);
+    routine = MEMORY_ROUTINE;
+    memory_cell_addr = 0x00;
+    m_z=12434,m_w=33254;
+}
 
-    wait(0.1);
-    
-    int read_ack = i2c.read(SLAVE_ADDR, fromSlave, MSG_SIZE - 1);
-    if (!read_ack) 
-        pc.printf("data received from slave\n\r");
-    else 
-        pc.printf("data not received\n\r");
-        
-    pc.printf("Data from Slave: %s\n\r", fromSlave); 
-    
-    for(int y = 0; y < 32; y++) fromSlave[y]='x';   
-}*/
+void memory_routine(void)
+{
+    routine = MEMORY_ROUTINE;
+}
+void sensor_routine(void)
+{
+    routine = SENSOR_ROUTINE;
+}
 
-void init(void){
-    i2c.frequency(100000);
-    i2c_ticker.attach(&write_and_read, 2.0f);
-    pc.baud(921600);
-    //pc.printf("Master says: Hello World!\n\r");
-    for (uint8_t i = 0; i < DATA_SIZE; i++)
-        data[i] = i+65;
-    //data[0]=0;
-}
\ No newline at end of file
+
+
+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);
+}