模拟IIC
void IIC_Start(void)
{
HAL_GPIO_WritePin(sSCL_GPIO_Port,sSDA_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(sSCL_GPIO_Port,sSCL_Pin,GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(sSDA_GPIO_Port,sSDA_Pin,GPIO_PIN_RESET);
HAL_Delay(1);
HAL_GPIO_WritePin(sSCL_GPIO_Port,sSCL_Pin,GPIO_PIN_RESET);
}
void IIC_Stop(void)
{
HAL_GPIO_WritePin(sSCL_GPIO_Port,sSCL_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(sSDA_GPIO_Port,sSDA_Pin,GPIO_PIN_RESET);
HAL_Delay(1);
HAL_GPIO_WritePin(sSCL_GPIO_Port,sSCL_Pin,GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(sSDA_GPIO_Port,sSDA_Pin, GPIO_PIN_SET);
}
uint8_t IIC_Wait_Ack(void)
{
uint8_t ucErrTime = 0;
HAL_GPIO_WritePin(sSDA_GPIO_Port,sSDA_Pin, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(sSCL_GPIO_Port,sSCL_Pin,GPIO_PIN_SET);
HAL_Delay(1);
while (HAL_GPIO_ReadPin(sSDA_GPIO_Port,sSDA_Pin))
{
ucErrTime++;
if (ucErrTime > 250)
return 1;
}
HAL_GPIO_WritePin(sSCL_GPIO_Port,sSCL_Pin,GPIO_PIN_RESET);
return 0;
}
void IIC_Ack(void)
{
HAL_GPIO_WritePin(sSCL_GPIO_Port,sSCL_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(sSDA_GPIO_Port,sSDA_Pin,GPIO_PIN_RESET);
HAL_Delay(1);
HAL_GPIO_WritePin(sSCL_GPIO_Port,sSCL_Pin,GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(sSCL_GPIO_Port,sSCL_Pin,GPIO_PIN_RESET);
}
void IIC_NAck(void)
{
HAL_GPIO_WritePin(sSCL_GPIO_Port,sSCL_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(sSDA_GPIO_Port,sSDA_Pin, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(sSCL_GPIO_Port,sSCL_Pin,GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(sSCL_GPIO_Port,sSCL_Pin,GPIO_PIN_RESET);
}
uint8_t IIC_Send_Byte(uint8_t txd)
{
uint8_t i = 0;
HAL_GPIO_WritePin(sSCL_GPIO_Port,sSCL_Pin,GPIO_PIN_RESET);
for (i = 0; i < 8; i++)
{
if ((txd & 0x80) >> 7)
HAL_GPIO_WritePin(sSDA_GPIO_Port,sSDA_Pin, GPIO_PIN_SET);
else
HAL_GPIO_WritePin(sSDA_GPIO_Port,sSDA_Pin,GPIO_PIN_RESET);
HAL_Delay(1);
HAL_GPIO_WritePin(sSCL_GPIO_Port,sSCL_Pin,GPIO_PIN_SET);
HAL_Delay(2);
HAL_GPIO_WritePin(sSCL_GPIO_Port,sSCL_Pin,GPIO_PIN_RESET);
HAL_Delay(1);
txd <<= 1;
}
return IIC_Wait_Ack();
}
uint8_t IIC_Read_Byte(uint8_t ack)
{
uint8_t i, receive = 0;
for (i = 0; i < 8; i++)
{
receive <<= 1;
HAL_GPIO_WritePin(sSCL_GPIO_Port,sSCL_Pin,GPIO_PIN_RESET);
HAL_Delay(1);
HAL_GPIO_WritePin(sSCL_GPIO_Port,sSCL_Pin,GPIO_PIN_SET);
HAL_Delay(1);
if (HAL_GPIO_ReadPin(sSDA_GPIO_Port,sSDA_Pin))
receive++;
}
if (ack)
IIC_NAck();
else
IIC_Ack();
return receive;
}
模拟SPI