Marek Trojan
/
_8_KL46_M_simple_write
program for I2C master device
Fork of I2C_HelloWorld_Mbed by
Diff: main.cpp
- Revision:
- 9:36fc715eb54c
- Parent:
- 8:3e6945d5d9a1
- Child:
- 10:39dd1d3508c3
--- a/main.cpp Wed Dec 16 19:42:37 2015 +0000 +++ b/main.cpp Thu Dec 17 23:04:29 2015 +0000 @@ -1,43 +1,55 @@ // I2C Master #include "main.h" - -int main() { + +int main() +{ init(); wait_ms(1000); while (1) {} } -void write_and_read(){ - /* write_data(); - wait_ms(20); - char regaddr = 0x24; - read_data(®addr); // works OK (pure read, without pointer setting)*/ - - rtc_sensor(); -} +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]; - get_temperature_raw(temperature); - float result = proceed_temperature(temperature); - pc.printf("<Temperature: %1.2f\n\r",result); - wait_ms(20); + 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"); + } } -void get_temperature_raw(char* temperature) +int get_temperature_raw(char* temperature) { char reg_addr = TEMPERATURE_REGISTER; - if(i2c.write(RTC_ADDR, ®_addr, 1)) - pc.printf("Writing: Error\n\r"); + 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"); + 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 1 Celsius degree + 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); @@ -45,73 +57,68 @@ } -void write_data(){ - //writing to slave - int write_ack = i2c.write(SLAVE_ADDR, data, DATA_SIZE); - if (!write_ack) { - //i2c.stop(); - pc.printf("<Writing> OK\n\r"); +void write_data() +{ + for (uint8_t i = 0; i < DATA_SIZE; i++) { + data[i+1] = (char) (rnd() % 90 + 33); } - else - pc.printf("<Writing> Error\n\r"); - //wait_ms(20); + 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 write_ack = i2c.write(SLAVE_ADDR, cell_addr, 1); - if (!write_ack) { - //i2c.stop(); - pc.printf("<Addressing> OK\n\r"); - } - else { - pc.printf("<Addressing> Error\n\r"); - return; +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(5); - */ - //reading from slave - char fromSlave[DATA_SIZE + 1]; - int read_ack = i2c.read(SLAVE_ADDR, fromSlave, DATA_SIZE); - if (!read_ack) { - //i2c.stop(); - pc.printf("<Reading> OK\n\r"); - fromSlave[DATA_SIZE] = '\0'; - pc.printf("Data from Slave: %s\n\n\r", fromSlave); - + wait_ms(20); + if (success) { + if(i2c.read(SLAVE_ADDR, fromSlave, DATA_SIZE)) { + //pc.printf("Reading: Error\n\r"); + success = 0; } - else - pc.printf("<Reading> Error\n\r"); + } + 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 i2cReadWrite(void){ - for(int a = 0; a < MSG_SIZE; a++) fromSlave[a] = 0; - - int ack = i2c.write(SLAVE_ADDR, data, strlen(data)); - if (!ack) - pc.printf("data send to slave\n\r"); - else - pc.printf("NACK!\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; +} - wait(0.1); - - int read_ack = i2c.read(SLAVE_ADDR, fromSlave, MSG_SIZE - 1); - if (!read_ack) - pc.printf("data received from slave\n\r"); - else - pc.printf("data not received\n\r"); - - pc.printf("Data from Slave: %s\n\r", fromSlave); - - for(int y = 0; y < 32; y++) fromSlave[y]='x'; -}*/ +void memory_routine(void) +{ + routine = MEMORY_ROUTINE; +} +void sensor_routine(void) +{ + routine = SENSOR_ROUTINE; +} -void init(void){ - i2c.frequency(100000); - i2c_ticker.attach(&write_and_read, 2.0f); - pc.baud(921600); - //pc.printf("Master says: Hello World!\n\r"); - for (uint8_t i = 0; i < DATA_SIZE; i++) - data[i] = i+65; - //data[0]=0; -} \ No newline at end of file + + +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); +}