Marek Trojan
/
_8_KL46_M_simple_write
program for I2C master device
Fork of I2C_HelloWorld_Mbed by
main.cpp@8:3e6945d5d9a1, 2015-12-16 (annotated)
- 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?
User | Revision | Line number | New 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(®addr); // 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, ®_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 | } |