SHT20 IIC总线驱动概述
SHT20温湿度传感器使用iic总线的驱动方式,以下资料参考SHT20 datasheet总结
1、IIC总线
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信号是在时钟线的下降沿拉低数据线,代码如下:
void IIC_ACK(void)
{
GpioWrite(&SDA, 0);
GpioWrite(&SCL, 1);
//todo delay 15us
GpioWrite(&SCL, 0);
}
NOACK 信号
和ACK信号相反,NOACK是在时钟的下降沿拉高数据线,代码如下: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;
}
SHT20 IIC总线驱动概述的更多相关文章
- Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析
关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸机开发 —— IIC总线 ,下面回顾下 IIC 基础概念 一.IIC 基础概念 IIC(Inter-Integrated Ci ...
- 对 IIC 总线的理解、调用函数以及常见面试问题
一.IIC 总线概述: IIC 即Inter-Integrated Circuit(集成电路总线) I2C总线是PHLIPS公司推出的一种串行总线, I2C总线只有两根双向信号线.一根是数据线SDA, ...
- 18、IIC总线驱动程序
i2c_s3c2410.c是内核自带dev层(adapt)驱动程序,知道怎么发收数据,不知道含义 在与i2c_s3c2410.c(在其probe函数中的s3c24xx_i2c_init函数会初始化ii ...
- linux-2.6.38 总线驱动分析
一.IIC总线驱动代码 IIC总线控制器通常是在内存上的,连接在platform总线上,所以需要通过platform_driver和platform_device的匹配.我想大概根据总线设备驱动模型的 ...
- Linux驱动之IIC总线
<作用> 电子设备中有很多IIC设备之间需要进行相互通信,这样就产生了IIC总线,常用来实现设备之间的数据通信. <IIC总线结构> IIC总线只有两条线,一条是串行数据线 ...
- RT-thread 设备驱动组件之IIC总线设备
本文主要介绍RT-thread中IIC总线设备驱动,涉及到的主要文件有:驱动框架文件(i2c_core.c,i2c_dev.c,i2c-bit-ops.c,i2c_dev.h,i2c.h):底层硬件驱 ...
- IIC总线
一. 概述 1. IIC总线是PHILIPS公司推出的一种串口总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串口总线. 2. IIC总线只有两根双向信号线.一根是数据线SDA,一 ...
- linux内核SPI总线驱动分析(一)(转)
linux内核SPI总线驱动分析(一)(转) 下面有两个大的模块: 一个是SPI总线驱动的分析 (研究了具体实现的过程) 另一个是SPI总线驱动的编写(不用研究具体的实现过程) ...
- linux之i2c子系统架构---总线驱动
编写i2c设备驱动(从设备)一般有两种方式: 1.用户自己编写独立的从设备驱动,应用程序直接使用即可. 2.linux内核内部已经实现了一个通用的设备驱动,利用通用设备驱动编写一个应用程序(用户态驱动 ...
随机推荐
- Maven项目的拆分与聚合
---------------------siwuxie095 Maven 项目的拆分与聚合 1.对已有的 Ma ...
- UVa 1595 Symmetry(set)
We call a figure made of points is left-right symmetric as it is possible to fold the sheet of paper ...
- dumpbin 查看dll中的导出函数
C:\Program Files (x86)\Microsoft Visual Studio 14.0>dumpbin -exports E:\20171110\Release\aa.dll h ...
- composer install 时,提示:Package yiisoft/yii2-codeception is abandoned, you should avoid using it. Use codeception/codeception instead.的解决
由 SHUIJINGWAN · 2017/11/24 1.composer install 时,提示:Package yiisoft/yii2-codeception is abandoned, yo ...
- 设计神器 - 摹客设计系统上线了 | 晒出你的设计规范,赢iPad Pro!
在国内,设计规范也许还是个不太常用的概念,但是如果你正好有参与互联网公司的产品设计,你应该早就已经体会到设计规范的重要性了.UI设计师总是要花费大量的时间和精力向开发描述一大堆设计细节,但是产品最后呈 ...
- c:param 标签后不要写 注释 。否则报错 Encountered illegal body of tag "c:import" tag, given its attributes
c:param 标签后不要写 注释 .否则报错 Encountered illegal body of tag "c:import" tag, given its attribu ...
- ubuntu 'yuan' update
# tsinghua university deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiv ...
- Linux操作系统Vim代码Tab自动补全配置
function! CleverTab() , col( ) =~ '^\s*$' return "\<Tab>" else return "\<C-N ...
- Realtek 8192cu 支持 Android Hotspot 软ap
http://www.cnblogs.com/bpasser/archive/2011/10/15/2213483.html Android 2.2 开始增加了WiFi Hotspot,可将Andro ...
- Linux命令:ps
Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...