I2C

更新时间:2023-09-18 06:47:01 阅读量: 幼儿教育 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

I2C简述

I2C是飞利浦半导体公式开发的一种两线式串行总线,用于连接微控制器和外围总线,其主要特点是引脚少,总线连接简单,结构紧凑,总线上增加器件不影响系统正常工作,系统修改和可扩展性好。 I2C模块的特点: 一. I2C协议技术性能:

工作速率有100K和400K及高速模式3.4Mb/s; 支持多机通讯;

支持多主控模块,但同一时刻只允许有一个主控; 由数据线SDA和时钟SCL构成的串行总线;

每个电路和模块都有唯一的地址; 每个器件可以使用独立电源

二. I2C协议基本工作原理:

以启动信号START来掌管总线,以停止信号STOP来释放总线; 每次通讯以START开始,以STOP结束;

启动信号START后紧接着发送一个地址字节,其中7位为被控器件的地址码,一位为读/写控制位R/W,R. /W位为0表示由主控向被控器件写数据,R/W为1表示由主控向被控器件读数据;

当被控器件检测到收到的地址与自己的地址相同时,在第9个时钟期间反馈应答信号; 每个数据字节在传送时都是高位(MSB)在前;

写通讯过程:

1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线; 2. 发送一个地址字节(包括7位地址码和一位R/W);

3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK); 4. 主控收到ACK后开始发送第一个数据字节;

5. 被控器收到数据字节后发送一个ACK表示继续传送数据,发送NACK表示传送数据结束;

6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;

三.I2C协议读通讯过程:

1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线; 2. 发送一个地址字节(包括7位地址码和一位R/W);

3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK); 4. 主控收到ACK后释放数据总线,开始接收第一个数据字节;

5. 主控收到数据后发送ACK表示继续传送数据,发送NACK表示传送数据结束; 6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;

四. I2C协议总线信号时序分析 1. 总线空闲状态

SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高; 2. 启动信号START

时钟信号SCL保持高电平,数据信号SDA的电平被拉低(即负跳变)。启动信号必须是跳变信号,而且在建立该信号前必修保证总线处于空闲状态; 3. 停止信号STOP

时钟信号SCL保持高电平,数据线被释放,使得SDA返回高电平(即正跳变),停止信号也必须是跳变信号。 4. 数据传送

SCL线呈现高电平期间,SDA线上的电平必须保持稳定,低电平表示0(此时的线电压为地电压),高电平表示1(此时的电压由元器件的VDD决定)。只有在SCL线为低电平期间,SDA上的电平允许变化。 5. 应答信号ACK

I2C总线的数据都是以字节(8位)的方式传送的,发送器件每发送一个字节之后,在时钟的第9个脉冲期间释放数据总线,由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。

6. 无应答信号NACK

在时钟的第9个脉冲期间发送器释放数据总线,接收器不拉低数据总线表示一个NACK,NACK有两种用途:

a. 一般表示接收器未成功接收数据字节;

b. 当接收器是主控器时,它收到最后一个字节后,应发送一个NACK信号,以通知被控发送器结束数据发送,并释放总线,以便主控接收器发送一个停止信号STOP。

它具有四种操作模式:主设备发送模式、主设备接收模式、从设备发送模式和从设备接收模式。

数据有效性和起始及停止条件

引脚SDA上的数据在时钟SCL的高电平期间必须保持稳定,只要在SCL引脚上的时钟信号为低电平的时候,SDA引脚上的数据高低状态可被改变。如下图:

起始及停止条件如下:当SCL为高电平的是,起始条件定义为SDA线上的高电平向低电平转换,表示传输数据的开始。当SCL为低电平的是,终止条件定义为SDA线上的低电平向高电平转换,表示传输数据的结束。

数据格式:

I2C支持的数据格式包含以下三类:7位寻址模式,10位寻址模式,自由模式。 仲裁:

如果同一总线上有两个或者更多的主机同时发送的话,就需要调用仲裁处理。 五、时钟与时钟同步 时钟: 如图

SCL管脚的时钟频率=CPU时钟 / 6 / I2CPSC / (ICCLKL+6)+( ICCLKH+6) 模块时钟=CPU时钟 / 6 / I2CPSC 模块输入时钟=CPU时钟 / 6

图5.1 I2C模块时钟图解

时钟同步:

如图5.2 “线与”决定的关系

图5.2 仲裁时I2C模块的时钟同步

六、下面简述I2C寄存器相关功能:

1:I2C Own Address Register (ICOAR) I2C主地址寄存器

OADDR:提供I2C主地址,用来指明自己被映射的从地址,以区别被连接到I2C总线的其他从设备的地址。

2:I2C Interrupt Mask Register (ICIMR) I2C中断屏蔽寄存器 AAS:从地址中断使能比特

SCD:停止条件侦测中断使能比特 ICXRDY:发送数据就绪中断使能比特 ICRRDY:接受数据就绪中断使能比特

ARDY:寄存器准备就绪可以被读取中断使能比特 NACK:非确认中断使能比特 AL:丢失仲裁使能比特

