
#include <msp430.h>
#include <stdint.h>
#include <stdbool.h>
#include "i2c.h"

volatile unsigned char i2cTx_Buffer_Count; // számláló
volatile unsigned char i2cTx_Buffer[4];    // köldendő adatok
volatile unsigned char i2cRx_Data=0;       // fogadott adatok
unsigned char i2cTX_Byte_Cuont;            // byte számláló
bool rx = false;                           // RX or TX ?


void i2c_pin_setup{
    P1DIR |= (BIT6 + BIT7);
    P1SEL |= (BIT6 + BIT7);
    P1SEL2 |= (BIT6 + BIT7);
} // pin setup
void I2C_Tx_Setup(uint8_t slv_addr){
    _DINT();
    rx = false;                            // megszakítás rx tiltás
    IE2 &= ~UCB0RXIE;                      // I2C_RX interrupt tiltás
    while (UCB0CTL1 & UCTXSTP);            // stop = 0?
    UCB0CTL1 |= UCSWRST;                   // SW reset engedélyezés
    UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;  // I2C Master, szinkron mód
    UCB0CTL1 = UCSSEL_2 + UCSWRST;         // SMCLK SW reset
    UCB0BR0 = 12;                          // fSCL = SMCLK /X kHz = UCB0BR0
    UCB0BR1 = 0;
    UCB0I2CSA = slv_addr;                  // Slave Address
    UCB0CTL1 &= ~UCSWRST;                  // SW reset törlés
    IE2 |= UCB0TXIE;                       // I2C_TX interrupt engedélyezés
} // i2c setup

void I2C_Rx_Setup(uint8_t slv_addr){
    _DINT();
    rx = true;                             // megszakítás rx engedélyezés
    IE2 &= ~UCB0TXIE;                      // I2C_TX megszakítás tiltás
    UCB0CTL1 |= UCSWRST;                   // SW reset engedélyezés
    UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;  // I2C Master, szinkron mód
    UCB0CTL1 = UCSSEL_2 + UCSWRST;         // SMCLK SW reset
    UCB0BR0 = 12;                          // fSCL = SMCLK /X kHz = UCB0BR0
    UCB0BR1 = 0;
    UCB0I2CSA = slv_addr;                  // Slave Address
    UCB0CTL1 &= ~UCSWRST;                  // SW reset törlés
    IE2 |= UCB0RXIE;                       // I2C_RX interrupt engedélyezés
}  // i2c setup

void i2c_Data_tx(uint8_t byte_count){
    
    i2cTx_Buffer_Count=0;
    i2cTX_Byte_Count = byte_count;            // i2c tx byte számláló
    while (UCB0CTL1 & UCTXSTP);             // Stop ?
    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX start
    __bis_SR_register(CPUOFF + GIE);        // LPM0
} // tx

uint8_t i2c_Data_rx(void){
    
    while (UCB0CTL1 & UCTXSTP);             // Stop ?
    UCB0CTL1 |= UCTXSTT + UCTXNACK;;        // I2C start
    while (UCB0CTL1 & UCTXSTT);             // Start rendben?
    UCB0CTL1 |= UCTXSTP;                    // I2C stop
    __bis_SR_register(CPUOFF + GIE);        // LPM0
    
    return i2cRx_Data;   // i2c rx adat
} // rx
// --------- i2c iterrupt ---------------------------------
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void){
     
     if(rx){                                    // i2c adat fogadás
          i2cRx_Data = UCB0RXBUF;
          __bic_SR_register_on_exit(CPUOFF);    // LPM0 vége
     } // if
     else{                                      // i2c adat küldés
       if(i2cTX_Byte_Count){                    // küldött byte számláló
            UCB0TXBUF = i2cTx_Buffer[i2cTx_Buffer_Count];    // másolás TX buffer-be
            i2cTX_Byte_Count--;                 // Tx számláló dekrementálás
            i2cTx_Buffer_Count++;               // buffer inkrementálás
       } // if
       else{
            UCB0CTL1 |= UCTXSTP;                // I2C stop
            IFG2 &= ~UCB0TXIFG;                 // flag törlés
            __bic_SR_register_on_exit(CPUOFF);  // LPM0 vége
       } // else
  } // else
}

