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内核内部已经实现了一个通用的设备驱动,利用通用设备驱动编写一个应用程序(用户态驱动 ...
随机推荐
- Java注解(Annotation)用法:利用注解和反射机制指定列名导出数据库数据
闲来没事,想了一个应用的例子:用java如何把数据库的数据根据我们指定的某几列,如第2列,第4列,第6列导出来到Excel里? 写代码也是为了应用的,写好的代码更重要的是在于思考.我自己思考了这个示例 ...
- 什么是Shell、Shell脚本
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种 ...
- css浮动的元素居中
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- MessagePack 使用
MessagePack 使用 MessagePack(https://msgpack.org/) 是一个基于二进制高效的对象序列化 Library 用于跨语言通信.它可以像 JSON 那样,在许多种语 ...
- Linux多线程服务端编程 使用muduo C++网络库 学习笔记 日志log
代码来自陈硕开源代码库 muduo中 地址是https://github.com/chenshuo/muduo #pragma once #include <string> #define ...
- javac 编译java文件提示: 程序包com.mysql.jdbc不存在
需要将引用的包放到:/usr/java/jdk1.7.0_75/jre/lib/ext 也就是jdk安装目录/jre/lib/ext 目录下面
- 【Linux】SVN的安装和配置
SVN SVN:SVN是Subversion的简称,是一种开放代码的版本控制系统,相比较RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制器服务已从CVS迁移到Su ...
- 20155213 2016-2017-2 《Java程序设计》第八周学习总结
20155213 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 第十四章NIO与NIO2 NIO NIO使用频道来衔接数据节点,在处理数据时,NIO可以让你 ...
- shell的一些简单用法
一 BASH的属性 BASH中会存储一些自身属性的参数,启用或关闭某一项功能 例如控制* .字符是否为通配 查看参数 set -o 关闭noglob参数 set -o noglob ls * ls: ...
- S4 exercise -- 模块
写一个用户登录验证程序,文件如下1234.json {"expire_date": "2021-01-01", "id": 1234, &q ...