历史上的今天
今天是:2024年10月22日(星期二)
2021年10月22日 | stm32专题十五:IIC通讯
2021-10-22 来源:eefocus
IIC
I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要USART、CAN等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。

IIC总线物理层的特点:
1 它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个I2C通讯总线中,可连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机;
2 一个I2C总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线 (SCL)。数据线即用来表示数据,时钟线用于数据收发同步;
3 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问;
4 总线通过上拉电阻(通常4.7K)接到电源(2 ~ 15V)。当I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平;
5 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线;
6 具有三种传输模式:标准模式传输速率为100kbit/s ,快速模式为400kbit/s ,高速模式下可达 3.4Mbit/s,但目前大多IIC设备尚不支持高速模式;
7 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制 ;

IIC总线协议层:
IIC的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。
接下来的这些内容全部来自于IIC总线协议:
1 数据有效性:
由于连接到IIC总线上的设备工艺不同,逻辑0和逻辑1的电平不是固定的(由VDD决定),每传输一个数据位就产生一个时钟脉冲;
SDA 线上的数据必须在时钟的高电平周期保持稳定。SDA线高/低电平状态只有在 SCL 线的时钟信号是低电平时才能改变;

2 起始和终止条件
起始条件: SCL 线是高电平时 SDA 线从高电平向低电平切换;
终止条件: SCL 是高电平时 SDA 线由低电平向高电平切换;
起始信号:
// step1 把两根总线拉高
SDA = 1;
SCL = 1;
// step2 等待电平稳定
delay(us);
// step3 依次拉低SDA SCL(中间要等待电平稳定)
SDA = 0;
delay(us);
SCL = 0;
delay(us);
终止信号:
// step1 两根线按时间轴拉低
SCL = 0;
SDA = 0;
// step2 等待电平稳定
delay(us);
// step3 按时间轴依次拉高
SCL = 1;
delay(us);
SDA = 1;
delay(us);
3 传输数据
字节格式
发送到 SDA 线上的每个字节必须为8位,每次传输可以发送的字节数量不受限制 每个字节后必须跟一个应答位。首先传输的是数据的最高位 MSB。如果从机要完成一些其他功能后 例如一个内部中断服务程序,才能接收或发送下一个完整的数据字节,可以使时钟线 SCL保持低电平迫使主机进入等待状态。当从机准备好接收下一个数据字节并释放时钟线SCL后,数据传输继续。
7位设备地址和8位设备地址
比如EEPROM的设备地址为:1111 000,有时会写为0X78,这都表示7位设备地址。
8位设备地址:7位地址 + 读写位
读地址:0X78 + 1 = (1111 000) << 1 + (0000 0001) = 0XF1 = 1111 0001
写地址:0X78 + 0 = (1111 000) << 1 + (0000 0000) = 0XF0 = 1111 0000

4 数据应答
数据传输必须带响应。相关的时钟脉冲由主机产生,在响应的时钟脉冲期间,发送器释放SDA线,此时被SDA被自动拉高。在响应的时钟脉冲期间,接收器必须将SDA线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平;
通常,被寻址的接收器在接收到的每个字节后,除了用CBUS地址开头的报文,必须产生一个响应;
当从机不能响应从机地址时,例如它正在执行一些实时函数不能接收或发送,从机必须使数据线保持高电平,主机然后产生一个停止条件终止传输,或者产生重复起始条件开始新的传输;
5 数据的传输格式

传输过程描述:
起始信号;
一个字节(7位地址 + 读写位)+ ACK;
一个数据字节 + ACK;
...
停止信号;
几种可能的数据格式:
1 主机向从机写入数据,整个的传输方向不变;

2 主机在发送第一个字节后,立即读从机。后面的字节传输方向发生改变,第一次的应答仍由从机产生,后续的应答信号全部由主机产生,当读取到指定个数的数据时,主机先发送非应答信号,然后发送停止信号。

3 复合格式
传输改变方向的时侯,起始条件和从机地址都会被重复。但R/ W位取反。如果主机接收器发送一个重复起始条件,它之前应该发送了一个不响应信号。
复合格式可以用于例如控制一个串行存储器(EEPROM),先写从机设备地址,然后在第一个数据字节期间,要写内部存储器的地址。再重复起始条件和从机地址后,数据可被传输。
复合格式的一般应用:
前面一般是7位设备地址+0(写方向),然后第一个数据字节(发送要读取的寄存器地址),这个地址会被EEPROM内部保存起来,然后重新发送起始信号,再写7位设备地址+1(读方向),接下来就可以读到数据。

6 数据位定义
史海拾趣
|
液晶显示问题。我买了快开发板,本来是1024*768分辨率的,根据网上资料,修改成800*600,但是整个WINDOWS界面只显示了屏幕的左上角,其他WINDOWS CE程序一切正常,不知道如何是好,希望各位能给电帮助。… 查看全部问答> |
|
一 为什么说是伪动态 做网站的人知道动态网页常用的开发语是ASP.net、JSP、PHP。而这里我们是没法用上的,我们用的是cgi文件。 二 什么是CGI Common Gate Interface(通用网关 ...… 查看全部问答> |
|
大家好! 小弟现在遇到一个奇怪的问题。 硬件测试环境:板子是STM8S208,板子上有两个LIN接口,一个做主机,一个做从机,用一条串口线将两个口连接起来通信。   ...… 查看全部问答> |
|
近几天一直在TI网站上瞎转悠,深为它的器件性能所引,在我提交的电源方案中(还没有完善)决定使用它的Piccolo CPU : _TMS320f28035,它可以由一块CPU担任所设想的从PFC到输出部分的、全部分的功率控制。 然而,搞这个没有个仿真器 ...… 查看全部问答> |
|
如何使用 CCS 建一个 M3 的工程,一直在用 MDK,最近不得不熟悉 CCS ,不知道 CCS 要怎么建工程呢? 找到一个 PDF ,按照里边的步骤还是能编译,而且很慢,这样的工具怎么用呢? [ 本帖最后由 Study_Stellaris 于 2011-12-5 16:00 编辑 ]… 查看全部问答> |
|
在CCS3.3的开发环境下,拿TDS560仿真器连接omapl138的板子,在reset_TDS560USB_plus时出现如下错误:C:\\CCStudio_v3.3\\cc\\bin>dbgjtag -f brddat\\ccbrd0.dat -rv ------------------------------------------------------------------------ ...… 查看全部问答> |
|
BeagleBone试用第一周 底板PCB--今天终于决定把板子拿去制了。到底如何不管他。 今天终于决定把板子拿去制了。到底如何不管他。 时间要紧。有错就改嘛。反正还是好同志。 希望大家支持,阿莫那里要求插孔都加大0.15MM 所以我的孔画的比较大。 有关硬件的资料: [ 本帖最后由 damiaa 于 2012-9-28 16:27 编辑 ...… 查看全部问答> |






