#include "lt_fdc2214_iic.h"
#include "stm32l4xx_hal.h"
#include "main.h"

extern TIM_HandleTypeDef htim15;

void FDC2214_SDA_IN()
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

//    GPIO_InitStruct.Pin = GPIO_PIN_7;
		GPIO_InitStruct.Pin = GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

void FDC2214_SDA_OUT()
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

//    GPIO_InitStruct.Pin = GPIO_PIN_7;
		GPIO_InitStruct.Pin = GPIO_PIN_11;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

void delay_us(uint32_t us)
{
	uint16_t start = __HAL_TIM_GET_COUNTER(&htim15);
  while((__HAL_TIM_GET_COUNTER(&htim15) - start) < us);
}

void FDC2214_IIC_Start(void)
{
    FDC2214_SDA_OUT();
    SDA_HIGH();
    SCL_HIGH();
    delay_us(2);
    SDA_LOW();
    delay_us(2);
    SCL_LOW();
    delay_us(2);
}


void FDC2214_IIC_Stop(void)
{
    FDC2214_SDA_OUT();
    SCL_LOW();
    delay_us(2);
    SDA_LOW();
    delay_us(2);
    SCL_HIGH();
    delay_us(2);
    SDA_HIGH();
    delay_us(2);
}

uint8_t FDC2214_IIC_Wait_Ack(void)
{
    uint8_t waitTime=0;
    FDC2214_SDA_IN();
    SDA_HIGH();
    delay_us(2);
    SCL_HIGH();
    delay_us(2);
    while(FDC2214_IIC_SDA_IN)
    {
        waitTime++;
        if(waitTime>250)
        {
            FDC2214_IIC_Stop();
            return 1;
        }
    }
    SCL_LOW();
    return 0;
}

void FDC2214_IIC_Ack(void)
{
    SCL_LOW();
    delay_us(2);
    FDC2214_SDA_OUT();
    SDA_LOW();//发送0是ACK
    delay_us(2);
    SCL_HIGH();
    delay_us(2);
    SCL_LOW();
    delay_us(2);
}

void FDC2214_IIC_NAck(void)
{
    SCL_LOW();
    delay_us(2);
    FDC2214_SDA_OUT();
    SDA_HIGH();//发送1是nACK
    delay_us(2);
    SCL_HIGH();
    delay_us(2);
    SCL_LOW();
    delay_us(2);
}

void FDC2214_IIC_Send_Byte(uint8_t dat)
{
    uint8_t t;
    FDC2214_SDA_OUT();
    SCL_LOW();
    for(t=0; t<8; t++)
    {

        delay_us(2);
        if(dat & 0x80)
            SDA_HIGH();
        else
            SDA_LOW();
        dat<<=1;
        SCL_HIGH();
        delay_us(2);
        SCL_LOW();
        delay_us(2);
    }
    //SCL_LOW();
}

uint8_t FDC2214_IIC_Read_Byte(uint8_t ack)
{
    uint8_t i,receive=0;
    SDA_HIGH();
    FDC2214_SDA_IN();
    for(i=0; i<8; i++ )
    {
        receive<<=1;

        SCL_LOW();
        delay_us(2);
        SCL_HIGH();
        delay_us(2);
        if(FDC2214_IIC_SDA_IN)receive++;//最低位置1
    }
    SCL_LOW();
    if (!ack)
        FDC2214_IIC_NAck();
    else
        FDC2214_IIC_Ack();
    return receive;
}





