资讯详情

详细介绍GPIO、I2C、SPI通讯原理以及物理层原理

目录

一. GPIO

1. 什么是GPIO?

2. GPIO组成原理

3. GPIO工作原理

二. I2C

1. 什么是I2C?

2. I2C组成原理

3. I2C的特性

4. I2C的通讯模式

5. I2C的通讯过程

6. I2C接口工作模式

7. 硬件拉高拉低的过程

8. 一对多

9. 开发流程

三. SPI

1. 什么是SPI?

2. SPI优与缺点

3. SPI组成原理

4. SPI通讯模式

5. 通讯过程

前言

针对GPIO、I2C、SPI对这些通信方式的解释有一个大致的框架,这将有助于未来的发展,并理解为什么。

一. GPIO 1. 什么是GPIO? GPIO全拼叫General Purpose Input Output(通用输入输出)IO也叫总线扩展器,GPIO口由引脚、功能寄存器和不同的架构组成GPIO不同的包装,使用的引脚数量和寄存器数量不同,详见芯片手册GPIO篇。

GPIO用于控制连接GPIO我们通常通过观察原理图找到当前板的外设GPIO口在哪个口或排针上引出,我们可以通过将外设连接到上面GPIO与这个外设进行交互控制,在驱动层我们通过读写GPIO口中的功能寄存器改变连接GPIO上外设状态。

2. GPIO组成原理 GPIO原理图如下:

取自STM32F7系列,不同架构GPIO不同的口封装仅用于当前的示例

从上面原理图可以看出STM32F7系列GPIO三个寄存器和TTL肖特基触发器,二极管,P-MOS管和N-MOS管”组成

3. GPIO工作原理 电子设备的功能:

器件名

作用

输出数据寄存器 该寄存器的值由输出驱动器输出,其中指定位置用于决定使用P-MOS还是N-MOS,有些位置表示输出电平,如寄存器为4位,其中0-2位表示输出模式,第三位表示输出电平信号,数字信号1高电平,数字信号0低电平 P-MOS Vgs(电荷)如果小于一定值,就会导通,利用这一特性,实现推拉和泄漏输出 N-MOS Vgs(电荷)如果大于一定值,就会导通,利用这一特性,实现推拉和泄漏输出 保护二极管 IO引脚上下两侧的两个二极管用于防止引脚外部过高和过低的电压输入。当引脚电压高于时VDD当引脚电压低于引脚电压时,上二极管导通;VSS下二极管导通,防止芯片因异常电压引入而烧毁,即只有电流不高于VDD也不低于VSS才能正常通过 TTL肖特基触发器 用于将电流信号转换为模拟数字信号0或1。当使用模拟输入时,它不会通过触发器。模拟输入是指不通过内部转换器,需要外部外部adc进行ad采样转换 每个GPIO口有一组引脚连接,这组引脚,比如PA-PG(引脚号)连接到GPIOA引脚的作用之一是输出,直接说GPIO口是可编程的引脚,我们对GPIO配置口中的寄存器,让口中的寄存器CPU高电平输出特定的引脚。

这两种模式涉及一个知识点,即推拉和泄漏输出P-MOS与N-MOS实现了两个晶体

P-MOS与N-MOS的区别

P-MOS是接了VDD(正极电源),因此具有输出高电流的能力P-MOS高电平就可以导通P-MOS管道,因为一旦连接到电源线,电源线中的工作电压就可以流通,N-MOS上面接了VSS,若给高电平不能导通,因为没有电源线就不能输出高电平,如果给了N-MOS即使高电平流通,因为没有VDD电源线不能正常输出电流,如果给出低电平,就会流动VSS所以N-MOS只有低电平才能有效。如果你想,N-MOS驱动电阻可外接驱动。

所以这里输出低电流输出到N-MOS晶体管的引脚上,那么始终输出的是接地部分,可以有效降低材料的消耗率。

以下是高电平和低电平在电路中的区别:

这里以TTL列出电路,高电平>3.4V,低电平<0.2V,所以即便N-MOS它也是低电平,没有输出任何电流。

在输出高低电平时,使用这两个装置可以保证材料的消耗率降低,如果使用一条线输出高低电平,损耗就会增加,N-MOS因此,输出端实际上没有电流,这将大大降低消耗率。

MOS有两种类型的场效应管,P沟通和M沟通取决于哪种类型MOS源接在VDD还是VSS,接在VDD是P沟,连接VSS就是M沟道

