void IIC_Init(void)//端口配置,硬件初始化
void IIC_Start(void)//IIC起始信号
{
SDA_OUT();//sda输出状态
IIC_SDA=1;
IIC_SCL=1;
Delay(5);
IIC_SDA=0;
Delay(5);
IIC_SCL=0;//准备发送或者接收
}
void IIC_Stop(void)//IIC停止信号
{
SDA_OUT();
IIC_SCL=0;
IIC_SDA=0;
Delay(5);
IIC_SCL=1;
IIC_SDA=1;
Delay(5);
}
uint8 IIC_Wait_Ack(void)//等待应答信号 。1,接收应答失败;0,接收应答成功
{
uint8 ErrTime=0;//应答接收时间
SDA_IN();
IIC_SDA=1;
Delay(5);
while(READ_SDA)
{
ErrTime++;
if(ErrTime>50)
{
IIC_Stop();
retrun 1;
}
Delay(5);
}
IIC_SCL=1;
Delay(5);
IIC_SCL=0;
return 0;
}
void IIC_Ack(void)//产生ACK应答
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;//
Delay(5);
IIC_SCL=1;
Delay(5);
IIC_SCL=0;
}
void IIC_NAck(void)//产生NACK应答
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;//
Delay(5);
IIC_SCL=1;
Delay(5);
IIC_SCL=0;
}
void IIC_Send_Byte(uint8 txd)//IIC发送给一个字节8位
{
uint8 t;
SDA_OUT;
IIC_SCL=0;//数据开始传输
for(t=0;t<8;t++)//数据一位位发送
{
IIC_SDA=(txd&0x80)>>7;//取出最高位 数据发送从高端开始
txd<<=1;//数字移位,移走最高位
Delay(2);
IIC_SCL=1;
Delay(5);
IIC_SCL=0;
Delay(3);
}
}
uint8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDA设置为输入
for(i=0;i<8;i++ )
{
IIC_SCL=0;
Delay(5);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
Delay(5);
}
if (ack)
IIC_Ack(); //发送ACK
else
IIC_NAck();//发送nACK
return receive;
uint8 IICreadbytes(uint8 dev,uint8 reg,uint8 length,uint8 *data)
{
uint8 count=0;
IIC_Start();
IIC_Send_Byte(0);//发送写命令,对应不同单片机发送不一样
IIC_Wait_Ack();
IIC_Send_Byte(reg);//发送从机地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(1);//发送读命令
for(count=0;count<length;count++)
{
if(count!=length-1)
data[count]=IIC_Read_Byte(1);//带ACK的数据
else
data[count]=IIC_Read_Byte(0);
}
IIC_Stop();
return count;
}
uint8 IICwritebytes(uint8 dev,uint8 reg,uint8 length,uint8 *data)
{
uint8 count=0;
IIC_Start();
IIC_Send_Byte(0);//发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(reg);//发送地址
IIC_Wait_Ack();
for(count=0;count<length;count++)
{
IIC_Send_Byte(data[count]);
IIC_Wait_Ack();
}
IIC_Stop();
return 1;
}