program for I2C master device

Dependencies:   mbed

Fork of I2C_HelloWorld_Mbed by mbed official

main.cpp

Committer:
marcus255
Date:
2015-12-17
Revision:
9:36fc715eb54c
Parent:
8:3e6945d5d9a1
Child:
10:39dd1d3508c3

File content as of revision 9:36fc715eb54c:

// I2C Master
#include "main.h"

int main()
{
    init();
    wait_ms(1000);
    while (1) {}
}

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];
    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");
    }
}

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");
        return 0;
    }
    wait_ms(20);
    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 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);
    return high + low;
}


void write_data()
{
    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)) {
        pc.printf("> Writing: Error\n\r");
    } else {
        pc.printf("> Writing: OK\n\r");
    }

}

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(20);
    if (success) {
        if(i2c.read(SLAVE_ADDR, 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);
    } else {
        pc.printf("> Reading: Error\n\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;
}

void memory_routine(void)
{
    routine = MEMORY_ROUTINE;
}
void sensor_routine(void)
{
    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);
}