110VCGQ/project/110VCGQV5.5/user/Src/user_iic.c

116 lines
2.0 KiB
C
Raw Normal View History

2024-11-18 10:09:39 +08:00
#include "user_iic.h"
/*时钟线SCL高电平时拉低数据线SDA-------------启动
线SCL高电平时线SDA-------------*/
//产生IIC起始信号
void IIC_Start(void)
{
IIC_SDA_1();
IIC_SCL_1();
delay_us(4);
IIC_SDA_0();//START:when CLK is high,DATA change form high to low
delay_us(4);
IIC_SCL_0();//钳住I2C总线准备发送或接收数据
}
//产生IIC停止信号
void IIC_Stop(void)
{
IIC_SCL_0();
IIC_SDA_0();
delay_us(4);
IIC_SCL_1();
IIC_SDA_1();
delay_us(4);
}
//等待应答信号到来
//返回值1接收应答失败
// 0接收应答成功
uint8_t IIC_Wait_Ack(void)
{
uint8_t ucErrTime=0;
IIC_SDA_1();delay_us(1);
IIC_SCL_1();delay_us(1);
while(READ_SDA())
{
ucErrTime++;
if(ucErrTime>100)
{
IIC_Stop();
return 1;
}
}
IIC_SCL_0();//时钟输出0
return 0;
}
//产生ACK应答
void IIC_Ack(void)
{
IIC_SCL_0();
IIC_SDA_0();
delay_us(2);
IIC_SCL_1();
delay_us(2);
IIC_SCL_0();
IIC_SDA_1();
}
//不产生ACK应答
void IIC_NAck(void)
{
IIC_SCL_0();
IIC_SDA_1();
delay_us(4);
IIC_SCL_1();
delay_us(4);
IIC_SCL_0();
IIC_SDA_1();
}
//IIC发送一个字节
//返回从机有无应答
//1有应答
//0无应答
void IIC_Send_Byte(uint8_t txd)
{
uint8_t t;
IIC_SCL_0();//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
if((txd&0x80)>>7)
{
IIC_SDA_1();
}
else {
IIC_SDA_0();
}
txd<<=1;
delay_us(2); //对TEA5767这三个延时都是必须的
IIC_SCL_1();
delay_us(2);;
IIC_SCL_0();
delay_us(2);
}
}
//读1个字节ack=1时发送ACKack=0发送nACK
uint8_t IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
for(i=0;i<8;i++ )
{
IIC_SCL_0();
delay_us(2);
IIC_SCL_1();
receive<<=1;
if(READ_SDA())receive++;
delay_us(1);
}
if (!ack)
IIC_NAck();//发送nACK
else
IIC_Ack(); //发送ACK
return receive;
}