3:I2C Interrupt Status Register (ICSTR) I2C中断状态寄存器 SDIR:从机传输方向比特

NACKSNT:当NACK模式被选择且I2C模块为接收模块的时候,使用NACK发送位 BB:总线忙指示

4:I2C Clock Divider Registers (ICCLKL and ICCLKH) CLK分频寄存器 ICCL:定义每个时钟低电平的持续时间 ICCH:定义每个时钟高电平的持续时间

5:I2C Data Count Register (ICCNT) 数据计数寄存器 ICDC:发送数据的字节个数

6:I2C Data Receive Register (ICDRR)接收数据寄存器 D:接收的数据

7:I2C Slave Address Register (ICSAR)从地址寄存器

A:提供I2C从地址,支持7位寻址模式,10位寻址模式,自由模式。 8:I2C Data Transmit Register (ICDXR) 数据发送寄存器 D:发送的数据,

9:I2C Mode Register (ICMDR)模式选择寄存器

NACKMOD:非确认模式只适合I2C作为接收机使用。

FREE:仿真模式用来确定I2C模块在遇到高级语言断电时的状态 STT:I2C作为主模块是的开始条件位 STP:I2C作为主模块是的结束条件位 MST:I2C模块是主模式还是从模式 TRX:发射机模式位 XA:扩展地址使能位 RM:重复模式位

DLB:数值回环模式位 IRS:I2C复位控制位 STB:STRAT字节模式位 FDF:自由数据格式模式位 BC:位计数位

10 I2C Prescaler Register (ICPSC) 预分频寄存器

IPSC:I2C clock frequency = I2C input clock frequency/(IPSC + 1) 下面是初始化机传输接收数据的例子:未包含预定义 一:初始化

1:I2C_ICMDR = 0;

功能:I2C的模块复位控制位,I2C中所有寄存器恢复为默认设置 2:I2C_ICPSC = 125;

功能:分频,将输入的时钟分频为系统要求或者定义的时钟 3:I2C_ICCLKL = 5; I2C_ICCLKH = 5;

功能:定义每个时钟高低电平的持续时间 4:I2C_ICMDR |= ICMDR_IRS; 功能:脱离复位状态,初始化结束。

当初始化结束以后I2C并不会开始数据的传输,只有配置好后续的参数(包含地址,数据大小,开始结束等)以后,才会开始数据的传输。 二:I2C发送数据 5:I2C_ICCNT = len;

功能:设置I2C发送数据多少 6:I2C_ICSAR = i2caddr;

功能:I2C非主机模式下从机地址

7:I2C_ICMDR = ICMDR_STT | ICMDR_TRX | ICMDR_MST | ICMDR_IRS | ICMDR_FREE; 功能:配置传输相关

STT:I2C发送模式下设置起始位,设置1表示要产生起始条件 TRX:发射机模式位,决定是发送还是接收 MST:主从模式位 IRS:复位比特

FREE:确认断点的处理 8:DSK6455_wait( 10 );

功能:短时间等待设置完成。 9:for ( i = 0 ; i < len ; i++ )

{ I2C_ICDXR = data[i];

while ( ( I2C_ICSTR & ICSTR_ICXRDY ) == 0 ); }

功能:执行数据的传输及判断,其中( I2C_ICSTR & ICSTR_ICXRDY ) == 0判断本次传输是否完成

10:I2C_ICMDR |= ICMDR_STP; 功能:根据要求产生的停止信号 三:I2C读取数据 5:I2C_ICCNT = len;

功能:设置I2C发送数据大小 6:I2C_ICSAR = i2caddr;

功能:I2C非只有模式下从机地址

7:I2C_ICMDR = ICMDR_STT | ICMDR_MST | ICMDR_IRS | ICMDR_FREE; 功能:配置传输相关

STT:I2C发送模式下设置起始位,设置1表示要产生起始条件 MST:主从模式位 IRS:复位比特

FREE:确认断点的处理 8:DSK6455_wait( 10 );

功能:短时间等待设置完成。 9:for ( i = 0 ; i < len ; i++ )

{ I2C_ICDXR = data[i];

while ( ( I2C_ICSTR & ICSTR_ICRRDY ) == 0 ); }

功能:执行数据的传输及判断,其中( I2C_ICSTR & ICSTR_ICRRDY ) == 0判断本次传输是否完成

10:I2C_ICMDR |= ICMDR_STP; 功能:根据要求产生的停止信号

功能:短时间等待设置完成。 9:for ( i = 0 ; i < len ; i++ )

{ I2C_ICDXR = data[i];

while ( ( I2C_ICSTR & ICSTR_ICRRDY ) == 0 ); }

功能:执行数据的传输及判断,其中( I2C_ICSTR & ICSTR_ICRRDY ) == 0判断本次传输是否完成

10:I2C_ICMDR |= ICMDR_STP; 功能:根据要求产生的停止信号

本文来源:https://www.bwwdw.com/article/hcah.html

Top