标签:中间 www. 停止 数据 代码 ++ else 代码实现 概述
SHT20温湿度传感器使用iic总线的驱动方式,以下资料参考SHT20 datasheet总结
Start信号
IIC总线的起始信号以SDA由高电平变为低电平,等待5us以上,再由SCL从高电平变低电平,发出起始信号,图示如下所示:
注意:两根线由高变低的间隔时间大于4.7us,建议延时15us
example:
void IIC_Start(void)
{
GpioWrite(&SDA, 1);
GpioWrite(&SCL, 1);
//todo :delay 15us
GpioWrite(&SDA, 0);
//todo "delay 15us
GpioWrite(&SCL, 0);
}
Stop信号
IIC总线的停止信号以SCL信号线从低电平变为高电平,等待0.6us以上SDA信号线再从低电平变高电平,图示如下所示:
注意:其中间隔时间大于0.6us,建议15us
example:
void IIC_Stop(void)
{
GpioWrite(&SDA, 0);
GpioWrite(&SCL, 1);
//todo :delay 15us
GpioWrite(&SDA, 1);
//todo :delay 15us
GpioWrite(&SCL, 0);
}
ACK 信号
ACK信号是在时钟线的下降沿拉低数据线,代码如下:cpp void IIC_ACK(void) { GpioWrite(&SDA, 0); GpioWrite(&SCL, 1); //todo delay 15us GpioWrite(&SCL, 0); }
cpp void IIC_NOACK(void) //6. 非应答信号 { GpioWrite(&SDA, 1); GpioWrite(&SCL, 1); //todo delay 15us GpioWrite(&SCL, 0); }
发送数据和接受数据
通常发送数据还是接受数据是由 IIC Addr + Write/Read Byte决定的,所以我们在读取数据或者发送数据之前一定会发送一个 Addr + W/R,,在No Hold Master模式下面,MCU具有主导地位,即时钟信号线由MCU掌握,在发出Start信号之后,开始接受或者发送数据,通常是在时钟的下降沿进行数据的收发操作。收发结束之后需要等待ACK或者Nack,由发送或者接受的数据决定。如下图所示:
参考代码实现
bool IIC_SendByte(unsigned char dat) //3.写数据
{
unsigned char i;
bool ack;
for (i = 0; i < 8; i++)
{
if((dat<<i)&0x80)
{
GpioWrite(&SDA, 1);
}
else
{
GpioWrite(&SDA, 0);
}
GpioWrite(&SCL, 1); //开始让数据维持稳定
//todo :delay 15us
GpioWrite(&SCL, 0);
//todo :delay 15us
}
GpioWrite(&SDA, 1);
GpioWrite(&SCL, 1);
//todo :delay 15us
IIC_SDAMode(PIN_INPUT);
if (GpioRead(&SDA)) //SDA 低电平 从机回馈低电平
{
ack = false;//ack = 0; //0 == ack 代表无ack信号, 从机不应答,发送不成功
}
else
{
ack = true;// ack = 1; //从机应答,发送成功
}
IIC_SDAMode(PIN_OUTPUT);
GpioWrite(&SCL, 0);
return ack;
//todo :delay50us
}
unsigned char IIC_RecvByte(void) //4. 读数据
{
unsigned char i, temp = 0;
GpioWrite(&SDA, 1);
// todo delay 15us
IIC_SDAMode(PIN_INPUT);
for (i = 0; i < 8; i++)
{
GpioWrite(&SCL, 0);
//todo delay 15us
GpioWrite(&SCL, 1);
//todo delay 15us
temp<<=1;
if (GpioRead(&SDA))
{
temp = temp + 1;
}
}
GpioWrite(&SCL, 0);
IIC_SDAMode(PIN_OUTPUT);
//todo delay 15us
return temp;
}
标签:中间 www. 停止 数据 代码 ++ else 代码实现 概述
原文地址:https://www.cnblogs.com/memorypro/p/9549906.html