Marek Trojan
/
_8_KL46_M_simple_write
program for I2C master device
Fork of I2C_HelloWorld_Mbed by
main.cpp@10:39dd1d3508c3, 2015-12-25 (annotated)
- Committer:
- marcus255
- Date:
- Fri Dec 25 21:35:57 2015 +0000
- Revision:
- 10:39dd1d3508c3
- Parent:
- 9:36fc715eb54c
- Child:
- 11:eff597e2366e
Final version of I2C Master devices simulator
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
marcus255 | 10:39dd1d3508c3 | 1 | /* |
marcus255 | 10:39dd1d3508c3 | 2 | * Project: I2C to UART converter |
marcus255 | 10:39dd1d3508c3 | 3 | * File: main.cpp |
marcus255 | 10:39dd1d3508c3 | 4 | * Utility: simulating I2C Master devices |
marcus255 | 10:39dd1d3508c3 | 5 | * Author: Marek Trojan |
marcus255 | 10:39dd1d3508c3 | 6 | */ |
marcus255 | 10:39dd1d3508c3 | 7 | |
marcus255 | 4:1ec553356dcc | 8 | #include "main.h" |
marcus255 | 9:36fc715eb54c | 9 | |
marcus255 | 9:36fc715eb54c | 10 | int main() |
marcus255 | 9:36fc715eb54c | 11 | { |
marcus255 | 4:1ec553356dcc | 12 | init(); |
marcus255 | 8:3e6945d5d9a1 | 13 | wait_ms(1000); |
marcus255 | 4:1ec553356dcc | 14 | while (1) {} |
marcus255 | 4:1ec553356dcc | 15 | } |
mbed_official | 0:f76c26307f9a | 16 | |
marcus255 | 9:36fc715eb54c | 17 | void write_and_read() |
marcus255 | 9:36fc715eb54c | 18 | { |
marcus255 | 9:36fc715eb54c | 19 | if (routine == MEMORY_ROUTINE) { |
marcus255 | 9:36fc715eb54c | 20 | read_data(&memory_cell_addr); |
marcus255 | 10:39dd1d3508c3 | 21 | wait_ms(20); |
marcus255 | 10:39dd1d3508c3 | 22 | write_data(); |
marcus255 | 9:36fc715eb54c | 23 | memory_cell_addr+=0x10; |
marcus255 | 10:39dd1d3508c3 | 24 | } else if (routine == TIME_ROUTINE) { |
marcus255 | 10:39dd1d3508c3 | 25 | rtc_time(); |
marcus255 | 9:36fc715eb54c | 26 | } else if (routine == SENSOR_ROUTINE) { |
marcus255 | 9:36fc715eb54c | 27 | rtc_sensor(); |
marcus255 | 9:36fc715eb54c | 28 | } |
marcus255 | 9:36fc715eb54c | 29 | } |
marcus255 | 8:3e6945d5d9a1 | 30 | |
marcus255 | 8:3e6945d5d9a1 | 31 | void rtc_sensor() |
marcus255 | 8:3e6945d5d9a1 | 32 | { |
marcus255 | 8:3e6945d5d9a1 | 33 | char temperature[2]; |
marcus255 | 9:36fc715eb54c | 34 | if(get_temperature_raw(temperature)) { |
marcus255 | 9:36fc715eb54c | 35 | float result = proceed_temperature(temperature); |
marcus255 | 9:36fc715eb54c | 36 | pc.printf("> Temperature: %1.2f\n\r",result); |
marcus255 | 10:39dd1d3508c3 | 37 | wait_ms(1); |
marcus255 | 10:39dd1d3508c3 | 38 | } else { |
marcus255 | 10:39dd1d3508c3 | 39 | pc.printf("> I2C Error\n\r"); |
marcus255 | 10:39dd1d3508c3 | 40 | } |
marcus255 | 10:39dd1d3508c3 | 41 | } |
marcus255 | 10:39dd1d3508c3 | 42 | |
marcus255 | 10:39dd1d3508c3 | 43 | void rtc_time() |
marcus255 | 10:39dd1d3508c3 | 44 | { |
marcus255 | 10:39dd1d3508c3 | 45 | char time[3]; |
marcus255 | 10:39dd1d3508c3 | 46 | if(get_time_raw(time)) { |
marcus255 | 10:39dd1d3508c3 | 47 | uint8_t t[6]; |
marcus255 | 10:39dd1d3508c3 | 48 | proceed_time(time, t); |
marcus255 | 10:39dd1d3508c3 | 49 | pc.printf("> Time: %x%x:%x%x:%x%x\n\r", t[0], t[1], t[2], t[3], t[4], t[5]); |
marcus255 | 10:39dd1d3508c3 | 50 | wait_ms(1); |
marcus255 | 9:36fc715eb54c | 51 | } else { |
marcus255 | 9:36fc715eb54c | 52 | pc.printf("> I2C Error\n\r"); |
marcus255 | 9:36fc715eb54c | 53 | } |
marcus255 | 8:3e6945d5d9a1 | 54 | } |
marcus255 | 8:3e6945d5d9a1 | 55 | |
marcus255 | 9:36fc715eb54c | 56 | int get_temperature_raw(char* temperature) |
marcus255 | 8:3e6945d5d9a1 | 57 | { |
marcus255 | 8:3e6945d5d9a1 | 58 | char reg_addr = TEMPERATURE_REGISTER; |
marcus255 | 9:36fc715eb54c | 59 | if(i2c.write(RTC_ADDR, ®_addr, 1)) { |
marcus255 | 9:36fc715eb54c | 60 | //pc.printf("Writing: Error\n\r"); |
marcus255 | 9:36fc715eb54c | 61 | return 0; |
marcus255 | 9:36fc715eb54c | 62 | } |
marcus255 | 8:3e6945d5d9a1 | 63 | wait_ms(20); |
marcus255 | 9:36fc715eb54c | 64 | if(i2c.read(RTC_ADDR, temperature, 2)) { |
marcus255 | 9:36fc715eb54c | 65 | //pc.printf("Reading: Error\n\r"); |
marcus255 | 9:36fc715eb54c | 66 | return 0; |
marcus255 | 9:36fc715eb54c | 67 | } |
marcus255 | 9:36fc715eb54c | 68 | return 1; |
marcus255 | 8:3e6945d5d9a1 | 69 | } |
marcus255 | 8:3e6945d5d9a1 | 70 | |
marcus255 | 10:39dd1d3508c3 | 71 | int get_time_raw(char* time) |
marcus255 | 10:39dd1d3508c3 | 72 | { |
marcus255 | 10:39dd1d3508c3 | 73 | char reg_addr = TIME_REGISTER; |
marcus255 | 10:39dd1d3508c3 | 74 | if(i2c.write(RTC_ADDR, ®_addr, 1)) { |
marcus255 | 10:39dd1d3508c3 | 75 | return 0; |
marcus255 | 10:39dd1d3508c3 | 76 | } |
marcus255 | 10:39dd1d3508c3 | 77 | wait_ms(20); |
marcus255 | 10:39dd1d3508c3 | 78 | if(i2c.read(RTC_ADDR, time, 3)) { |
marcus255 | 10:39dd1d3508c3 | 79 | return 0; |
marcus255 | 10:39dd1d3508c3 | 80 | } |
marcus255 | 10:39dd1d3508c3 | 81 | return 1; |
marcus255 | 10:39dd1d3508c3 | 82 | } |
marcus255 | 10:39dd1d3508c3 | 83 | |
marcus255 | 8:3e6945d5d9a1 | 84 | float proceed_temperature(char * temperature) |
marcus255 | 8:3e6945d5d9a1 | 85 | { |
marcus255 | 9:36fc715eb54c | 86 | char MSB = temperature[0]; // MSB is a signed int8 and carries temperature in accuracy of 1 Celsius degree |
marcus255 | 8:3e6945d5d9a1 | 87 | char LSB = temperature[1]; // LSB carries fraction part of temperature. Possible values are 0, 0.25, 0.5, 0.75 |
marcus255 | 8:3e6945d5d9a1 | 88 | float high = (float)MSB; |
marcus255 | 8:3e6945d5d9a1 | 89 | float low = ((float)((uint8_t)LSB >> 6) * 0.25f); |
marcus255 | 8:3e6945d5d9a1 | 90 | return high + low; |
marcus255 | 8:3e6945d5d9a1 | 91 | } |
marcus255 | 8:3e6945d5d9a1 | 92 | |
marcus255 | 10:39dd1d3508c3 | 93 | void proceed_time(char * time, uint8_t * tiny_time) |
marcus255 | 10:39dd1d3508c3 | 94 | { |
marcus255 | 10:39dd1d3508c3 | 95 | char secs = time[0]; |
marcus255 | 10:39dd1d3508c3 | 96 | char mins = time[1]; |
marcus255 | 10:39dd1d3508c3 | 97 | char hrs = time[2]; |
marcus255 | 10:39dd1d3508c3 | 98 | |
marcus255 | 10:39dd1d3508c3 | 99 | *(tiny_time + 0) = ((hrs >> 4) & 0x01); |
marcus255 | 10:39dd1d3508c3 | 100 | *(tiny_time + 1) = (hrs & 0x0F); |
marcus255 | 10:39dd1d3508c3 | 101 | *(tiny_time + 2) = ((mins >> 4) & 0x0F); |
marcus255 | 10:39dd1d3508c3 | 102 | *(tiny_time + 3) = (mins & 0x0F); |
marcus255 | 10:39dd1d3508c3 | 103 | *(tiny_time + 4) = ((secs >> 4) & 0x0F); |
marcus255 | 10:39dd1d3508c3 | 104 | *(tiny_time + 5) = (secs & 0x0F); |
marcus255 | 10:39dd1d3508c3 | 105 | } |
marcus255 | 10:39dd1d3508c3 | 106 | |
marcus255 | 5:8dc6d7d81250 | 107 | |
marcus255 | 9:36fc715eb54c | 108 | void write_data() |
marcus255 | 9:36fc715eb54c | 109 | { |
marcus255 | 10:39dd1d3508c3 | 110 | srand(time(NULL)); |
marcus255 | 9:36fc715eb54c | 111 | for (uint8_t i = 0; i < DATA_SIZE; i++) { |
marcus255 | 9:36fc715eb54c | 112 | data[i+1] = (char) (rnd() % 90 + 33); |
marcus255 | 4:1ec553356dcc | 113 | } |
marcus255 | 9:36fc715eb54c | 114 | data[0] = memory_cell_addr; |
marcus255 | 10:39dd1d3508c3 | 115 | if (i2c.write(EEPROM_ADDRESS, data, DATA_SIZE + 1)) { |
marcus255 | 9:36fc715eb54c | 116 | pc.printf("> Writing: Error\n\r"); |
marcus255 | 9:36fc715eb54c | 117 | } else { |
marcus255 | 9:36fc715eb54c | 118 | pc.printf("> Writing: OK\n\r"); |
marcus255 | 9:36fc715eb54c | 119 | } |
marcus255 | 9:36fc715eb54c | 120 | |
marcus255 | 5:8dc6d7d81250 | 121 | } |
marcus255 | 5:8dc6d7d81250 | 122 | |
marcus255 | 9:36fc715eb54c | 123 | void read_data(char* cell_addr) |
marcus255 | 9:36fc715eb54c | 124 | { |
marcus255 | 9:36fc715eb54c | 125 | int success = 1; |
marcus255 | 9:36fc715eb54c | 126 | char fromSlave[DATA_SIZE + 1]; |
marcus255 | 9:36fc715eb54c | 127 | fromSlave[DATA_SIZE] = '\0'; |
marcus255 | 10:39dd1d3508c3 | 128 | if(i2c.write(EEPROM_ADDRESS, cell_addr, 1)) { |
marcus255 | 9:36fc715eb54c | 129 | success = 0; |
marcus255 | 7:b07706b16279 | 130 | } |
marcus255 | 9:36fc715eb54c | 131 | wait_ms(20); |
marcus255 | 9:36fc715eb54c | 132 | if (success) { |
marcus255 | 10:39dd1d3508c3 | 133 | if(i2c.read(EEPROM_ADDRESS, fromSlave, DATA_SIZE)) { |
marcus255 | 9:36fc715eb54c | 134 | //pc.printf("Reading: Error\n\r"); |
marcus255 | 9:36fc715eb54c | 135 | success = 0; |
marcus255 | 5:8dc6d7d81250 | 136 | } |
marcus255 | 9:36fc715eb54c | 137 | } |
marcus255 | 9:36fc715eb54c | 138 | if (success) { |
marcus255 | 10:39dd1d3508c3 | 139 | pc.printf("> Reading: OK, data at 0x%x is: %s\n\r", *cell_addr, fromSlave); |
marcus255 | 9:36fc715eb54c | 140 | } else { |
marcus255 | 10:39dd1d3508c3 | 141 | pc.printf("> Reading: Error\n\r"); |
marcus255 | 9:36fc715eb54c | 142 | } |
marcus255 | 5:8dc6d7d81250 | 143 | } |
marcus255 | 9:36fc715eb54c | 144 | |
marcus255 | 9:36fc715eb54c | 145 | void init(void) |
marcus255 | 9:36fc715eb54c | 146 | { |
marcus255 | 10:39dd1d3508c3 | 147 | i2c.frequency(I2C_FREQUENCY_STANDARD / 2); |
marcus255 | 9:36fc715eb54c | 148 | i2c_ticker.attach(&write_and_read, 2.0f); |
marcus255 | 9:36fc715eb54c | 149 | left_but.rise(&memory_routine); |
marcus255 | 10:39dd1d3508c3 | 150 | right_but.rise(&rtc_routine); |
marcus255 | 9:36fc715eb54c | 151 | pc.baud(921600); |
marcus255 | 9:36fc715eb54c | 152 | routine = MEMORY_ROUTINE; |
marcus255 | 9:36fc715eb54c | 153 | memory_cell_addr = 0x00; |
marcus255 | 9:36fc715eb54c | 154 | m_z=12434,m_w=33254; |
marcus255 | 9:36fc715eb54c | 155 | } |
mbed_official | 0:f76c26307f9a | 156 | |
marcus255 | 9:36fc715eb54c | 157 | void memory_routine(void) |
marcus255 | 9:36fc715eb54c | 158 | { |
marcus255 | 9:36fc715eb54c | 159 | routine = MEMORY_ROUTINE; |
marcus255 | 9:36fc715eb54c | 160 | } |
marcus255 | 10:39dd1d3508c3 | 161 | void rtc_routine(void) |
marcus255 | 9:36fc715eb54c | 162 | { |
marcus255 | 10:39dd1d3508c3 | 163 | if (routine == SENSOR_ROUTINE) |
marcus255 | 10:39dd1d3508c3 | 164 | routine = TIME_ROUTINE; |
marcus255 | 10:39dd1d3508c3 | 165 | else |
marcus255 | 10:39dd1d3508c3 | 166 | routine = SENSOR_ROUTINE; |
marcus255 | 9:36fc715eb54c | 167 | } |
marcus255 | 4:1ec553356dcc | 168 | |
marcus255 | 9:36fc715eb54c | 169 | unsigned int rnd() |
marcus255 | 9:36fc715eb54c | 170 | { |
marcus255 | 9:36fc715eb54c | 171 | m_z = 36969 * (m_z & 65535) + (m_z >>16); |
marcus255 | 9:36fc715eb54c | 172 | m_w = 18000 * (m_w & 65535) + (m_w >>16); |
marcus255 | 9:36fc715eb54c | 173 | return ((m_z <<16) + m_w); |
marcus255 | 10:39dd1d3508c3 | 174 | } |