program for I2C master device

Dependencies:   mbed

Fork of I2C_HelloWorld_Mbed by mbed official

main.cpp

Committer:
marcus255
Date:
2015-12-16
Revision:
8:3e6945d5d9a1
Parent:
7:b07706b16279
Child:
9:36fc715eb54c

File content as of revision 8:3e6945d5d9a1:

// I2C Master
#include "main.h"
 
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 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);
}

void get_temperature_raw(char* temperature)
{
    char reg_addr = TEMPERATURE_REGISTER;
    if(i2c.write(RTC_ADDR, &reg_addr, 1)) 
        pc.printf("Writing: Error\n\r");
    wait_ms(20);
    if(i2c.read(RTC_ADDR, temperature, 2))
        pc.printf("Reading: Error\n\r");
}

float proceed_temperature(char * temperature)
{
    char MSB = temperature[0]; // MSB is a signed int8 and carries temperature in accuracy 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(){
     //writing to slave
    int write_ack = i2c.write(SLAVE_ADDR, data, DATA_SIZE);
    if (!write_ack) {
        //i2c.stop();
        pc.printf("<Writing>    OK\n\r");
    }
    else 
        pc.printf("<Writing>    Error\n\r");
    //wait_ms(20);   
}

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;
    }
    //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);  
        
        }
    else 
        pc.printf("<Reading>    Error\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");

    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 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;
}