s3c2440裸机-I2c编程-1-i2c协议

发布者:诚信与爱最新更新时间:2024-07-05 来源: elecfans关键字:i2c协议 手机看文章 扫描二维码
随时随地手机看文章

1.硬件电路

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。如下图:

SDA(串行数据线)和SCL(串行时钟线)都是双向I/O线,需通过上拉电阻接电源VCC.当总线空闲时.两根线都是高电平


I2C 总线标准模式下速度可以达到 100Kb/S,快速模式下可以达到 400Kb/S。SDA 和 SCL 这两根线必须要接一个上拉电阻,一般是 4.7K。

2.i2c协议规则

传输过程如下:


主控发送start讯号(S)

主控发送从设备地址(slave dev addr)

主控发送方向(W/R)

从设备应答(ack)

主控(or从设备)发送数据(data)

从设备(or主控)应答(ack)

主控发送停止讯号(P)

下图是具体的s3c2440 一次i2c读写过程:


2.1 start & stop讯号


start信号:SCL是高电平,SDA被主控拉低

stop信号:SCL是高电平,SDA被主控拉高




2.2 ack讯号


第9个时钟周期,SDA被拉低表示ack讯号

2.3 DATA格式


用 9个clk传输8bit数据(7bit 从设备地址 + 1bit方向 ),MSB高位先出。第9个clk是ack讯号。

2.4 数据有效性

SDA 线上的数据必须在SCL高电平周期保持稳定,在 SCL 低电平时才能允许改变。

换言之,SCL为高电平时表示有效数据,SDA为高电平表示“1”,低电平表示“0”;SCL为低电平时表示无效数据,此时SDA会进行电平切换,为下次数据表示做准备。


2.5一次数据传输



2.6 一条SDA上实现双向传输的原理(开极电路)


条件:

1.主设备发送时,从设备不发送(通过SCL控制即可,比如让前8个clk主控发送数据到SDA,让第9个clk从设备发送数据到SDA)

2.主设备发送数据时,从设备的“发送引脚”不能影响SDA数据。反之,从设备发送数据时,主设备的'发送引脚'不能影响到SDA数据。那么如何做到?(SDA内部电路用三极管,开集电路)



从上图得出当A,B都为低电平时,三极管不导通,SDA的电平取决于外部电路,这里SDA有上拉电阻,所以对应高电平

当主控拉高A时,三极管导通,此时SDA接地,电平被拉低

同理,当从设备拉高B时,三极管导通,此时SDA接地,电平被拉低

那么电平真值表如下:


所以,实现双向传输时:

如果是master-> slave进行数据传输,那么让主控驱动三极管,拉低SDA。

如果是slave-> master进行数据传输,那么让从设备驱动三极管,拉低SDA。

否则,都不驱动三极管,SDA一直输出高电平,处于idle状态

从下面的例子可以看看数据是怎么传的(实现双向传输)。

举例:主设备发送(8bit)给从设备

⚫ 前 8 个 clk

◼ 从设备不要影响 SDA,从设备不驱动三极管

◼ 主设备决定数据,主设备要发送 1 时不驱动三极管,要发送 0 时驱动三极管

⚫ 第 9 个 clk,由从设备决定数据

◼ 主设备不驱动三极管

◼ 从设备决定数据,要发出回应信号的话,就驱动三极管让 SDA 变为 0

从这里也可以知道 ACK 信号是低电平从上面的例子,就可以知道怎样在一条线上实现双向传输,这就是 SDA 上要使用上拉电阻的原因。

为何 SCL 也要使用上拉电阻?在第 9 个时钟之后,如果有某一方需要更多的时间来处理数据,它可以一直驱动三极管把 SCL 拉低。

当 SCL 为低电平时候,大家都不应该使用 IIC 总线,只有当 SCL 从低电平变为高电平的时候,IIC 总线才能被使用。当它就绪后,就可以不再驱动三极管,这是上拉电阻把 SCL 变为高电平,其他设备就可以继续使用 I2C 总线了。

2.6 SCL被从设备拉低表示busy状态


在第9个clk 后i2c会产生中断,此时SCL被拉低,表示busy状态,表示谁都不允许再使用i2c, 然后等到中断处理结束了,也就是处于idle状态了,此时会释放出SCL,那么主控可以继续发送SCL讯号表示可以继续进行i2c通信了。


关键字:i2c协议 引用地址:s3c2440裸机-I2c编程-1-i2c协议

上一篇:s3c2440裸机-I2c编程-2-i2c控制器
下一篇:s3c2440裸机-spi编程-3-gpio模拟spi驱动OLED

推荐阅读最新更新时间:2026-03-24 17:03

