THB2/bthome_phy6222/SDK/components/driver/i2c/i2c_io.c

289 lines
4.4 KiB
C

/*************
i2c_io.c
SDK_LICENSE
***************/
//#include "iic.h"
#include "bus_dev.h"
#include "gpio.h"
#include "error.h"
//static gpio_pin_e s_pin_sda = GPIO_DUMMY;
//static gpio_pin_e s_pin_scl = GPIO_DUMMY;
//static bool s_dir_scl;
#define IIC_SDA_PIN GPIO_DUMMY
#define IIC_SCL_PIN GPIO_DUMMY
#define TWI_SDA_LOW() hal_gpio_fast_write(IIC_SDA_PIN,0)
#define TWI_SDA_HIGH() hal_gpio_fast_write(IIC_SDA_PIN,1)
#define TWI_SCL_LOW() hal_gpio_write(IIC_SCL_PIN,0)
#define TWI_SCL_HIGH() hal_gpio_write(IIC_SCL_PIN,1)
#define TWI_SCL_READ() hal_gpio_read(IIC_SCL_PIN)
#define TWI_SDA_READ() hal_gpio_read(IIC_SDA_PIN)
#define TWI_SDA_OUTPUT() hal_gpio_pin_init(IIC_SDA_PIN,OEN)
#define TWI_SDA_INPUT() hal_gpio_pin_init(IIC_SDA_PIN,IE); hal_gpio_pull_set(IIC_SDA_PIN, STRONG_PULL_UP)
#define TWI_SCL_OUTPUT() hal_gpio_pin_init(IIC_SCL_PIN,OEN)
#define TWI_SCL_INPUT() hal_gpio_pin_init(IIC_SCL_PIN,IE); hal_gpio_pull_set(IIC_SCL_PIN, STRONG_PULL_UP)
/*
#define SCL_H GPIOC->BSRR = GPIO_Pin_12
#define SCL_L GPIOC->BRR = GPIO_Pin_12
#define SDA_H GPIOC->BSRR = GPIO_Pin_11
#define SDA_L GPIOC->BRR = GPIO_Pin_11
#define SCL_read GPIOC->IDR & GPIO_Pin_12
#define SDA_read GPIOC->IDR & GPIO_Pin_11
*/
#define SCL_H TWI_SCL_HIGH()
#define SCL_L TWI_SCL_LOW()
#define SDA_H TWI_SCL_HIGH()
#define SDA_L TWI_SCL_LOW()
//#define SCL_read GPIOC->IDR & GPIO_Pin_12
#define SDA_read TWI_SDA_READ()
//GPIOC->IDR & GPIO_Pin_11
#if 0
static void scl_w(int value)
{
}
static int scl_r(void)
{
}
static void sda_w(int value)
{
}
static int sda_r(void)
{
}
#endif
void I2C_delay(void)
{
uint8_t i=5;
while(i)
{
i--;
}
}
void I2C_delay_100us(uint32_t nCount)
{
volatile int i = 450;
while(nCount)
{
nCount--;
for(; i; i--);
}
}
bool i2c_start(void)
{
SDA_H;
SCL_H;
I2C_delay();
if(!SDA_read)
{
return false;
}
SDA_L;
I2C_delay();
if(SDA_read)
{
return false;
}
SDA_L;
I2C_delay();
return true;
}
void i2c_stop(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SDA_H;
I2C_delay();
}
void i2c_ack(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}
void i2c_nack(void)
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}
bool i2c_wait_ack(void)
{
SCL_L;
I2C_delay();
SDA_H;
I2C_delay();
SCL_H;
I2C_delay();
if(SDA_read)
{
SCL_L;
return false;
}
SCL_L;
return true;
}
void i2c_tx(uint8_t SendByte)
{
uint8_t i=8;
while(i--)
{
SCL_L;
I2C_delay();
if(SendByte&0x80)
SDA_H;
else
SDA_L;
SendByte<<=1;
I2C_delay();
SCL_H;
I2C_delay();
}
SCL_L;
}
uint8_t i2c_rx(void)
{
uint8_t i=8;
uint8_t ReceiveByte=0;
SDA_H;
while(i--)
{
ReceiveByte<<=1;
SCL_L;
I2C_delay();
SCL_H;
I2C_delay();
if(SDA_read)
{
ReceiveByte|=0x01;
}
}
SCL_L;
return ReceiveByte;
}
int i2c_io_pin_init(gpio_pin_e pin_sda, gpio_pin_e pin_clk)
{
return PPlus_SUCCESS;
}
int i2c_io_pin_deinit(gpio_pin_e pin_sda, gpio_pin_e pin_clk)
{
return PPlus_SUCCESS;
}
bool i2c_io_read(uint8_t slave_addr, uint8_t reg, uint8_t* data, uint8_t size)
{
if(!i2c_start())
{
return false;
}
i2c_tx(slave_addr);
if(!i2c_wait_ack())
{
i2c_stop();
return false;
}
i2c_tx(reg);
i2c_wait_ack();
i2c_start();
i2c_tx(slave_addr|0x01);
i2c_wait_ack();
while(size)
{
*data = i2c_rx();
if(size == 1)
{
i2c_nack();
}
else
{
i2c_ack();
}
data++;
size--;
}
i2c_stop();
return true;
}
bool i2c_io_write(uint8_t slave_addr, uint8_t reg, uint8_t value)
{
if(!i2c_start())return false;
i2c_tx(slave_addr);
if(!i2c_wait_ack())
{
i2c_stop();
return false;
}
i2c_tx(reg);//i2c_tx((uint8_t)(reg & 0x00FF));
i2c_wait_ack();
i2c_tx(value);
i2c_wait_ack();
i2c_stop();
return true;
}