Marek Trojan / _8_CONV

Dependencies:   mbed-src

Fork of _8_CONV_1_SLAVE by Marek Trojan

Committer:
marcus255
Date:
Thu Dec 17 18:33:21 2015 +0000
Revision:
6:b9578f756c9c
Parent:
5:d622f8a4a016
Address discovering functionality added and works fine

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcus255 0:ab0f6f4ef7ac 1 // Conv1 Slave
marcus255 0:ab0f6f4ef7ac 2 #include "main.h"
marcus255 6:b9578f756c9c 3 volatile int i = 0;
marcus255 6:b9578f756c9c 4 volatile int discovered_address = 0;
marcus255 5:d622f8a4a016 5 int main()
marcus255 5:d622f8a4a016 6 {
marcus255 0:ab0f6f4ef7ac 7 init();
marcus255 6:b9578f756c9c 8 int prev_state = 1;
marcus255 6:b9578f756c9c 9 int temp_state;
marcus255 6:b9578f756c9c 10 uint8_t address = 0;
marcus255 6:b9578f756c9c 11
marcus255 6:b9578f756c9c 12 int states[9];
marcus255 0:ab0f6f4ef7ac 13 while (1) {}
marcus255 0:ab0f6f4ef7ac 14 }
marcus255 0:ab0f6f4ef7ac 15
marcus255 5:d622f8a4a016 16 void i2cStart(void)
marcus255 5:d622f8a4a016 17 {
marcus255 0:ab0f6f4ef7ac 18 SDA_interrupt.disable_irq();
marcus255 0:ab0f6f4ef7ac 19 char addr = (char)slave.read();
marcus255 5:d622f8a4a016 20 if (addr & 0x01 == 0x01) { //reading from slave
marcus255 5:d622f8a4a016 21 char uart_rec2;
marcus255 5:d622f8a4a016 22 device.putc(DATA_TO_WRITE_CHAR);
marcus255 5:d622f8a4a016 23 device.putc(addr);
marcus255 5:d622f8a4a016 24 while(1) {
marcus255 5:d622f8a4a016 25 device.putc(DATA_TO_READ_CHAR);
marcus255 5:d622f8a4a016 26 while(1) { // waiting for data byte from conv2
marcus255 5:d622f8a4a016 27 if(device.readable()) {
marcus255 5:d622f8a4a016 28 if (device.getc() == UART_CHAR_INCOMING) {
marcus255 5:d622f8a4a016 29 uart_rec2 = device.getc();
marcus255 5:d622f8a4a016 30 break;
marcus255 5:d622f8a4a016 31 }
marcus255 5:d622f8a4a016 32 }
marcus255 5:d622f8a4a016 33 }
marcus255 5:d622f8a4a016 34 if(!slave.write(uart_rec2)) {
marcus255 5:d622f8a4a016 35 device.putc(END_OF_TRANSMISSION);
marcus255 5:d622f8a4a016 36 break;
marcus255 5:d622f8a4a016 37 }
marcus255 5:d622f8a4a016 38 }
marcus255 5:d622f8a4a016 39 slave.read();
marcus255 5:d622f8a4a016 40 } else {
marcus255 0:ab0f6f4ef7ac 41 count = 0;
marcus255 0:ab0f6f4ef7ac 42 char uart_rec;
marcus255 0:ab0f6f4ef7ac 43 device.putc(DATA_TO_WRITE_CHAR);
marcus255 0:ab0f6f4ef7ac 44 device.putc(addr);
marcus255 4:9e2adff677ac 45 while(!SDA_state) { //writting to slave
marcus255 0:ab0f6f4ef7ac 46 buffer = (char)slave.read();
marcus255 5:d622f8a4a016 47 for(int y = 0; y < 1024; y++) {} //some delay required for signal establishment
marcus255 0:ab0f6f4ef7ac 48 if(SDA_state) break;
marcus255 0:ab0f6f4ef7ac 49 device.putc(DATA_TO_WRITE_CHAR);
marcus255 5:d622f8a4a016 50 device.putc(buffer);
marcus255 5:d622f8a4a016 51
marcus255 0:ab0f6f4ef7ac 52 while(1) { // waiting until confirmation char is received from converter 2
marcus255 0:ab0f6f4ef7ac 53 if(device.readable()) {
marcus255 0:ab0f6f4ef7ac 54 uart_rec = device.getc();
marcus255 0:ab0f6f4ef7ac 55 if(uart_rec == UART_CONFIRMATION_CHAR || uart_rec == UART_NON_CONFIRMATION_CHAR)
marcus255 0:ab0f6f4ef7ac 56 break;
marcus255 0:ab0f6f4ef7ac 57 }
marcus255 0:ab0f6f4ef7ac 58 }
marcus255 0:ab0f6f4ef7ac 59 if (uart_rec == UART_NON_CONFIRMATION_CHAR)
marcus255 0:ab0f6f4ef7ac 60 break;
marcus255 5:d622f8a4a016 61 }
marcus255 0:ab0f6f4ef7ac 62 device.putc(END_OF_TRANSMISSION);
marcus255 0:ab0f6f4ef7ac 63 }
marcus255 0:ab0f6f4ef7ac 64 SDA_interrupt.enable_irq();
marcus255 0:ab0f6f4ef7ac 65 }
marcus255 0:ab0f6f4ef7ac 66
marcus255 5:d622f8a4a016 67 void init(void)
marcus255 5:d622f8a4a016 68 {
marcus255 5:d622f8a4a016 69 device.baud(921600);
marcus255 6:b9578f756c9c 70 SCL_interrupt.rise(&on_SCL_rising_slope_interrupt);
marcus255 5:d622f8a4a016 71 }
marcus255 5:d622f8a4a016 72
marcus255 6:b9578f756c9c 73 void on_SCL_rising_slope_interrupt(void)
marcus255 5:d622f8a4a016 74 {
marcus255 6:b9578f756c9c 75
marcus255 6:b9578f756c9c 76 //=(char)SDA_state
marcus255 6:b9578f756c9c 77 if (i<9)
marcus255 5:d622f8a4a016 78 {
marcus255 6:b9578f756c9c 79 if (SDA_state)
marcus255 6:b9578f756c9c 80 discovered_address |= (0x01<<(7-i));
marcus255 6:b9578f756c9c 81 i++;
marcus255 5:d622f8a4a016 82 }
marcus255 6:b9578f756c9c 83 else
marcus255 6:b9578f756c9c 84 {
marcus255 6:b9578f756c9c 85 SCL_interrupt.disable_irq();
marcus255 6:b9578f756c9c 86 device.putc((char)discovered_address);
marcus255 6:b9578f756c9c 87 i = 0;
marcus255 6:b9578f756c9c 88 discovered_address = 0;
marcus255 5:d622f8a4a016 89 }
marcus255 6:b9578f756c9c 90
marcus255 5:d622f8a4a016 91 // now we (probably) know the Slave address, so we can initialize i2c bus
marcus255 5:d622f8a4a016 92 // and set this Conv as Conv1 and send info to second Conv to act as Conv2
marcus255 5:d622f8a4a016 93
marcus255 5:d622f8a4a016 94 //device.putc(SET_CONV2_FUNCT);
marcus255 6:b9578f756c9c 95 //device.putc(address);
marcus255 5:d622f8a4a016 96 //init_I2C(address, 100000);
marcus255 6:b9578f756c9c 97 //SDA_interrupt.enable_irq();
marcus255 5:d622f8a4a016 98 }
marcus255 5:d622f8a4a016 99
marcus255 5:d622f8a4a016 100 void init_I2C(char addr, int freq)
marcus255 5:d622f8a4a016 101 {
marcus255 0:ab0f6f4ef7ac 102 SDA_interrupt.fall(&i2cStart);
marcus255 5:d622f8a4a016 103 slave.address(addr);
marcus255 5:d622f8a4a016 104 slave.frequency(freq);
marcus255 0:ab0f6f4ef7ac 105 }