stm32中的i2c协议编程
在上篇博客中,我已经介绍完了i2c的各种特征,这次就结合师兄给我的编程实例来分析学习。首先i2c协议的编程可以分为硬件i2c和模拟i2c,一般在51之类的低端单片机都是使用模拟i2c(即用软件编程来控制io口上的时序变化以符合i2c协议的biao标准),而在stm32一类的中高端单片机本身就自带可以某些硬件gpio口自动实现i2c协议。下面就分别讨论下两种方式的编程初始化配置过程。 1.1.模拟i2c编程 1.1.1初始化i2c函数 首先i2c协议通信需要两根总线数据线SDA与时钟线SCL,所以我们先选择两个gpio口进行相应初始化。gpio口的初始化过程在之前博客也详细介绍过这里就不过多赘述
[单片机]
stm32中的<font color='red'>i2c</font><font color='red'>协议</font><font color='red'>编程</font>
linux上使用J-Link调试S3C2440裸机代码
工具: segger的jlink仿真器 segger的jlink for linux 交叉编译工具链里面的arm-xx-linux-xx-gdb 初始化脚本 工具安装 segger的jlink for linux 进入Segger官网--- Download--- J-Link/J-Trace--- J-Link Software and Documentation Pack。有deb、rpm、tgz三种包可供选择,随便选一个,我选的是tgz。由于我的仿真器是和谐版,所以我不敢选择高版本的J-Link,选择Older versions。下载一个比较老的,我下的是最老的。 解压至你要安装的目录。里面有个README.t
[单片机]
s3c2440调试nandflash裸机程序遇到的问题
按照前面sdram的代码,启动代码里面关看门狗、初始化存储控制器(主要是BANK0的Norflash和BANK6的SDRAM)、设置栈到SDRAM的最高地址,text段的数据直接从Norflash里面取。 代码如下: head.S @************************************************************************* @ File:head.S @ 功能:设置SDRAM,将栈设置到SDRAM,然后继续执行 @************************************************************************* .
[单片机]
s3c2440裸机-内存控制器1-内存控制器的原理
1.内存接口概念 S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚(GPA-GPH)),有串口控制器 (接有TXD RXD引脚),有memory controller内存控制器,有Nand控制器等... 1.不同类型的控制器: (1)GPIO控制器属于门电路,不涉及到时序,相对简单。 (2)串口控制器属于协议类接口,类似的协议类接口还有iic、iis、spi等。 (3)前面的GPIO/门电路接口、协议类接口,都不会把地址输出到外部设备,仅仅只是将地址写入到相应的控制器。 接下来的内存类接口,会把地址输出到外部,cpu将地址写入内存控制器,内存控制器还需访问外部设备,比如NorFlash、网卡、SDRAM。 2.
[单片机]
s3c2440裸机-代码重定位-2-编程实现
代码重定位(2.编程实现代码重定位) 1.引入链接脚本 我们上一节讲述了为什么要重定位代码,那么怎么去重定位代码呢? 上一节我们发现 arm-linux-ld -Ttext 0 -Tdata 0x30000000 这种方式编译出来的bin文件有800多M,这肯定是不行的,那么需要怎么把.data段重定位到sdram呢? 可以通过AT参数指定.data段在编译时的存放位置,我们发现这样指定太不方便了,而且不好确定要放在bin文件的哪个位置。这里就要引入链接脚本,它可以帮我们解决这个不必要的麻烦。 链接脚本格式 格式如下图: 我们来看一个具体的例子: SECTIONS { . = 0x00000000; //表示当前
[单片机]
s3c2440裸机-异常中断2-und未定义指令异常
1._und(未定义指令异常)介绍 我们之前分析过5种异常,那么如何进入未定义指令异常,当然是cpu读取指令发生异常,出现了指令解析异常。 我们先来看下当cpu解析到什么样的指令才会触发未定义指令异常呢? 从上面的arm指令格式中可知,只要指令码属于划线的格式,就属于未定义指令异常。 2.汇编向c函数传参 我们知道汇编给C语言函数传参是通过r0,r1,...通过堆栈的方式去传递的参数,比如r0=1, r1=2;那么在被调用的c函数中argv0就是r0, argv1就是r1...,那么我们如果通过汇编给C函数传递字符串呢? 我们可以通过这样声明und_string为一个字符串: und_string: .stri
[单片机]
s3c2440裸机-LCD编程-5-LCD上实现画点线圆
1.画点 无论是何种图形,都是基于点来构成的,因此我们需要先实现画点,其他的都是上层的一些数据处理了,像各种图形、甚至色彩鲜艳的图片无非都是一些由点构造出的数据而已。 我们在在farmebuffer.c实现画点,在geomentry.c实现画线、画圆等几何图形,font.c实现画字。 那么一个像素点要显示到lcd上,我们要知道它的位置坐标,然后还要知道它的颜色值,假设该像素点的坐标为(x,y),那么该像素的地址为: (x,y)= fb_base + (xres*(bpp/8))*y +x*bpp/8; 那么所以在画点前需要先获取lcd参数:fb_base、xres、yres、bpp; static unsigned
[单片机]
s3c2440裸机-电阻触摸屏-5-触摸屏校准原理-五点校准法
1.触摸屏校准原理 之前点的触摸屏解析出来的ADCDATA的bit 表示坐标ADC的转换结果,那么这些结果都是通过电压值来转换过来的。 所谓触摸屏校准,就是让触摸屏坐标(电压值)与LCD的坐标能够对应起来,所以校准就是要找到一个公式把电压值转换成和LCD宽高相符合的坐标值。 如下图,上面一层膜是TS触摸屏,下面一层是LCD显示屏,如果我们的LCD size是480*272,那么当我们点击触摸屏上的原点,那它的坐标可能不是(0,0),而是(X1', Y1'),因此我们需要对触摸屏进行校准,期望把x', y’的坐标能够映射成和lcd一样的坐标0,0. 那么如何较准呢,如下图以X方向为为例。 如
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved