program for I2C master device

Dependencies:   mbed

Fork of I2C_HelloWorld_Mbed by mbed official

Committer:
marcus255
Date:
Wed Dec 16 19:42:37 2015 +0000
Revision:
8:3e6945d5d9a1
Parent:
7:b07706b16279
Child:
9:36fc715eb54c
Reading/Writting EEPROM works fine, Reading/Writting works fine when temperature sensor connected to the i2c bus. Device addresses must be hardcoded for now.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcus255 4:1ec553356dcc 1 // I2C Master
marcus255 4:1ec553356dcc 2 #include "main.h"
mbed_official 0:f76c26307f9a 3
marcus255 4:1ec553356dcc 4 int main() {
marcus255 4:1ec553356dcc 5 init();
marcus255 8:3e6945d5d9a1 6 wait_ms(1000);
marcus255 4:1ec553356dcc 7 while (1) {}
marcus255 4:1ec553356dcc 8 }
mbed_official 0:f76c26307f9a 9
marcus255 5:8dc6d7d81250 10 void write_and_read(){
marcus255 8:3e6945d5d9a1 11 /* write_data();
marcus255 5:8dc6d7d81250 12 wait_ms(20);
marcus255 7:b07706b16279 13 char regaddr = 0x24;
marcus255 8:3e6945d5d9a1 14 read_data(&regaddr); // works OK (pure read, without pointer setting)*/
marcus255 8:3e6945d5d9a1 15
marcus255 8:3e6945d5d9a1 16 rtc_sensor();
marcus255 8:3e6945d5d9a1 17 }
marcus255 8:3e6945d5d9a1 18
marcus255 8:3e6945d5d9a1 19 void rtc_sensor()
marcus255 8:3e6945d5d9a1 20 {
marcus255 8:3e6945d5d9a1 21 char temperature[2];
marcus255 8:3e6945d5d9a1 22 get_temperature_raw(temperature);
marcus255 8:3e6945d5d9a1 23 float result = proceed_temperature(temperature);
marcus255 8:3e6945d5d9a1 24 pc.printf("<Temperature: %1.2f\n\r",result);
marcus255 7:b07706b16279 25 wait_ms(20);
marcus255 8:3e6945d5d9a1 26 }
marcus255 8:3e6945d5d9a1 27
marcus255 8:3e6945d5d9a1 28 void get_temperature_raw(char* temperature)
marcus255 8:3e6945d5d9a1 29 {
marcus255 8:3e6945d5d9a1 30 char reg_addr = TEMPERATURE_REGISTER;
marcus255 8:3e6945d5d9a1 31 if(i2c.write(RTC_ADDR, &reg_addr, 1))
marcus255 8:3e6945d5d9a1 32 pc.printf("Writing: Error\n\r");
marcus255 8:3e6945d5d9a1 33 wait_ms(20);
marcus255 8:3e6945d5d9a1 34 if(i2c.read(RTC_ADDR, temperature, 2))
marcus255 8:3e6945d5d9a1 35 pc.printf("Reading: Error\n\r");
marcus255 8:3e6945d5d9a1 36 }
marcus255 8:3e6945d5d9a1 37
marcus255 8:3e6945d5d9a1 38 float proceed_temperature(char * temperature)
marcus255 8:3e6945d5d9a1 39 {
marcus255 8:3e6945d5d9a1 40 char MSB = temperature[0]; // MSB is a signed int8 and carries temperature in accuracy 1 Celsius degree
marcus255 8:3e6945d5d9a1 41 char LSB = temperature[1]; // LSB carries fraction part of temperature. Possible values are 0, 0.25, 0.5, 0.75
marcus255 8:3e6945d5d9a1 42 float high = (float)MSB;
marcus255 8:3e6945d5d9a1 43 float low = ((float)((uint8_t)LSB >> 6) * 0.25f);
marcus255 8:3e6945d5d9a1 44 return high + low;
marcus255 8:3e6945d5d9a1 45 }
marcus255 8:3e6945d5d9a1 46
marcus255 5:8dc6d7d81250 47
marcus255 5:8dc6d7d81250 48 void write_data(){
marcus255 5:8dc6d7d81250 49 //writing to slave
marcus255 7:b07706b16279 50 int write_ack = i2c.write(SLAVE_ADDR, data, DATA_SIZE);
marcus255 4:1ec553356dcc 51 if (!write_ack) {
marcus255 7:b07706b16279 52 //i2c.stop();
marcus255 7:b07706b16279 53 pc.printf("<Writing> OK\n\r");
marcus255 4:1ec553356dcc 54 }
marcus255 4:1ec553356dcc 55 else
marcus255 7:b07706b16279 56 pc.printf("<Writing> Error\n\r");
marcus255 5:8dc6d7d81250 57 //wait_ms(20);
marcus255 5:8dc6d7d81250 58 }
marcus255 5:8dc6d7d81250 59
marcus255 7:b07706b16279 60 void read_data(char* cell_addr){
marcus255 7:b07706b16279 61 /*int write_ack = i2c.write(SLAVE_ADDR, cell_addr, 1);
marcus255 7:b07706b16279 62 if (!write_ack) {
marcus255 7:b07706b16279 63 //i2c.stop();
marcus255 7:b07706b16279 64 pc.printf("<Addressing> OK\n\r");
marcus255 7:b07706b16279 65 }
marcus255 7:b07706b16279 66 else {
marcus255 7:b07706b16279 67 pc.printf("<Addressing> Error\n\r");
marcus255 7:b07706b16279 68 return;
marcus255 7:b07706b16279 69 }
marcus255 7:b07706b16279 70 //wait_ms(5);
marcus255 7:b07706b16279 71 */
marcus255 4:1ec553356dcc 72 //reading from slave
marcus255 7:b07706b16279 73 char fromSlave[DATA_SIZE + 1];
marcus255 7:b07706b16279 74 int read_ack = i2c.read(SLAVE_ADDR, fromSlave, DATA_SIZE);
marcus255 5:8dc6d7d81250 75 if (!read_ack) {
marcus255 7:b07706b16279 76 //i2c.stop();
marcus255 7:b07706b16279 77 pc.printf("<Reading> OK\n\r");
marcus255 7:b07706b16279 78 fromSlave[DATA_SIZE] = '\0';
marcus255 5:8dc6d7d81250 79 pc.printf("Data from Slave: %s\n\n\r", fromSlave);
marcus255 7:b07706b16279 80
marcus255 5:8dc6d7d81250 81 }
marcus255 4:1ec553356dcc 82 else
marcus255 7:b07706b16279 83 pc.printf("<Reading> Error\n\r");
marcus255 5:8dc6d7d81250 84 }
marcus255 5:8dc6d7d81250 85
marcus255 4:1ec553356dcc 86 /*
marcus255 4:1ec553356dcc 87 void i2cReadWrite(void){
marcus255 4:1ec553356dcc 88 for(int a = 0; a < MSG_SIZE; a++) fromSlave[a] = 0;
marcus255 4:1ec553356dcc 89
marcus255 4:1ec553356dcc 90 int ack = i2c.write(SLAVE_ADDR, data, strlen(data));
marcus255 4:1ec553356dcc 91 if (!ack)
marcus255 4:1ec553356dcc 92 pc.printf("data send to slave\n\r");
marcus255 4:1ec553356dcc 93 else
marcus255 4:1ec553356dcc 94 pc.printf("NACK!\n\r");
mbed_official 0:f76c26307f9a 95
marcus255 4:1ec553356dcc 96 wait(0.1);
marcus255 4:1ec553356dcc 97
marcus255 4:1ec553356dcc 98 int read_ack = i2c.read(SLAVE_ADDR, fromSlave, MSG_SIZE - 1);
marcus255 4:1ec553356dcc 99 if (!read_ack)
marcus255 4:1ec553356dcc 100 pc.printf("data received from slave\n\r");
marcus255 4:1ec553356dcc 101 else
marcus255 4:1ec553356dcc 102 pc.printf("data not received\n\r");
marcus255 4:1ec553356dcc 103
marcus255 4:1ec553356dcc 104 pc.printf("Data from Slave: %s\n\r", fromSlave);
marcus255 4:1ec553356dcc 105
marcus255 4:1ec553356dcc 106 for(int y = 0; y < 32; y++) fromSlave[y]='x';
marcus255 4:1ec553356dcc 107 }*/
marcus255 4:1ec553356dcc 108
marcus255 4:1ec553356dcc 109 void init(void){
marcus255 4:1ec553356dcc 110 i2c.frequency(100000);
marcus255 5:8dc6d7d81250 111 i2c_ticker.attach(&write_and_read, 2.0f);
marcus255 4:1ec553356dcc 112 pc.baud(921600);
marcus255 7:b07706b16279 113 //pc.printf("Master says: Hello World!\n\r");
marcus255 4:1ec553356dcc 114 for (uint8_t i = 0; i < DATA_SIZE; i++)
marcus255 5:8dc6d7d81250 115 data[i] = i+65;
marcus255 7:b07706b16279 116 //data[0]=0;
mbed_official 0:f76c26307f9a 117 }