/*◄■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ I2CM.h ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■►*/

/* 
 * File       : I2CM.h
 * Author     : JWDarsow
 * See        : I2CM.c for title information
 * Created on : Tuesday, April 17, 2018
 * Comments   : 
 * Revision history: 
 */

#ifndef _I2CM_H
#define _I2CM_H

/*═════════════════════════════════ INCLUDEs ═════════════════════════════════*/
#include <xc.h>                        // include dsPIC33EP512GM604 processor files.
#include <stddef.h>
#include "JWD-NHR_Common.h"            // Standard Defines & Generic Type Defs

/*══════════════════════════════ DEFINES for I²C ═════════════════════════════*/
// <editor-fold defaultstate="collapsed" desc="DEFINES">
#define I2C_7bit             True      // I²C 7 or 10 bit mode flag
#define READ                 1         // Bus address R/nW bit
#define WRITE                0         // Bus address R/nW bit
#define ACK                  0         // Acknowledge = lo
#define NACK                 1         // Not Acknowledge = hi
#define I2C_Idle             0x1F      // SSPCON2 status *EN bits mask

//DEFINES </editor-fold>

/*═══════════════════════════ FUNCTION DECLARATIONS ══════════════════════════*/
// <editor-fold defaultstate="collapsed" desc="Function Declarations">

/* * * * * * * * * * * * *  Lower level I²C routines  * * * * * * * * * * * * */
/*───────────────────── Generate I²C Start Condition ─────────────────────────*/
void i2c_start(void);

/*──────────────────── Generate I²C ReStart Condition ────────────────────────*/
void i2c_reStart(void);

/*───────────────────── Generate I²C Stop Condition ──────────────────────────*/
void i2c_stop(void);

/*────────────────────── Write byte to the I²C bus ───────────────────────────*/
Int8 i2c_byte_out(Byte data);

/*──────────────────── Get Acknowledgment from Slave ─────────────────────────*/
bool i2c_GetAck(void);

/*────────────────────── Read byte from the I²C bus ──────────────────────────*/
Byte i2c_byte_in(void);

/*───────────────────── Give Acknowledgment to Slave ─────────────────────────*/
void i2c_GiveAck(Byte anACK);

/*─────────────────────────── Poll for ACK bit ───────────────────────────────*/
void i2c_PollAck(Byte AddrW);      // Control code/Addr & R/nW=0 bit

//Function Declarations </editor-fold>


// Comment a function and leverage automatic documentation with slash star star
/**
    <p><b>Function prototype:</b></p>
    <p><b>Summary:</b></p>
    <p><b>Description:</b></p>
    <p><b>Precondition:</b></p>
    <p><b>Parameters:</b></p>
    <p><b>Returns:</b></p>
    <p><b>Example:</b></p>
    <code>
    </code>
    <p><b>Remarks:</b></p>
 */
// TODO Insert declarations or function prototypes (right here) to leverage 
// live documentation


#endif /* _I2CM_H */

