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总线编码的更多相关文章

  1. i2c总线,设备,驱动之间的关系

    ------ 总线上先添加好所有具体驱动,i2c.c遍历i2c_boardinfo链表,依次建立i2c_client, 并对每一个i2c_client与所有这个线上的驱动匹配,匹配上,就调用这个驱动的 ...

  2. I2C总线协议的简要说明

    为了快速的了解I2C总线协议,此处采用另类的方式进行说明. 倘若你和另外一个人只能通过一个开关加灯泡的装置在不同的两个房间进行交流,以下是很简单能说明的一个模型: 你的房间有一个开关,另外一间房间有一 ...

  3. Linux I2C总线设备驱动模型分析(ov7740)

    1. 框架1.1 硬件协议简介1.2 驱动框架1.3 bus-drv-dev模型及写程序a. 设备的4种构建方法a.1 定义一个i2c_board_info, 里面有:名字, 设备地址 然后i2c_r ...

  4. 【转】I2C总线协议

    I2C总线(Inter Integrated-Circuit)是由PHILIPS公司在上世纪80年代发明的一种电路板级串行总线标准,通过两根信号线——时钟线SCL和数据线SDA——即可完成主从机的单工 ...

  5. 51单片机 | 基于I2C总线的秒表模拟应用

    ———————————————————————————————————————————— 参考地址: http://blog.csdn.net/junyeer/article/details/4648 ...

  6. I2C总线完全版——I2C总线的结构、工作时序与模拟编程

    I2C总线的结构.工作时序与模拟编程 I2C总线的结构.工作时序与模拟编程I2C总线(Inter Integrated Circuit)是飞利浦公司于上个世纪80年代开发的一种"电路板级&q ...

  7. I2C总线(异步)

    起始位与停止位的定义: 起始信号:当SCL为高期间,SDA由高到低的跳变:启动信号是一种电平跳变时序信号,而不是一个电平信号. 停止信号:当SCL为高期间,SDA由低到高的跳变:停止信号也是一种电平跳 ...

  8. [I2C]I2C总线协议图解

    转自:http://blog.csdn.net/w89436838/article/details/38660631 1  I2C总线物理拓扑结构      I2C 总线在物理连接上非常简单,分别由S ...

  9. Linux设备驱动模型之I2C总线

    一.I2C子系统总体架构 1.三大组成部分 (1)I2C核心(i2c-core):I2C核心提供了I2C总线驱动(适配器)和设备驱动的注册.注销方法,提供了与具体硬件无关的I2C读写函数. (2)I2 ...

随机推荐

  1. Oracle sqlplus 常用命令总结

    转至:https://blog.csdn.net/iteye_20746/article/details/81801309?utm_medium=distribute.pc_relevant.none ...

  2. selenium+python自动化103-一闪而过的dialog如何定位

    前言 web页面操作的时候经常会遇到一闪而过的 dialog 消息,这些提示语一般只出现了几秒,过后元素节点就会在DOM中消失了. 本篇讲解下用chrome 浏览器如何定位一闪而过的 dialog 消 ...

  3. Docker入坑系列(一)

    Docker入坑系列(一) 引用嘛,当然是来引用别人说的东西啦. Docker 是一个开源项目,诞生于 2013 年初,它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux ...

  4. python爬虫之抓取小说(逆天邪神)

    2022-03-06 23:05:11 申明:自我娱乐,对自我学习过程的总结. 正文: 环境: 系统:win10, python版本:python3.10.2, 工具:pycharm. 项目目标: 实 ...

  5. Qt:QMutex

    0.说明 QMutex类提供了线程间的同步控制. QMutex的目的是,保护Object.数据结构.代码块,以便每次只有一个线程能访问它(类似Java中的synchronized关键字).不过更好的情 ...

  6. LeetCode-129-求根节点到叶节点数字之和

    求根节点到叶节点数字之和 题目描述:给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字. 每条从根节点到叶节点的路径都代表一个数字: 例如,从根节点到叶节点的路径 1 ...

  7. CentOS安装时,软件选择(Software Selection)项介绍

    要指定软件包将被安装,选择软件时选择安装摘要屏幕.包组分为基础环境.这些环境是预先定义的一组具有特定用途的软件包:例如,在虚拟化主机环境中包含的一组所需的系统上运行的虚拟机软件程序包.只有一个软件环境 ...

  8. 怎么在自己的windows上创建虚拟机(linux centos7)

    怎么在自己的windows上创建虚拟机(linux centos7) 作为一个非科班出身自学的小白,踩过很多的坑,特此留下记录 宿主机:windows10系统 8G 64位操作系统 虚拟机:linux ...

  9. 矩池云上使用nvidia-smi命令教程

    简介 nvidia-smi全称是NVIDIA System Management Interface ,它是一个基于NVIDIA Management Library(NVML)构建的命令行实用工具, ...

  10. laravel8安装步骤

    网址: https://learnku.com/docs/laravel/8.x/installation/9354 安装: # 安装laravel composer create-project - ...