Marek Trojan
/
_8_KL46_M_simple_write
program for I2C master device
Fork of I2C_HelloWorld_Mbed by
Diff: main.cpp
- Revision:
- 10:39dd1d3508c3
- Parent:
- 9:36fc715eb54c
- Child:
- 11:eff597e2366e
--- a/main.cpp Thu Dec 17 23:04:29 2015 +0000 +++ b/main.cpp Fri Dec 25 21:35:57 2015 +0000 @@ -1,4 +1,10 @@ -// I2C Master +/* +* Project: I2C to UART converter +* File: main.cpp +* Utility: simulating I2C Master devices +* Author: Marek Trojan +*/ + #include "main.h" int main() @@ -11,10 +17,12 @@ void write_and_read() { if (routine == MEMORY_ROUTINE) { - write_data(); - wait_ms(20); read_data(&memory_cell_addr); + wait_ms(20); + write_data(); memory_cell_addr+=0x10; + } else if (routine == TIME_ROUTINE) { + rtc_time(); } else if (routine == SENSOR_ROUTINE) { rtc_sensor(); } @@ -26,7 +34,20 @@ if(get_temperature_raw(temperature)) { float result = proceed_temperature(temperature); pc.printf("> Temperature: %1.2f\n\r",result); - wait_ms(5); + wait_ms(1); + } else { + pc.printf("> I2C Error\n\r"); + } +} + +void rtc_time() +{ + char time[3]; + if(get_time_raw(time)) { + uint8_t t[6]; + proceed_time(time, t); + pc.printf("> Time: %x%x:%x%x:%x%x\n\r", t[0], t[1], t[2], t[3], t[4], t[5]); + wait_ms(1); } else { pc.printf("> I2C Error\n\r"); } @@ -47,6 +68,19 @@ return 1; } +int get_time_raw(char* time) +{ + char reg_addr = TIME_REGISTER; + if(i2c.write(RTC_ADDR, ®_addr, 1)) { + return 0; + } + wait_ms(20); + if(i2c.read(RTC_ADDR, time, 3)) { + 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 @@ -56,14 +90,29 @@ return high + low; } +void proceed_time(char * time, uint8_t * tiny_time) +{ + char secs = time[0]; + char mins = time[1]; + char hrs = time[2]; + + *(tiny_time + 0) = ((hrs >> 4) & 0x01); + *(tiny_time + 1) = (hrs & 0x0F); + *(tiny_time + 2) = ((mins >> 4) & 0x0F); + *(tiny_time + 3) = (mins & 0x0F); + *(tiny_time + 4) = ((secs >> 4) & 0x0F); + *(tiny_time + 5) = (secs & 0x0F); +} + void write_data() { + srand(time(NULL)); 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)) { + if (i2c.write(EEPROM_ADDRESS, data, DATA_SIZE + 1)) { pc.printf("> Writing: Error\n\r"); } else { pc.printf("> Writing: OK\n\r"); @@ -76,29 +125,29 @@ int success = 1; char fromSlave[DATA_SIZE + 1]; fromSlave[DATA_SIZE] = '\0'; - if(i2c.write(SLAVE_ADDR, cell_addr, 1)) { + if(i2c.write(EEPROM_ADDRESS, cell_addr, 1)) { success = 0; } wait_ms(20); if (success) { - if(i2c.read(SLAVE_ADDR, fromSlave, DATA_SIZE)) { + if(i2c.read(EEPROM_ADDRESS, 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); + pc.printf("> Reading: OK, data at 0x%x is: %s\n\r", *cell_addr, fromSlave); } else { - pc.printf("> Reading: Error\n\n\r"); + pc.printf("> Reading: Error\n\r"); } } void init(void) { - i2c.frequency(50000); + i2c.frequency(I2C_FREQUENCY_STANDARD / 2); i2c_ticker.attach(&write_and_read, 2.0f); left_but.rise(&memory_routine); - right_but.rise(&sensor_routine); + right_but.rise(&rtc_routine); pc.baud(921600); routine = MEMORY_ROUTINE; memory_cell_addr = 0x00; @@ -109,16 +158,17 @@ { routine = MEMORY_ROUTINE; } -void sensor_routine(void) +void rtc_routine(void) { - routine = SENSOR_ROUTINE; + if (routine == SENSOR_ROUTINE) + routine = TIME_ROUTINE; + else + 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); -} +} \ No newline at end of file