#ifndef I2C_BITBANG_SAMD21_H_
#define I2C_BITBANG_SAMD21_H_
#include "atca_status.h"
#include <delay.h>
#define MAX_I2C_BUSES 18
typedef struct
{
uint8_t pin_sda[MAX_I2C_BUSES];
uint8_t pin_scl[MAX_I2C_BUSES];
} I2CBuses;
extern I2CBuses i2c_buses_default;
extern uint8_t pin_sda;
extern uint8_t pin_scl;
# define I2C_ENABLE() { struct port_config pin_conf; \
port_get_config_defaults(&pin_conf); \
pin_conf.direction = PORT_PIN_DIR_OUTPUT_WTH_READBACK; \
port_pin_set_config(pin_sda, &pin_conf); \
pin_conf.direction = PORT_PIN_DIR_OUTPUT; \
port_pin_set_config(pin_scl, &pin_conf); }
# define I2C_DISABLE() { struct port_config pin_conf; \
port_get_config_defaults(&pin_conf); \
pin_conf.direction = PORT_PIN_DIR_INPUT; \
pin_conf.input_pull = PORT_PIN_PULL_UP; \
port_pin_set_config(pin_sda, &pin_conf); \
port_pin_set_config(pin_scl, &pin_conf); }
# define I2C_CLOCK_LOW() port_pin_set_output_level(pin_scl, false)
# define I2C_CLOCK_HIGH() port_pin_set_output_level(pin_scl, true)
# define I2C_DATA_LOW() port_pin_set_output_level(pin_sda, false)
# define I2C_DATA_HIGH() port_pin_set_output_level(pin_sda, true)
# define I2C_DATA_IN() port_pin_get_input_level(pin_sda)
# define I2C_SET_OUTPUT() { struct port_config pin_conf; \
port_get_config_defaults(&pin_conf); \
pin_conf.direction = PORT_PIN_DIR_OUTPUT_WTH_READBACK; \
port_pin_set_config(pin_sda, &pin_conf); }
# define I2C_SET_OUTPUT_HIGH() { I2C_SET_OUTPUT(); I2C_DATA_HIGH(); }
# define I2C_SET_OUTPUT_LOW() { I2C_SET_OUTPUT(); I2C_DATA_LOW(); }
# define I2C_SET_INPUT() { struct port_config pin_conf; \
port_get_config_defaults(&pin_conf); \
pin_conf.direction = PORT_PIN_DIR_INPUT; \
port_pin_set_config(pin_sda, &pin_conf); }
# define DISABLE_INTERRUPT() cpu_irq_disable()
# define ENABLE_INTERRUPT() cpu_irq_enable()
#define I2C_CLOCK_DELAY_WRITE_LOW() delay_us(1)
#define I2C_CLOCK_DELAY_WRITE_HIGH() delay_us(1)
#define I2C_CLOCK_DELAY_READ_LOW() delay_us(1)
#define I2C_CLOCK_DELAY_READ_HIGH() delay_us(1)
#define I2C_CLOCK_DELAY_SEND_ACK() delay_us(1)
#define I2C_HOLD_DELAY() delay_us(1)
#define I2C_ACK_TIMEOUT (4)
void i2c_set_pin(uint8_t sda, uint8_t scl);
void i2c_discover_buses(int i2c_bitbang_buses[], int max_buses);
void i2c_enable(void);
void i2c_disable(void);
void i2c_send_start(void);
void i2c_send_ack(uint8_t ack);
void i2c_send_stop(void);
void i2c_send_wake_token(void);
ATCA_STATUS i2c_send_byte(uint8_t i2c_byte);
ATCA_STATUS i2c_send_bytes(uint8_t count, uint8_t *data);
uint8_t i2c_receive_one_byte(uint8_t ack);
void i2c_receive_byte(uint8_t *data);
void i2c_receive_bytes(uint8_t count, uint8_t *data);
#endif