I2C学习Word文件下载.docx
- 文档编号:17836455
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:20
- 大小:712.23KB
I2C学习Word文件下载.docx
《I2C学习Word文件下载.docx》由会员分享,可在线阅读,更多相关《I2C学习Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
在总线的一次数据传送过程中,可以有以下几种组合方式:
a、主机向从机发送数据,数据传送方向在整个传送过程中不变:
注:
有阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送。
A表示应答,表示非应答(高电平)。
S表示起始信号,P表示终止信号。
。
b、主机在第一个字节后,立即由从机读数据
c、在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反相。
四、总线的寻址
I2C总线协议有明确的规定:
采用7位的寻址字节(寻址字节是起始信号后的第一个字节)。
(1)寻址字节的位定义
D7~D1位组成从机的地址。
D0位是数据传送方向位,为“0”时表示主机向从机写数据,为“1”时表示主机由从机读数据。
n主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据R/位将自己确定为发送器或接收器。
n从机的地址由固定部分和可编程部分组成。
在一个系统中可能希望接入多个相同的从机,从机地址中可编程部分决定了可接入总线该类器件的最大数目。
如一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件,即可以有8个同样的器件接入到该I2C总线系统中。
n
(2)寻址字节中的特殊地址
n固定地址编号0000和1111已被保留作为特殊用途。
起始信号后的第一字节的8位为“00000000”时,称为通用呼叫地址。
通用呼叫地址的用意在第二字节中加以说明。
格式为:
第二字节为06H时,所有能响应通用呼叫地址的从机器件复位,并由硬件装入从机地址的可编程部分。
能响应命令的从机器件复位时不拉低SDA和SCL线,以免堵塞总线。
第二字节为04H时,所有能响应通用呼叫地址并通过硬件来定义其可编程地址的从机器件将锁定地址中的可编程位,但不进行复位。
如果第二字节的方向位B为“1”,则这两个字节命令称为硬件通用呼叫命令。
在这第二字节的高7位说明自己的地址。
接在总线上的智能器件,如单片机或其他微处理器能识别这个地址,并与之传送数据。
硬件主器件作为从机使用时,也用这个地址作为从机地址。
在系统中另一种选择可能是系统复位时硬件主机器件工作在从机接收器方式,这时由系统中的主机先告诉硬件主机器件数据应送往的从机器件地址,当硬件主机器件要发送数据时就可以直接向指定从机器件发送数据了。
(3)起始字节
起始字节是提供给没有I2C总线接口的单片机查询I2C总线时使用的特殊字节。
不具备I2C总线接口的单片机,则必须通过软件不断地检测总线,以便及时地响应总线的请求。
单片机的速度与硬件接口器件的速度就出现了较大的差别,为此,I2C总线上的数据传送要由一个较长的起始过程加以引导。
引导过程由起始信号、起始字节、应答位、重复起始信号(Sr)组成。
n请求访问总线的主机发出起始信号后,发送起始字节(00000001),另一个单片机可以用一个比较低的速率采样SDA线,直到检测到起始字节中的7个“0”中的一个为止。
在检测到SDA线上的高电平后,单片机就可以用较高的采样速率,以便寻找作为同步信号使用的第二个起始信号Sr。
n在起始信号后的应答时钟脉冲仅仅是为了和总线所使用的格式一致,并不要求器件在这个脉冲期间作应答。
3>
I2C典型电路
上图是I2C控制的codecICES8328。
从中可以看出,I2C_SCL1_AU_C接ES8328,另一端I2C_SCL1接CPU。
I2C操作笔记——以AT24C04为例
1.前言
对于大多数工程师而言,I2C永远是一个头疼的问题。
相比UART和SPI而言,I2C的时序要复杂一些,I2C组合变化也丰富一些。
在这里以AT24C04为例说明I2C使用过程中的一些注意点。
2.AT24C04操作示意图
图AT24C04操作示意图
示意图说明:
示意图分阐述了4种不同的操作方式,例如写单个存储单元,写多个存储单元,读单个存储单元和写单个存储单元。
对于单个操作而言,上部为MCU通过I2C输出的相关指令,下部为I2C设备的响应。
例如写单个存储单元操作时,MCU发出I2C启动,设备地址,写标志位等,而I2C设备输出多个ACK。
3.若干说明
3.1基本操作方式
I2C设备的操作可分为写单个存储字节,写多个存储字节,读单个存储字节和读多个存储字节。
相对于AT24C04而言,这些读写动作相对于内部的存储单元而言,对于其他的具备I2C接口的AD或传感器而言,存储单元变成了寄存器单元。
虽然存在概念上的差别,但是其操作原理确实一样的。
3.2无应答
在以上4种情况中,无应答为MCU发出,无应答意为MCU不需要从机输出数据,MCU将会停止本次I2C操作。
需要说明的是,无应答并不是一种异常情况。
3.3I2C设备并不只有一个设备地址
这一点往往被忽略,一般情况下认为在I2C启动信号之后的字节为I2C从机地址(7位)。
对于AT24C04而言,内部具有4Kb存储位,合计512字节。
若需要访问512字节内容,总共需要9根地址线(8位宽度),那么上图中的存储地址(8位长度)显然还差了一位,那么就需要从设备地址中“借”1位,这就使得AT24C04具有两个I2C地址,例如0x50和0x51。
3.4存储地址
相对于AT24C04而言,存储地址占1个字节。
若换成其他I2C设备,例如ADXL345,存储地址被寄存器地址替代即可,其他操作方式相似。
但是像AT24C32或AT24C64这样的大容量EEPROM,则存储地址需要2字节描述,也就意味着需要连续发送两个字节地址信息且高字节在前。
其他像BH1750这样的光照芯片,存储地址被具体的操作命令替代,使用I2C设备时需要因地制宜,切不可照搬教条。
3.5连续读和连续写限制
AT24C04中存在页的概念,一页的大小为8字节,若果在单页的范围内,存储地址累加,若超过该页的最大地址,存储地址回到页开始处。
所以对于连续读和连续写而言,最大的操作字节数为8。
若需要操作的字节内容超过8字节,则需要进行翻页操作,即写入下一页的起始存储地址。
4总结
I2C设备有很多种,若掌握基本原理,便可见招拆招,那是I2C总线就不那么难了。
5.参考资料
【维基百科I2C】
1.I2C协议
2条双向串行线,一条数据线SDA,一条时钟线SCL。
SDA传输数据是大端传输,每次传输8bit,即一字节。
支持多主控(multimastering),任何时间点只能有一个主控。
总线上每个设备都有自己的一个addr,共7个bit,广播地址全0.
系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。
1.1I2C位传输
数据传输:
SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit;
若SDA发生跳变,则用来表示一个会话的开始或结束(后面讲)
数据改变:
SCL为低电平时,SDA线才能改变传输的bit
1.2I2C开始和结束信号
开始信号:
SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:
SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
1.3I2C应答信号
Master每发送完8bit数据后等待Slave的ACK。
即在第9个clock,若从IC发ACK,SDA会被拉低。
若没有ACK,SDA会被置高,这会引起Master发生RESTART或STOP流程,如下所示:
1.4I2C写流程
写寄存器的标准流程为:
1.
Master发起START
2.
Master发送I2Caddr(7bit)和w操作0(1bit),等待ACK
3.
Slave发送ACK
4.
Master发送regaddr(8bit),等待ACK
5.
6.
Master发送data(8bit),即要写入寄存器中的数据,等待ACK
7.
8.
第6步和第7步可以重复多次,即顺序写多个寄存器
9.
Master发起STOP
写一个寄存器
写多个寄存器
1.5I2C读流程
读寄存器的标准流程为:
Master发送I2Caddr(7bit)和w操作1(1bit),等待ACK
Master发送I2Caddr(7bit)和r操作1(1bit),等待ACK
Slave发送data(8bit),即寄存器里的值
Master发送ACK
10.
第8步和第9步可以重复多次,即顺序读多个寄存器
读一个寄存器
读多个寄存器
2.PowerPC的I2C实现
Mpc8560的CCSR中控制I2C的寄存器共有6个。
2.1I2CADR地址寄存器
CPU也可以是I2C的Slave,CPU的I2C地址有I2CADR指定
2.2I2CFDR频率设置寄存器
TheserialbitclockfrequencyofSCLisequaltotheCCBclockdividedbythedivider.
用来设置I2C总线频率
2.3I2CCR控制寄存器
MEN:
ModuleEnable.
置1时,I2C模块使能
MIEN:
ModuleInterruptEnable.置1时,I2C中断使能。
MSTA:
Master/slavemode.1Mastermode,0Slavemode.
当1->
0时,CPU发起STOP信号
当0->
1时,CPU发起START信号
MTX:
Transmit/receivemodeselect.0Receivemode,1Transmitmode
TXAK:
Transferacknowledge.置1时,CPU在9thclock发送ACK拉低SDA
RSTA:
RepeatSTART.置1时,CPU发送REPEATSTART
BCST:
置1,CPU接收广播信息(信息的slaveaddr为7个0)
2.4I2CSR状态寄存器
MCF:
0
Bytetransferisinprocess
1
Bytetransferiscompleted
MAAS:
当CPU作为Slave时,若I2CDR与会话中Slaveaddr匹配,此bit被置1
MBB:
0I2Cbusidle
1I2Cbusbusy
MAL:
若置1,表示仲裁失败
BCSTM:
若置1,表示接收到广播信息
SRW:
WhenMAASisset,SRWindicatesthevalueoftheR/Wcommandbitofthecallingaddress,whichissentfromthemaster.
0Slavereceive,masterwritingtoslave
1Slavetransmit,masterreadingfromslave
MIF:
Moduleinterrupt.TheMIFbitissetwhenaninterruptispending,causingaprocessorinterruptrequest(providedI2CCR[MIEN]isset)
RXAK:
若置1,表示收到了ACK
2.5I2CDR数据寄存器
这个寄存器储存CPU将要传输的数据。
51单片机普通IO口模拟IIC总线的程序实现
1./*
2.************************************************************************************
3.Fuction:
GPIO模拟iic
bus,实现与AT24C02的数据通信
4.PS:
该源代码是以STC89C52为平台编写的,可通过修改包含的头文件以适用于所有51系列单片机
5.SD:
Jason
6.************************************************************************************
7.*/
8.#include
<
reg52.h>
9.#include
string.h>
10.sbit
sda
=
P2^0;
11.sbit
scl
P2^1;
12.unsigned
char
table1[11]={0,1,2,3,4,5,6,7,8,9};
13.unsigned
table2[11];
14.void
init();
15.void
somenop();
16.void
delay(unsigned
char);
17.void
start();
18.void
stop();
19.void
send_ack(unsigned
20.unsigned
rec_ack();
21.void
write_byte(unsigned
22.unsigned
read_byte();
23.unsigned
write_add(unsigned
char,unsigned
*,unsigned
24.unsigned
read_add(unsigned
25.
26.void
main()
27.{
28.
29.
write_add(0x10,table1,10);
30.
delay(100);
31.
read_add(0x10,table2,10);
32.
while
(1);
33.}
34.//端口初始化
35.void
init()
36.{
37.
memset(table2,0,sizeof(table2));
38.
1;
39.
40.
41.}
42.//起始信号
43.void
start()
44.{
45.
46.
47.
48.
49.
0;
50.
51.}
52.//终止信号
53.void
stop()
54.{
55.
56.
57.
58.
59.
60.
61.}
62.//主机发送应答信号
63.void
ack)
64.{
65.
66.
67.
ack;
68.
69.
70.
71.
72.
73.
74.
75.}
76.//主机接收应答信号
77.unsigned
rec_ack()
78.{
79.
80.
81.
if(sda
==
1)
82.
{
83.
84.
delay
(1);
85.
86.
87.
return
88.
}
89.
else
90.
91.}
92.//写一个字节
93.void
dat)
94.{
95.
unsigned
i,a;
96.
a
dat;
97.
for(i=0;
i<
8;
i++)
98.
99.
a<
100.
101.
102.
CY;
103.
104.
105.
106.
107.
108.
109.
110.
111.}
112.//读一个字节
113.unsigned
read_byte()
114.{
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
(a<
1)|sda;
125.
126.
127.
128.
a;
129.}
130.//向add地址写入len长度的dat数据
131.unsigned
add,unsigned
*dat,unsigned
len)
132.{
133.
flag,i;
134.
135.
write_byte(0xa0);
13
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- I2C 学习