关注分享主机优惠活动
国内外VPS云服务器

IIC协议详解、单片机软件仿真源码(单片机i2c代码)

摘要:协议物理层原理的总体特征。 协议层的启动和停止条件。 数据有效性响应。 回复。 寻址。 读取数据。 写入数据。 微控制器通信软件模拟硬件外设。 物理层原理总线由串行数据线和串行数据线组成。 它由行时钟线和上拉电阻组成。 步骤8:主机发送校验码。 该校验值是根据步骤数据生成的校验码。

I2C协议物理层原理总体特点协议层起止条件数据有效性响应/响应寻址读数据写数据单片机通信软件仿真硬件外设(一)物理层

1. 原理I2C总线由SDA(串行数据线)、SCL(串行时钟线)和上拉电阻组成。

通信原理是通过控制SCL和SDA线的高低电平时序,产生I2C总线协议进行数据传输所需的信号。 当总线空闲时,这两条线通常会被上面连接的上拉电阻拉高并保持高电平。

2. 总体特性

要执行线与功能,连接到总线的器件的输出级必须是漏极开路或集电极开路。

I2C总线上的每个设备都可以作为主设备或从设备,每个设备都对应一个唯一的地址(可以从I2C设备数据表中找到)。 主从设备之间 该地址用于确定与哪个设备进行通信。

I2C总线上的数据传输速度在标准模式下可以达到100kbit/s,在高速模式下可以达到400kbit/s,在高速模式下可以达到3.4Mbit/s。 接口数量仅受 400pF 总线电容的限制。

I2C 总线上主从设备之间以字节(8 位)为单位进行双向数据传输。

(2)协议层1。启动和停止条件

I2C 协议规定总线上的数据传输必须使用启动信号作为启动条件,并使用结束信号作为停止条件进行传输。

开始和结束信号始终由主设备生成。

当总线空闲时,SCL 和 SDA 都保持高电平。 当SCL为高电平且SDA从高电平跳变为低电平时,表示启动条件已产生。 当 SCL 为高电平并且 SDA 从低电平转换为高电平时,表示停止条件。 起始条件产生后,总线变得繁忙,并由主/从设备独占进行本次数据传输。 没有其他 I2C 设备可以访问总线。 停止条件产生后,本次数据传输的主/从设备释放总线。 又闲了。 2. 数据有效性

当SCL为高电平时,SDA线上的数据必须保持稳定。

只有当SCL线上的时钟信号为低电平时,SDA线的高电平或低电平状态才会改变。

SDA 线上发送的每个字节必须是 8 位。 一次传输中可以发送的字节数没有限制。 每个字节后面必须跟有一个响应位。 首先传输数据的最高有效位(见下图)。

如果从机接收或在接收前需要完成其他功能(如中断),可以将时钟线SCL拉低以传输下一个完整的数据字节,主机被迫进入待机状态。 。 当从机准备好接收下一个数据字节时,时钟线SCL被释放,数据传输继续。

3. 响应

发送数据需要响应。 相关的响应 SCL 时钟脉冲由主机生成。 在响应时钟脉冲期间,发送器释放SDA线(输出高阻状态,SDA线被上拉电阻拉高)。 在响应时钟脉冲期间,接收器必须将SDA线拉低,以便SDA线在此时钟脉冲的高电平期间始终保持低电平。 必须考虑建立和保持时间。

4、寻址7位地址格式

起始条件S后,发送从机地址SLAVE ADDRESS。 该地址总共由 7 位组成。 , 其次是Bit 8 是数据方向位[R/W],其中0 表示写入,1 表示读取。 下一位是响应位 NACK/ACK。 发送该帧的前 8 位后,接收器获得 SDA 控制权。 然后,接收设备必须在第 9 个时钟脉冲之前响应 ACK(将 SDA 拉低)。 表示接收正常。 如果接收设备没有将SDA拉低,则可能是接收设备没有在接收数据(例如,所寻址的设备不存在或设备正忙),或者没有接收到所接收的消息。无法解析。 在这种情况下,主机决定如何处理它(停止或重复启动条件)。

10 位地址格式

10 位从机地址由组合起始条件 S 或重复起始条件 Sr. Masu 后的前 2 个字节组成。

第一个字节的前 7 位是组合 11110XX。 其中最后两位数字 XX 是 10 位地址的两个最高有效位 MSB。

第一个字节的第 8 位是 R/W 位,决定消息的方向。 0表示写,1表示读。

如果R/W位为0,则下一个字节是10位从机地址的剩余8位。

如果R/W位为1,则下一个字节是从机发送到主机的数据。

仲裁过程

主机只能在总线空闲时开始传输。 两个或多个主设备可以在最短启动条件持续时间内生成启动条件,从而在总线上产生指定的启动条件。

当SCL线为高电平时,仲裁发生在SDA线上。 这样,当另一个主机发送低电平时,发送高电平的主机就失去了竞争,因为总线上的电平与自己的电平不同。

仲裁可能涉及多人。 第一阶段比较地址位。 如果每个主机都尝试对同一设备进行寻址,则当主机充当发送器时,仲裁将继续比较数据位,而当主机充当接收器时,仲裁将继续比较响应位。

IIC总线地址和数据信息由仲裁获胜的主机决定,因此仲裁过程中不会丢失任何信息。

失去仲裁的主机可以生成时钟脉冲,直到失去仲裁的字节结束。

可以看到,如果启动信号的第三个时钟周期为低电平,DATA1的SDA输出高电平,DATA2向SDA输出低电平。 通过保持 SDA 总线电平为低,仲裁权交给 DATA2。 这意味着 DATA1 上的主机不再竞争,将不再发送数据。 DATA1主机赢得仲裁,SDA总线发送的数据与DATA1发送的数据匹配。

5、读取数据

以7位寻址为例,CPU作为主接收器

第一步,主机发送启动信号S。马苏。

第二步,主机发送7位从机地址。 请注意,发送数据时不能发送7bit数据。 这里,发送7bit地址+1bit读/写选择位,即7bit+R/W。 最低有效位为 1(用于读取)和 0(用于写入)。

第三步是从机产生ACK响应信号。

//第四步,主机发送寄存器地址。 //第五步,从机产生ACK响应信号。 //第六步,主机再次发送启动信号。 //第七步,主机发送7位从机地址,即7位+R/W。 最低有效位为 1(用于读取)和 0(用于写入)。 //第8步,从机产生ACK响应信号。

第9步,主机读取1字节(8位)数据(相当于从机发送1字节)。 在步骤10中,CPU产生ACK响应信号。

//第11步,读取CRC校验码。

第12步,CPU产生NACK无响应信号。 步骤13:主机产生停止信号。

传统用法是步骤 1、2、3、9、10、12、13。 注释掉的是单片机集成硬件IIC配置通信的整个通信流程。

6. 写入数据

CPU 作为主发送

第一步,主机发送启动信号。

第二步是发送7位从机地址。 这里要小心,发送数据时不能发送7bit数据。 这里,发送7bit地址+1bit读/写选择位,即7bit+R/W。 最低有效位为 1(用于读取)和 0(用于写入)。

第三步是从机产生ACK响应信号。

//第四步,主机发送寄存器地址和8位数据。 //第五步,从机产生ACK响应信号。

第六步,主机发送一字节(8位)数据。 步骤7:从机产生ACK响应信号。

//第八步,主机发送CRC校验码。 该CRC校验值是由步骤2、4和6的数据生成的校验码。

在步骤9中,从机可以发送响应信号或不响应信号。 步骤10,主机发送停止信号。

(三)单片机IIC通信 1、软件仿真

以CPU与EEPROM通信为例。

相关函数:

void I2C_Delay(void);//Delay延时到防止微控制器运行太快 void I2C_Start(void); //开始信号 void I2C_Stop(void); //结束信号 u8 I2C_SendByte(u8 data); //写入字节 u8 I2C_ReadByte(void); void EEPROM_Write(u8 address, u8 data);//写入EEPROM地址u8处的数据 EEPROM_Read(u8 address);//读取EEPROM地址处的数据

stm32软件仿真配置流程:

初始化GPIO

void I2c_Init(void); //初始化GPIO

打开模拟总线SDA、SCL、GPIO引脚漏极输出

写启动信号函数

void I2C_Start(void); // 启动信号

SDA, SCL 变为高电平并延迟

SDA = 1;delay();

SDA 从高电平变为低电平并延迟。

SDA = 0;

SCL 变低,等待发送/接收并延迟

SCL = 0;

写入结束信号函数

>

void I2C_Stop(void); // 终止信号

将SCL拉低,然后将SDA拉低(SCL为低时SDA可变)并延迟

SDA = 0;延迟();

将SCL拉高并延迟。

SCL = 1;

SDA 由低电平变为高电平并被延迟。

SDA = 1;

响应信号等待函数

u8 I2C_WaitToAck(void); // 读取设备ACK响应

生成/不生成ACK响应

p > void I2C_Ack(void);void I2C_NoAck(void);

写字节

读字节

p> //delay static void I2c_Delay(void){ /*CPU 主频 72MHz 10 :SCL频率205KHz 7:SCL频率347KHz,高电平1.5us,低电平2.87us; 5:SCL频率421KHz,高电平1.25us,低电平2.375us */u8i; for(i = 0 ; i

未经允许不得转载:主机频道 » IIC协议详解、单片机软件仿真源码(单片机i2c代码)

评论 抢沙发

评论前必须登录!