#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; }