#include "I2C_Analog.h" static void _SDA_IN(I2C_Handle_Struct_t* I2C_Handle) { GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = I2C_Handle->SDA_GPIO_Pin; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(I2C_Handle->SDA_GPIOx, &GPIO_InitStruct); } static void _SDA_OUT(I2C_Handle_Struct_t* I2C_Handle) { GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = I2C_Handle->SDA_GPIO_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; HAL_GPIO_Init(I2C_Handle->SDA_GPIOx, &GPIO_InitStruct); } static void _GPIO_CLK_Init(GPIO_TypeDef* GPIOx) { if(GPIOx == GPIOA) { __HAL_RCC_GPIOA_CLK_ENABLE(); } else if(GPIOx == GPIOB) { __HAL_RCC_GPIOB_CLK_ENABLE(); } else if(GPIOx == GPIOC) { __HAL_RCC_GPIOC_CLK_ENABLE(); } else if(GPIOx == GPIOD) { __HAL_RCC_GPIOD_CLK_ENABLE(); } else if(GPIOx == GPIOE) { __HAL_RCC_GPIOE_CLK_ENABLE(); } } void Delay(uint32_t Tcount)//40:8us { while(Tcount--); } void I2C_GPIO_Config(I2C_Handle_Struct_t* I2C_Handle) { GPIO_InitTypeDef GPIO_InitStruct; _GPIO_CLK_Init(I2C_Handle->SCL_GPIOx); _GPIO_CLK_Init(I2C_Handle->SDA_GPIOx); GPIO_InitStruct.Pin = I2C_Handle->SCL_GPIO_Pin; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init(I2C_Handle->SCL_GPIOx, &GPIO_InitStruct); GPIO_InitStruct.Pin = I2C_Handle->SDA_GPIO_Pin; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init(I2C_Handle->SDA_GPIOx, &GPIO_InitStruct); } void I2C_Start(I2C_Handle_Struct_t* I2C_Handle) { _SDA_OUT(I2C_Handle); HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_SET); Delay(DLY_US); HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_RESET); Delay(DLY_US); HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_RESET); } void I2C_Stop(I2C_Handle_Struct_t* I2C_Handle) { _SDA_OUT(I2C_Handle); HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_SET); Delay(DLY_US); HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_SET); Delay(DLY_US); HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_RESET); } void I2C_Write_Byte(I2C_Handle_Struct_t* I2C_Handle, const uint8_t s) { uint8_t temps; uint8_t dat,i; temps=s; dat=0x80; _SDA_OUT(I2C_Handle); for(i=0;i<8;i++) { if(dat&temps) { HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_SET); Delay(DLY_US); HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_SET); Delay(DLY_US);//t(HIGH) Clock high period See Note 2 4.0~50us HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_RESET); Delay(DLY_US - 1); } else { HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_RESET); Delay(DLY_US); HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_SET); Delay(DLY_US); HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_RESET); Delay(DLY_US - 1); } dat=dat>>1; } HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_SET); Delay(1); } void I2C_Read_Byte(I2C_Handle_Struct_t* I2C_Handle, uint8_t *s) { uint8_t temps=0,i; uint8_t text=0x80; uint8_t sdain; _SDA_IN(I2C_Handle); for(i=0;i<8;i++) { HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_SET); Delay(DLY_US); sdain = HAL_GPIO_ReadPin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin); if(1==sdain) { temps |=(text>>i); } HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_RESET); Delay(DLY_US); } *s=temps; Delay(1); } uint8_t I2C_Check_Ack(I2C_Handle_Struct_t* I2C_Handle) { uint8_t sdain; _SDA_IN(I2C_Handle);; HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_SET); Delay(1); sdain = HAL_GPIO_ReadPin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin); HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_RESET); Delay(1); if(1==sdain) { return 1; } else { return 0; } } void I2C_Send_Ack(I2C_Handle_Struct_t* I2C_Handle) { _SDA_OUT(I2C_Handle); HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_RESET); Delay(1); HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_SET); Delay(DLY_US); HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_SET); Delay(DLY_US); } void I2C_Send_Nack(I2C_Handle_Struct_t* I2C_Handle) { _SDA_OUT(I2C_Handle); HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_SET); Delay(1); HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_SET); Delay(DLY_US); HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_RESET); Delay(1); }