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