推挽输出

连接到输出控制电路的数字设备可以输出高电平和低电平,并在0小时内输出数字信号N-MOS导通,P-MOS高阻,1点输出数字信号P-MOS导通,N-MOS高阻抗

开漏输出

只能输出低电平,0小时输出数字N-MOS导通,P-MOS如果需要输出高电阻,则需要输出高电平N-MOS晶体管后引脚上的上拉电阻将所有不确定信号转换为高电平,只能从N-MOS这条线流过,导致它无法输出高电平

输出电路将获得输出数据寄存器中当前的模式位置,如推拉或泄漏,如果推拉,则使用电路比较器进行电流比较,以确定输出到P-MOS还是N-MOS,若开漏模式为依据N-MOS导通功能和当前数字信号值0/1输出相应的电流导通。同时,当电路工作时,两个对称的功率开关管每次只有一个导通,导通损耗小,效率高。

泄漏负载能力强,由于上拉电阻,设备一般会长时间输出泄漏

二. I2C 1. 什么是I2C? I2C全拼Inter Integrated Circuit,简称IIC或I2C,是由Philips公司开发的两线时串行总线SOC与外设的连接通讯,它只需要两根线就能实现I2C通信采用主从模式,主方可以读写数据,而从方只能等待被读写。从方没有主动权。

I2C双向通信由两条线完成,即:SDA(串行数据线),SCL(串行时钟线),接口输出模式为泄漏输出,其总线接口已集成到SOC在内部,我们只需要通过原理图找到它的接口,并通过外设杜邦线或其他方法连接到它I2C的通讯。

SDA与SCL上拉电阻外接,所以当SDA空闲时间的输出总是高电平的,对外设也有一定的要求。外设的输出模式也是泄漏输出,因为这与其自身的电路实现有关。如果两个电路接口模式不同,则无法完成正常通信。

其中I2C内部的上拉电阻不是随意使用的,因为电阻值越高,信号提升周期越长,通信周期时间越高,速降。

I2C为每个设备提供一个地址,可以通过这个地址找到不同的设备,以显示不同的设备,只有当设备收到自己的地址时。

因为连接在I2C可能有很多设备,从设备需要设置自己的地址,主设备不需要,因为主设备不会从设备读写,主设备负责读写其他设备。

