Marek Trojan / _8_CONV

Dependencies:   mbed-src

Fork of _8_CONV_1_SLAVE by Marek Trojan

main.cpp

Committer:
marcus255
Date:
2015-12-17
Revision:
7:e86480c767ea
Parent:
4:9e2adff677ac
Child:
8:47ae8b74cd43

File content as of revision 7:e86480c767ea:

// Conv1 Slave
#include "main.h"

int main()
{
    init_conv();
    while (1) {}
}

void on_SDA_falling_slope_interrupt(void)
{
    SDA_interrupt.disable_irq();
    char addr = (char)slave.read();
    if (addr & 0x01 == 0x01) { //reading from slave
        char uart_rec2;
        device.putc(DATA_TO_WRITE_CHAR);
        device.putc(addr);
        while(1) {
            device.putc(DATA_TO_READ_CHAR);
            while(1) { // waiting for data byte from conv2
                if(device.readable()) {
                    if (device.getc() == UART_CHAR_INCOMING) {
                        uart_rec2 = device.getc();
                        break;
                    }
                }
            }
            if(!slave.write(uart_rec2)) {
                device.putc(END_OF_TRANSMISSION);
                break;
            }
        }
        slave.read();
    } else {
        count = 0;
        char uart_rec;
        device.putc(DATA_TO_WRITE_CHAR);
        device.putc(addr);
        while(!SDA_state) { //writting to slave
            buffer = (char)slave.read();
            for(int y = 0; y < 1024; y++) {} //some delay required for signal establishment
            if(SDA_state) break;
            device.putc(DATA_TO_WRITE_CHAR);
            device.putc(buffer);

            while(1) { // waiting until confirmation char is received from converter 2
                if(device.readable()) {
                    uart_rec = device.getc();
                    if(uart_rec == UART_CONFIRMATION_CHAR || uart_rec == UART_NON_CONFIRMATION_CHAR)
                        break;
                }
            }
            if (uart_rec == UART_NON_CONFIRMATION_CHAR)
                break;
        }
        device.putc(END_OF_TRANSMISSION);
    }
    SDA_interrupt.enable_irq();
}

void init_conv(void)
{
    SCL_interrupt.rise(&on_SCL_rising_slope_interrupt);
    device.baud(921600);
    discovered_address = 0;
    clk_count = 0;
    frequency = I2C_FREQUENCY;
}

void init_conv1(int frequency, char address)
{
    slave.frequency(frequency);
    slave.address(address);
    SDA_interrupt.fall(&on_SDA_falling_slope_interrupt);
}

void init_conv2(void)
{

}

void on_SCL_rising_slope_interrupt(void)
{
    if (clk_count<9) {
        if (SDA_state)
            discovered_address |= (0x01<<(7-clk_count));
        clk_count++;
    } else {
        SCL_interrupt.disable_irq();
        /*//commented for now, as conv2 software stays as it was for now
        device.putc(SET_CONV2_FUNCT);
        device.putc(discovered_address);
        device.putc((char)(frequency/1000)); //in kHz */
        init_conv1(frequency,  (char)discovered_address);
    }
}