WouoUI/Third-party-design/platform-test/User/iic.c
2023-08-16 09:56:20 +08:00

182 lines
3.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "iic.h"
//*****************************************************************/
//起始信号
void IIC_Start(void)
{
SDA_OUT();
IIC_SDA(HIGH);
IIC_SCL(HIGH);
IIC_Delay();
IIC_SDA(LOW);
IIC_Delay();
IIC_SCL(LOW);
}
/*****************************************************************/
//停止信号
void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL(LOW);
IIC_SDA(LOW);
IIC_Delay();
IIC_SCL(HIGH);
IIC_SDA(HIGH);
IIC_Delay();
}
/*****************************************************************/
//等待答应信号
//返回值1接收应答失败
// 0接收应答成功
uint8_t IIC_Wait_Ack(void)
{
uint8_t Time = 0;
SDA_IN();
IIC_SDA(HIGH);
IIC_Delay();
IIC_SCL(HIGH);
IIC_Delay();
while(READ_SDA)
{
Time++;
IIC_Delay();
if(Time>250)
{
SDA_OUT();
IIC_Stop();
return 1;
}
}
SDA_OUT();
IIC_SCL(LOW);
return 0;
}
/***************************************************************/
//产生答应信号
void IIC_Ack(void)
{
IIC_SCL(LOW);
SDA_OUT();
IIC_SDA(LOW);
IIC_Delay();
IIC_SCL(HIGH);
IIC_Delay();
IIC_SCL(LOW);
}
/**************************************************************/
//不产生答应信号
void IIC_NAck(void)
{
IIC_SCL(LOW);
SDA_OUT();
IIC_SDA(HIGH);
IIC_Delay();
IIC_SCL(HIGH);
IIC_Delay();
IIC_SCL(LOW);
}
/*************************************************************/
//发送一个字节
void IIC_Send_Byte(uint8_t Txd)
{
uint8_t t;
SDA_OUT();
IIC_SCL(LOW);
for(t = 0;t<8;t++)
{
IIC_SDA((Txd&0x80)>>7);
Txd<<=1;
IIC_SCL(HIGH);
IIC_Delay();
IIC_SCL(LOW);
IIC_Delay();
}
}
/**************************************************************/
//读取一个字节ack=1时发送ACKack=0发送nACK
uint8_t IIC_Read_Byte(uint8_t Ack)
{
uint8_t i,receive = 0;
SDA_IN();
for(i = 0;i<8;i++)
{
IIC_SCL(LOW);
IIC_Delay();
IIC_SCL(HIGH);
IIC_Delay();
IIC_Delay();
receive<<=1;
if(READ_SDA)
{
receive++;
}
IIC_Delay();
}
SDA_OUT();
if(!Ack)
IIC_NAck();
else
IIC_Ack();
return receive;
}
/**************************************************************/
//IIC延时
void IIC_Delay(void)
{
//单周期指令 1/72M=0.01389us
// co_delay_10us(1);
// __NOP();__NOP();__NOP();__NOP();__NOP();
// __NOP();__NOP();__NOP();__NOP();__NOP();
// __NOP();__NOP();__NOP();__NOP();__NOP();
// __NOP();__NOP();__NOP();__NOP();__NOP();
// __NOP();__NOP();__NOP();__NOP();__NOP();
// __NOP();__NOP();__NOP();__NOP();__NOP();
// __NOP();__NOP();__NOP();__NOP();__NOP();
// __NOP();__NOP();__NOP();__NOP();__NOP();
// __NOP();__NOP();__NOP();__NOP();__NOP();
LL_mDelay(1);
}
void SDA_OUT(void)
{
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = LCD_SDA_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
LL_GPIO_Init(LCD_SCL_GPIO_Port, &GPIO_InitStruct);
}
void SDA_IN(void)
{
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = LCD_SDA_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_INPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
// GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
LL_GPIO_Init(LCD_SCL_GPIO_Port, &GPIO_InitStruct);
}
//初始化IIC
void IIC_Init(void)
{
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = LCD_SCL_Pin|LCD_SDA_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
LL_GPIO_Init(LCD_SCL_GPIO_Port, &GPIO_InitStruct);
}