通讯时会有一个起始数据,这个数据是9个bit前七位是设备地址,最后一位是方向(0/1(读或写)

这说明设备地址不能超过7个bit

2. I2C组成原理 架构图:

SMBA线用于SMBUS 警告信号,I2C 不使用通信,可以忽略

I2C内部有自己的控制单元,用于处理I2C通信可以说是一个小芯片,它不属于CPU,它只是集成的SOC里面(看架构,有些架构没有)

3. I2C的特性 仅需两根线 接口集成在PCB内部 由于是泄漏输出,电流消耗较小(高电流由上拉电阻完成,通常设备不需要输出高电平,因此功耗较小) 大多数开发板支持世界级标准 一对多,一条线与外设连接,通过地址区分,节省排版空间 4. I2C的通讯模式 双向传输总线:

模式

速率(kbit/s)

标准模式(Standard-mode) 100 快速模式(Fast-mode) 400 快速模式 (Fast-mode Plus) 1M 高速模式(High-speed mode) 3.4M 单向传输总线:

模式

速率(kbit/s)

超快速模式(Ultra Fast-mode) 5M 这些模型是由速度决定的,也就是说,我们将I2C如果将通信速率设置为与上述相对应的速率,则处于此模式。事实上,这么快就有延迟,因为它取决于上拉电阻的电阻值,因为当信号通过上拉电阻时,会有一个周期变化,这与电阻值不同。

设置方法:

根据现在的情况,我们需要PCLK计算时钟频率,这置PWM占空比类似,都需要经过计算然后设置I2C里的CCR由于频率不同,时钟控制寄存器的值。

例如:时钟频率为66MHZ,预分频值是65MHZ,如果系数是1/2,计算公式如下:

时钟频率=PCLK/(预分频值 1)/分频系数

PCLK我们知道是66,分频值是65,分频系数是1/2,除了2

所以公式:66/(656 1)/2 =0.5

在将0.5转化为HZ的单位:0.5*1000=500KHZ,这里还有一个公式,即使HZ转秒,赫兹的倒数是它的秒公式:(1/500)=0.002ms,1毫秒=1000微秒,0.002毫秒等于2微秒。通过这个算法公式,我们可以知道我们目前的频率是每2微秒工作一次

让它每0.工作5毫秒,所以TCNTB的值=500毫秒/当前微秒频率2

500/2=250,所以TCNTB值应该是250,当然也可以算,2微秒一次,1毫秒=1000微秒,0.5毫秒等于500微秒,500微秒/2微秒=250次2微秒后达到500微秒,500微秒等待0.5毫秒

5. I2C的通讯过程 通讯步骤:

开始信号:SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件 结束信号:SCL为高电平而SDA由低到高的跳变,表示产生一个 停止条件 应答信号:当发送完信号之后则拉低 总线在空闲状态时,SCL和SDA都保持着高电平

这三种信号里,起始信号是必须需要的,而结束信号和应答信号都可以视情况不要。

在起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件无法访问总线;而在停止条件产生后,本次数据传输的主从设备 将释放总线,总线再次处于空闲状态

传输过程:

每次传输时的数据/地址以9位bit进行传输,前8位是数据,最后一位是应答位 传输时高位在前,低位在后 主设备在SCL和SDA都处于高电平状态时,先将SDA拉到低电平,然后在将SCL也拉入低电平,这样SDA产生了一个下降沿的信号,从设备检测到之后便知道主设备发来了起始信号,那么从设备需要主动拉高SDA线告诉主设备我准备好了

这个电平变化不是说一个时间点的变化,比如上一秒是高电平下一秒是低电平这不算变化,时间点变化是要求在一个周期里某一时间段处于高电平,某一时间段处于低电平,整个周期里完成这样一个动作才属于上升沿或下降沿变化,这个周期取决于I2C的时钟频率 如下图的周期变化,假设一个周期是1.2毫秒,那么这个毫秒里的周期变化如下

T1到T2之间处于高电平,T3到T4之间处于低电平,然后整个周期就变成了下降沿的信号 然后主设备会在SCL线上产生时钟周期的脉冲信号,即发高电平,每产生一个脉冲信号都会从SDA线上发送一个数据出去,然后从设备检测到脉冲信号了就从SDA线上去读一个BIT位,在产生脉冲信号之后,SCL是处于低电平的,那么此时SDA电平会根据传输的数字信号进行翻转(为了防止数据不稳定,要求在SCl处于低电平时SDA才允许改变电平值,SCL发送一次脉冲信号后会要求拉低电平) 首先最开始发送的是地址信息,每次有效位为8位,当主设备发送8位之后就不会在发了,且发送完八位以后会主动让SDA线一直处于高电平(因为SDA线发送BIT可能是高或低电平,可能第8位是低电平所以需要拉高回来),然后就会一直等待从设备拉低,当从设备拉低以后那么主设备监听到之后就会认为此次通讯是正确的

然后接下来就可以发送数据位了,与地址信息一样,SCL产生脉冲之后SDA进行翻转,从设备进行读取,当发送完成之后就需要产生停止位,这个是由主设备完成的,会拉高SCL电平使其一直处于高电平,然后将SDA进行周期变化:上升沿,即在一定周期里拉低电平然后在拉高电平,然后此时SCL与SDA都处于高电平模式,则代表总线处于空闲状态可以被其它设备占用

从设备是需要实时监听SCL的电平变化,来完成对应的动作

以下是发送170(十六进制:0xAA; 二进制:1010 1010)到从设备的传输时序:

总结理解起始与结束信号就是:

起始条件:SCL线是高电平时,SDA线从高电平向低电平切换。 停止条件:SCL线是高电平时,SDA线从低电平向高电平切换。 这其中还有重复起始条件,即不用停止符号,只需要发送一个重复起始条件后续可以发送任意字节的数据,当全部发送完成之后在发送停止条件

即在不释放总线的情况下给从设备发送Sr信号,然后重复上一次的传输,这样做的好处在于不会出现在传输期间被别的设备抢占的情况,因为每次传输结束都会有一定的空闲时间,如果这个时间周期被别的设备占用会出现一些数据不完整的情况,因为每次传输只能传输一个字节的有效数据位,每次通讯都要产生起始和结束信号,所以会有一定的空闲时间 具体的通讯步骤可以参考I2C官方文档

6. I2C接口工作模式 I2C接口有四种工作模式

工作模式

介绍

从发送器模式    从设备收到主设备发来的ADDR地址后,将内部的数据寄存器里的值通过数据控制模块,发送给SDA总线,这种模式一般应用于主设备读取从设备里的数据 从接收器模式    从设备收到主设备发来的ADDR地址后,通过数据控制模块将SDA总线的数据存于到数据寄存器中 主发送器模式    在发送ADDR地址后且得到从设备响应后将数据寄存器里的值发送到SDA总线上 主接收器模式    在发送ADDR地址后且得到从设备响应后将SDA总线上的数据写入到数据寄存器中 数据寄存器一般是DR寄存器(数据缓存寄存器),这块寄存器是等待内部程序将其读走的

其中因为是高位到地位发送的,所以内部会有一个位移寄存器的过程才能写入到DR寄存器

7. 硬件拉高拉低的过程 I2C的SDA与SCL都外接了上拉电阻,如果一直处于拉高状态那么只能输出高电平无法输出低电平,那么数字逻辑信号时钟是1,这样结果是不对的,所以需要有一个拉低的过程才能保证传输的bit位是有效且正确的。

I2C内部有一个逻辑控制器,负责控制这一块,当需要上拉时候会控制FET(场效应管,主要作用是控制半导体器件,控制电阻值),来拉低上拉电阻值使其电流固定在低电平值范围,产生低电平信号

拉低:

拉高:

 S3C2400的物理层的拓扑结构(仅供参考):

8. 一对多 I2C给每个从设备设置地址,然后通过发送地址位来选择要操控哪个从设备。

在每个从设备连接后需要设置自己的地址,便于I2C主设备查找。

每个设备连接到I2C的SDA与SCL上,然后I2C主设备对这条线发送地址当从设备收到以后来确定是否是寻找自己

下图的连接就是将所有设备的SCL与SDA连接到I2C的主设备上,也就是说将I2C主设备的SDA与SCL引出来,然后从设备接到这根线上去,然后发送数据时接在这跟线上的所有设备都能监听到电平变化,就像socket的广播模式一样。

主设备是不需要设置自身地址的,因为不会有人找它,当然如果要与其它外设进行合作开发,可以设置一个自己的地址,并编写监听代码让自己做主或从

9. 开发流程 以下是我在资料里找到的开发流程,若裸机编程可以用作参考

主机接收模式:

主机发送模式:

三. SPI 1. 什么是SPI? SPI全拼Serial Peripheral interface(串行外围设备接口),是由Motorola(摩托罗拉)在MC68HCXX系列处理器上定义的,主要应用于EEPROM(带电可擦可编程只读存储器),FLASH,RTC(实时时钟),AD转换器,还有数字信号处理器和数字信号解码器。

SPI,是一种高速的,全双工,同步的通信总线,且只需要四根引脚线,与I2C一样都大大简化了PCB板子的布局空间,SPI依然是一种世界级的流行标准,大多数板子都内置了SPI的接口。

Motorola设计它的初衷也是为了节约排版空间。

2. SPI优与缺点 优点

支持全双工通信 通信简单 数据传输速率块 缺点

没有指定的读写方向控制 没有应答机制确认是否接收到数据 跟I2C总线协议比较在数据,可靠性上有一定的缺陷 3. SPI组成原理 SPI模块框架图

SPI结构

上图结构中的SCK、SS、SDO、SDI是比较重要的几根线,其作用如下:

名称

作用

SCK    串行时钟信号,主设备产生 SS    片选线,主要用于发送片选CS信号,即选择从设备 SDO    主设备输入,从设备输出 SDI    主设备输出,从设备输入 对于SS片选信号这里在多解释一下,在SPI中可能存在许多设备,但是只能有一个主设备,主设备通过SS线来控制选择哪个设备,默认情况下SS线是低电平状态,主设备通过选择连接在对应SS线下的设备,然后使其发送高电平,当连接在对应SS线上的设备收到高电平时就会做出响应,开始接收SDO或SDI的数据,SS线会有多个,可以外接许多设备,SCK与SDO、SDI只有一个,其它设备都接在上面。

其内部是有DR寄存器与位移寄存器,用来存数据与写数据

4. SPI通讯模式 SPI有四种通讯模式,分别是:

Mode0 Mode1 Mode2 Mode3 SPI官方没有给定名字,只给了模式0-3,其作用如下:

模式

作用

Mode0

SCLK输出数字信号0时处于空闲状态,SCLK输出数字信号为1时则代表有效状态 Mode1    SCLK输出数字信号0时处于空闲状态,SCLK输出数字信号为1时则代表有效状态,数据采样是在第2个边沿,数据发送在第1个边沿 Mode2

SCLK输出数字信号0时处于有效状态,SCLK输出数字信号1时处于空闲状态 Mode3    SCLK输出数字信号0时处于有效状态,SCLK输出数字信号1时处于空闲状态,数据采样是在第1个边沿,数据发送在第2个边沿 这些模式我们需要通过设置SCLK的”CPOL(时钟极性)和CPHA(时钟相位)”模式来完成,你可以把CPOL与CPHA理解为一个标志位,它们标志位不同会使SCLK的输出电平状态不同,也会改变数据输出的边沿

SPI工作模式与CPOL和CPHA的对应关系以及它俩的作用:

模式

CPOL

CPHA

Mode0    0    0 Mode1    0    1 Mode2    1    0 Mode3    1    1 边沿

这里说一下在SPI中什么是边沿,这里的第1个边沿与第2个边沿表示的是电平变化

边沿表示的是上升沿或下降沿

上升沿:即在一定周期时由低电平变化到高电平,然后此时在进行数据采样,即电平信号到数字信号转换

下降沿:即在一定周期时由高电平变化到低电平,然后此时在进行数据采样,即电平信号到数字信号转换

CPOL

用来决定SCL空闲时应该是怎样的电平状态,若为0,SCLK空闲时输出低电平,若为1空闲时输出高电平

CPHA

它用来表示该SDI有效还是SDO有效,若它的值为0则代表第0个边沿数据采样,即SDI上可以进行数据采样,若它为1时则SDO数据可以进行采样

同时它与CPOL是关联的:

若CPHA为0,CPOL为0时:

若CPOL为0,则第一个边沿有效,即SCLK空闲时是低电平,那么边沿就等于上升沿,同时SDI输出信号,SDO可以采样了

若CPHA为0,CPOL为1时:

若CPOL为1,则第一个边沿有效,即SCLK空闲时是高电平,那么边沿就等于下降沿,同时SDO输出信号,SDI可以采样了

SDI与SDO线对主设备和从设备方向不同,SDI线在主设备上是输出,从设备上是输入,所以它们是相反的,所以当SDI输出信号时,对于从设备来说,它就可以读数据了所以主设备与从设备两根线SDO与SDI两根线作用是不一样的,所以上面的状态对于不同的设备是相反的,也就是刚好实现了主设备写时,从设备读,主设备读时,从设备写 采样意思是设备可以去某个线上去读数据了

SPI是没有控制信号的,只能通过SCLK时钟的状态来告诉从设备现在的流方向,从设备需要实时检测当前的SCLK状态

工作时需要保证从设备与主设备一致的工作模式,其次许多从设备在出厂时就已经设定好了工作模式,是无法修改的,有些从设备是可以修改的。

5. 通讯过程 首先拉高对应设备的SS线,选择对应的从设备 通过SLCk产生时钟边沿变化,来告诉从设备读写 主设备里的控制逻辑通过位移寄存器从高到低的方式移动给SDI总线上 从设备接收到之后也通过位移寄存器的方式按照顺序移到DR寄存器中 这里给大家看一下SCLK产生时钟周期时做了什么 如下图,当SCLK周期开始变成低电平时则代表数据有输出了,当变成高电平时则代表数据可以采样(读)了,即输出→输出完成,这是整个周期做的事情,下位机只需要等待周期变化完成之后根据当前模式去到指定的线上读或写数据就可以了  

SPI是双向的,主机发的时候一样可以收从机的数据,在一个周期里完成数据交换,但是只有一个DR寄存器,所以SPI的方法是位移,主机高到低,从机低到高的交换,当主机高位移出去,低位就空一个出来,而从机低位移出一位,高位就空出一位

 在通讯之前需要保证双方时钟频率是一致的,一般情况下从设备是无法修改时钟频率的,只有主设备能够修改时钟频率,将主设备的时钟频率修改与从设备一致,默认情况下是不需要修改这些的,这个可以根据芯片手册中SPI上的使能时钟接的是谁,如果提供了GPIO口进行修改那么就支持可编程时钟,若没有则代表当前的MCU不支持编程SPI的时钟频率 ———————————————— 版权声明:本文为CSDN博主「17岁boy想当攻城狮」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/bjbz_cxy/article/details/119925257

标签: 2sa1106晶体管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台