i2c总线编码
i2c总线编码
发送启动信号S
在同步时钟线SCL 为高电平时,数据线出现的由高到低的下降沿。 启动信号子程序STA

1 /*******************************************************************************
2 * 函数名 : I2cStart()
3 * 函数功能 : 起始信号:在SCL时钟信号在高电平期间SDA信号产生一个下降沿
4 * 输入 : 无
5 * 输出 : 无
6 * 备注 : 起始之后SDA和SCL都为0
7 *******************************************************************************/
8
9 void I2cStart()
10 {
11 SDA=1;
12 Delay10us();
13 SCL=1;
14 Delay10us();//建立时间是SDA保持时间>4.7us
15 SDA=0;
16 Delay10us();//保持时间是>4us
17 SCL=0;
18 Delay10us();
19 }
发送停止信号P
在SCL 为高电平期间SDA 发生正跳变。
停止信号子程序STOP

1 /*******************************************************************************
2 * 函数名 : I2cStop()
3 * 函数功能 : 终止信号:在SCL时钟信号高电平期间SDA信号产生一个上升沿
4 * 输入 : 无
5 * 输出 : 无
6 * 备注 : 结束之后保持SDA和SCL都为1;表示总线空闲
7 *******************************************************************************/
8
9 void I2cStop()
10 {
11 SDA=0;
12 Delay10us();
13 SCL=1;
14 Delay10us();//建立时间大于4.7us
15 SDA=1;
16 Delay10us();
17 }
等待应答信号
应答信号:应答信号由接受设备产生,在scl信号为高电平期间,接受设备将SDA拉低为低电平一段时间,表示数据传输正确。

非应答信号:应答信号由接受设备产生,在SCL信号为高电平期间,接受设备不将将SDA拉低为低电平一段时间,没有应答。
1 /*******************************************************************************
2 * 函数名 : yingda()
3 * 函数功能 : 对数据是否被从机接受给出应答/非应答信号(1/0)
4 * 输入 : 无
5 * 输出 : 0或1。发送成功返回1,发送失败返回0
6 * 备注 : 发送完一个字节SCL=0,SDA=1
7 *******************************************************************************/
8 void yingda()
9 {
10 unsigned char b;
11 while(SDA)//等待应答,也就是等待从设备把SDA拉低
12 {
13 b++;
14 if(b>200) //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束
15 {
16 SCL=0;
17 Delay10us();
18 return 0;
19 }
20 }
21 SCL=0;
22 Delay10us();
23 return 1;
24 }
通过I2C发送一个字节
数据传送格式

unsigned char I2cSendByte(unsigned char dat)
{
unsigned char a=0;//最大255,一个机器周期为1us,最大延时255us。
for(a=0;a<8;a++)//要发送8位,从最高位开始
{
SDA=dat>>7; //起始信号之后SCL=0,所以可以直接改变SDA信号
dat=dat<<1;
Delay10us();
SCL=1;
Delay10us();//建立时间>4.7us
SCL=0;
Delay10us();//时间大于4us
}
SDA=1;
Delay10us();
SCL=1;
yingda(); //应答子函数
}
使用I2c读取一个字节
1 /*******************************************************************************
2 * 函数名 : I2cReadByte()
3 * 函数功能 : 使用I2c读取一个字节
4 * 输入 : 无
5 * 输出 : dat
6 * 备注 : 接收完一个字节SCL=0,SDA=1.
7 *******************************************************************************/
8
9 unsigned char I2cReadByte()
10 {
11 unsigned char a=0,dat=0;
12 SDA=1; //起始和发送一个字节之后SCL都是0
13 Delay10us();
14 for(a=0;a<8;a++)//接收8个字节
15 {
16 SCL=1;
17 Delay10us();
18 dat<<=1;
19 dat|=SDA;
20 Delay10us();
21 SCL=0;
22 Delay10us();
23 }
24 return dat;
25 }
以At24c02举例说明i2c总线读写数据过程
a、主机向从机发送数据,数据传送方向在整个传送过程中不变:

注:有阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送。
A表示应答, A非表示非应答(高电平)。
S表示起始信号,P表示终止信号。
1 /*******************************************************************************
2 * 函数名 : void At24c02Write(unsigned char addr,unsigned char dat)
3 * 函数功能 : 往24c02的一个地址写入一个数据
4 * 输入 : 无
5 * 输出 : 无
6 *******************************************************************************/
7
8 void At24c02Write(unsigned char addr,unsigned char dat)
9 {
10 I2cStart();
11 I2cSendByte(0xa0); //发送写器件地址 用“0”表示主机发送数据(T),“1”表示主机接收数据(R)
12 I2cSendByte(addr);//发送要写入内存地址
13 I2cSendByte(dat); //发送数据
14 I2cStop();
15 }
b、主机从从机读数据

