Marek Trojan
/
_8_KL46_M_simple_write
program for I2C master device
Fork of I2C_HelloWorld_Mbed by
main.cpp
- Committer:
- marcus255
- Date:
- 2015-12-17
- Revision:
- 9:36fc715eb54c
- Parent:
- 8:3e6945d5d9a1
- Child:
- 10:39dd1d3508c3
File content as of revision 9:36fc715eb54c:
// I2C Master #include "main.h" int main() { init(); wait_ms(1000); while (1) {} } void write_and_read() { if (routine == MEMORY_ROUTINE) { write_data(); wait_ms(20); read_data(&memory_cell_addr); memory_cell_addr+=0x10; } else if (routine == SENSOR_ROUTINE) { rtc_sensor(); } } void rtc_sensor() { char temperature[2]; if(get_temperature_raw(temperature)) { float result = proceed_temperature(temperature); pc.printf("> Temperature: %1.2f\n\r",result); wait_ms(5); } else { pc.printf("> I2C Error\n\r"); } } int get_temperature_raw(char* temperature) { char reg_addr = TEMPERATURE_REGISTER; if(i2c.write(RTC_ADDR, ®_addr, 1)) { //pc.printf("Writing: Error\n\r"); return 0; } wait_ms(20); if(i2c.read(RTC_ADDR, temperature, 2)) { //pc.printf("Reading: Error\n\r"); 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 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() { 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)) { pc.printf("> Writing: Error\n\r"); } else { pc.printf("> Writing: OK\n\r"); } } void read_data(char* cell_addr) { int success = 1; char fromSlave[DATA_SIZE + 1]; fromSlave[DATA_SIZE] = '\0'; if(i2c.write(SLAVE_ADDR, cell_addr, 1)) { success = 0; } wait_ms(20); if (success) { if(i2c.read(SLAVE_ADDR, 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); } else { pc.printf("> Reading: Error\n\n\r"); } } void init(void) { i2c.frequency(50000); i2c_ticker.attach(&write_and_read, 2.0f); left_but.rise(&memory_routine); right_but.rise(&sensor_routine); pc.baud(921600); routine = MEMORY_ROUTINE; memory_cell_addr = 0x00; m_z=12434,m_w=33254; } void memory_routine(void) { routine = MEMORY_ROUTINE; } void sensor_routine(void) { 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); }