1 /*******************************************************************************
2 * 函数名 : unsigned char At24c02Read(unsigned char addr)
3 * 函数功能 : 读取24c02的一个地址的一个数据
4 * 输入 : 无
5 * 输出 : 无
6 *******************************************************************************/
7
8 unsigned char At24c02Read(unsigned char addr)
9 {
10 unsigned char num;
11 I2cStart();
12 I2cSendByte(0xa0); //发送写器件地址
13 I2cSendByte(addr); //发送要读取的地址
14 I2cStart();
15 I2cSendByte(0xa1); //发送读器件地址
16 num=I2cReadByte(); //读取数据
17 I2cStop();
18 return num;
19 }
i2c总线编码的更多相关文章
- i2c总线,设备,驱动之间的关系
------ 总线上先添加好所有具体驱动,i2c.c遍历i2c_boardinfo链表,依次建立i2c_client, 并对每一个i2c_client与所有这个线上的驱动匹配,匹配上,就调用这个驱动的 ...
- I2C总线协议的简要说明
为了快速的了解I2C总线协议,此处采用另类的方式进行说明. 倘若你和另外一个人只能通过一个开关加灯泡的装置在不同的两个房间进行交流,以下是很简单能说明的一个模型: 你的房间有一个开关,另外一间房间有一 ...
- Linux I2C总线设备驱动模型分析(ov7740)
1. 框架1.1 硬件协议简介1.2 驱动框架1.3 bus-drv-dev模型及写程序a. 设备的4种构建方法a.1 定义一个i2c_board_info, 里面有:名字, 设备地址 然后i2c_r ...
- 【转】I2C总线协议
I2C总线(Inter Integrated-Circuit)是由PHILIPS公司在上世纪80年代发明的一种电路板级串行总线标准,通过两根信号线——时钟线SCL和数据线SDA——即可完成主从机的单工 ...
- 51单片机 | 基于I2C总线的秒表模拟应用
———————————————————————————————————————————— 参考地址: http://blog.csdn.net/junyeer/article/details/4648 ...
- I2C总线完全版——I2C总线的结构、工作时序与模拟编程
I2C总线的结构.工作时序与模拟编程 I2C总线的结构.工作时序与模拟编程I2C总线(Inter Integrated Circuit)是飞利浦公司于上个世纪80年代开发的一种"电路板级&q ...
- I2C总线(异步)
起始位与停止位的定义: 起始信号:当SCL为高期间,SDA由高到低的跳变:启动信号是一种电平跳变时序信号,而不是一个电平信号. 停止信号:当SCL为高期间,SDA由低到高的跳变:停止信号也是一种电平跳 ...
- [I2C]I2C总线协议图解
转自:http://blog.csdn.net/w89436838/article/details/38660631 1 I2C总线物理拓扑结构 I2C 总线在物理连接上非常简单,分别由S ...
- Linux设备驱动模型之I2C总线
一.I2C子系统总体架构 1.三大组成部分 (1)I2C核心(i2c-core):I2C核心提供了I2C总线驱动(适配器)和设备驱动的注册.注销方法,提供了与具体硬件无关的I2C读写函数. (2)I2 ...
随机推荐
- 关于Xgboost的笔记
- 04-Eureka服务注册与发现
1.介绍 2.快速开始 父工程的maven 配置文件,如下 <?xml version="1.0" encoding="UTF-8"?> <p ...
- Spark中的Wordcount
目录 通过scala语言基于local编写spark的Wordcount 基于yarn去调度WordCount 通过scala语言基于local编写spark的Wordcount import org ...
- 手写 Vue 系列 之 从 Vue1 升级到 Vue2
前言 上一篇文章 手写 Vue 系列 之 Vue1.x 带大家从零开始实现了 Vue1 的核心原理,包括如下功能: 数据响应式拦截 普通对象 数组 数据响应式更新 依赖收集 Dep Watcher 编 ...
- test 分支强制替换master 分支的办法
test分支改动太多,并且master 分支好久没有改动.直接合并到master 分支的话,会产生很多冲突,几十个文件,修复冲突会花很多时间,并且是没有意义的.因此只能使用test 分支强制替换. 代 ...
- vctl 使用镜像/换源/mirrors
️ 更新:事实证明,以下方法仅对部分镜像有效 换源 VMware16新增vctl管理容器,使用时发现是从docker.io拉取镜像,国内连接网速较慢.官方似乎并没有给出换源方法. 解决方法:从指定的U ...
- ActiveMQ-模块代码-02
模块模式 p2p模式 生产者 ConfigBeanQueue package com.producerp2p.producerp2p; import org.apache.activemq.comma ...
- 使用SymPy
最近工作的原因,需要进行一些积分运算,通过一些搜索得知了SymPy,记录一下使用历程. 1. SymPy介绍 SymPy是关于Symbolic Mathematics的Python库,它旨在成为一个功 ...
- 部署YUM源仓库与NFS共享存储服务
镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 一.YUM YUM (Yellow dog Updater Modified) ●基于RPM包构建的软件更新机制 ●可以自动解决依赖关系 ●所有 ...
- DataStage中Transformer的函数大全
一. 类型转换函数 类型转换函数用于更改参数的类型. 以下函数位于表达式编辑器的"类型转换"类别中.方括号表示参数是可选的.缺省日期格式为 %yyyy-%mm-%dd. 以下示例按 ...