SPI(Serial Peripheral Interface:串行外设接口),是Motorola公司提出的一种同步串行数据传输标准。
I2C(INTER IC BUS:IC之间总线),是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。
UART(Universal Asynchronous Receiver Transmitter:通用异步收发器),是电脑硬件的一部分,它把将要传输的资料在串行通信与并行通信之间加以转换,UART通常被集成于其他通讯接口的连接上。UART即我们通常说的“串口”。
UART协议主要用于PC和单片机之间的通讯
空闲位:空闲状态时为高电平(1),代表无数据传输
起始位:低电平,通信开始(从空闲位(1)–>起始位(0)的变化代表通信开始)。
数据位:5-8位数据(先发低位,后发高位)。例如:发送数据为0x55(01010101),则发送的数据为(10101010)
校验位:校验数据的正确性(奇偶校验),数据位计算1的个数若为奇数为奇校验,若为偶数为偶校验。(可有可无)
停止位:1/1.5/2位(高电平),数据结束的标志。
空闲位: 高电平,代表无数据传输
注:串行通信不允许连续发送,每次只能发送一个字节数据(8位),为了防止累积误差的出现。UART是异步通信,收发双方时钟不同步,而其他通信协议如SPI、I2C等是同步通信。
如果我们传输数据0X33(00110011),那么对应的波形就是如下这样,因为是LSB在前,所以8位数据依次是11001100
发送0X33数据帧格式
如果再发其他数据,再依次循环这个过程即可。
UART是异步传输,以1个字符为传输单位,传输2个字符之间的时间间隔,比如传输0X33后再传输0X35,这两者时间间隔是未知的。
但是同一字符内相邻位间的时间间隔是确定的,比如0X33低两位的1和1之间的时间间隔是确定的,这涉及到UART传输速率的概念——波特率。
波特率的单位是bps,全称是bit per second,意为每秒钟传输的bit数量。
波特率9600bps,代表每秒钟传输bit的数量为9600,那么传输1bit数据的时间就是1/9600=104us,波特率115200bps,代表传输1bit数据的时间是8us。
两个串口之间是如何发送和接受数据呢?
首先,UART1以9600波特率发送0X33,先在数据线上放1个104us脉宽的低电平(起始位),然后是连续2个104us脉宽的高电平(2bit逻辑1),依次类推。
其次,UART2以9600波特率接收0X33,通过数这些数据的脉宽,来确认数据。
为了确保数据传输的正确性,减少误差,一般UART1和UART2之间的波特率差别小于10%,一次最多只能传输1个字节(8bit),也有效减小了累计误差。
1、电气接口不统一,UART只是对信号的时序进行了定义,但是没有定义接口的电气特性,没有规定不同器件连接时连接器的标准。不同处理器所使用的电平不一样,所以不同处理器使用UART通信时不能直接连接。
2、抗干扰能力差,因为串口使用的是TTL电平(高低电平用0和1表示)
3、通信距离极短,由于抗干扰能力差所以通信距离短。
IIC协议最早1982年由飞利浦公司设计开发,是一种两线制(SDA +SCL)的串行通信方式,提供了主从机之间通行的一种方案,在今天也是被广泛的应用在很多的产品设备上。
一个使用IIC协议进行通信的设备,它既可以作为主机又可以作为从机(支持多主多从),并且它是一种半双工的通信方式。
IIC可以支持的通信速率范围较大,可以很好的满足多种设备的不同的通信速度的要求,它支持的速率有如下几个:
(1)普通模式(100kHz即100kbps)
(2)快速模式(Fm)(400kHz)
(3)快速模式+(Fs+)(1MHz)
(4)高速模式(Hs)(3.4MHz)
(5)超高速模式(UFm)(5MHz)
1.IIC是半双工,而不是全双工
2.IIC是真正的多主机总线,(对比SPI在每次通信前都需要把主机定死,而IIC可以在通讯过程中,改变主机),如果两个或更多的主机同时请求总线,可以通过冲突检测和仲裁防止总线数据被破坏
3.起始和终止信号都是由主机发出的,连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号
4.在起始信号后必须发送一个7位从机地址+1位方向位,用“0”表示主机发送数据,“1”表示主机接收数据。
5.每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据
6.起始信号是必需的,结束信号和应答信号,都可以不要
注:实际使用中,一般是单片机作为主机,其它器件作为从机,单片机先向器件发送信息表示要读取数据,之后转变传输方向,器件发送数据到单片机。
1.使用IIC通信的IIC器件有很多,比如陀螺仪加速度计MPU6050,EEPROM存储芯片AT24C02等,通过IIC总线,可以与单片机之间进行数据传输。
2.IIC通信线只有只有两根,数据线SDA的高低电平传输2进制的数据,时钟线SCL通过方波信号提供时钟节拍
多个IIC器件可以并联在IIC总线上,每个器件有特定的地址,分时共享IIC总线,实际使用IIC当然还要连接电源以及共地哦
当SCL为高电平时,SDA由高电平向低电平跳变,表示起始信号,当SCL为高电平时候,ADA由高电平相高电平跳变,表示结束信号
注:SDA和SCL同时为高时,为IIC总线的空闲状态
2.完整的数据传输
1.开始标志(S)发出后,主设备会传送一个7 位的Slave 地址,并且后面跟着一个第8位,称为Read/Write 位。
2.R/W 位表示主设备是在接受从设备的数据还是在向其写数据。
3.然后,主设备释放SDA 线,等待从设备的应答信号(ACK)。每个字节的传输都要跟随有一个应答位。
4.应答产生时,从设备将SDA 线拉低并且在SCL 为高电平时保持低。
5.数据传输以停止标志(P)结束,然后释放总线。但主设备也可以产生重复的开始信号去操作另一台从设备,而不发出结束标志。
6.所有的SDA 信号变化都要在SCL 时钟为低电平时进行,除了开始和结束标志
上面介绍的是IIC的读写时序,实际上要对某个寄存器进行操作,还要遵循以下时序
例如,对eeprom的某个寄存器写一个字节
1.写寄存器时,主设备除了发出开始标志和地址位,还要加一个R/W 位,0 为写,1 为读
2.在第9 个时钟周期(高电平时),MPU6050 产生应答信号
3.主设备开始传送寄存器地址,并接到应答
4.然后开始传送寄存器数据,仍然要有应答信号
5.最后主设备发送停止信号。
例2,对eeprom连续地址的写操作
通信时序与上面的“写一个字节”类似,上面是写一个字节后就停止了,若要连续写,则继续写即可,只要可以收到从机Ack。
读一个字节
用于读取IIC器件某个寄存器的数值
1.首先由主设备产生开始信号,然后发送从设备地址位和一个写数据位,等待应答
2.然后发送寄存器地址,才能开始读寄存器
3.收到应答信号后,主设备再发一个开始信号,然后发送从设备地址位和一个读数据位
4.然后,作为从设备的MPU6050 产生应答信号并开始发送寄存器中的数据
5.通信以主设备产生的拒绝应答信号(nACK)和结束标志(Stop)结束
6.拒绝应答信号(nACK)产生定义为SDA 数据在第9 个时钟周期一直为高
读多个字节
也是用于读取IIC器件某个寄存器的数值,当某些数据一位字节不够表示,或有一组连续的数据需要读时,可以使用该模式。
通信时序与上面的“读一个字节”类似,上面是读一个字节后就nAck叫停,若要连续写,则发送Ack,直到不需要继续读时再回复nAck。
SPI是一个同步的数据总线,也就是说它是用单独的数据线和一个单独的时钟信号来保证发送端和接收端的完美同步。
时钟是一个振荡信号,它告诉接收端在确切的时机对数据线上的信号进行采样。
产生时钟的一侧称为主机,另一侧称为从机。总是只有一个主机(一般来说可以是微控制器/MCU),但是可以有多个从机(后面详细介绍);
数据的采集时机可能是时钟信号的上升沿(从低到高)或下降沿(从高到低)。
具体要看对SPI的配置;
整体的传输大概可以分为以下几个过程: 主机先将NSS信号拉低,这样保证开始接收数据;
当接收端检测到时钟的边沿信号时,它将立即读取数据线上的信号,这样就得到了一位数据(1bit);
由于时钟是随数据一起发送的,因此指定数据的传输速度并不重要,尽管设备将具有可以运行的最高速度(稍后我们将讨论选择合适的时钟边沿和速度)。
主机发送到从机时:主机产生相应的时钟信号,然后数据一位一位地将从MOSI信号线上进行发送到从机;
主机接收从机数据:如果从机需要将数据发送回主机,则主机将继续生成预定数量的时钟信号,并且从机会将数据通过MISO信号线发送;
注意,SPI是“全双工”(具有单独的发送和接收线路),因此可以在同一时间发送和接收数据,另外SPI的接收硬件可以是一个简单的移位寄存器。这比异步串行通信所需的完整UART要简单得多,并且更加便宜;
SPI总线包括4条逻辑线,定义如下:
(1)MISO:Master input slave output 主机输入,从机输出(数据来自从机);
(2)MOSI:Master output slave input 主机输出,从机输入(数据来自主机);
(3)SCLK :Serial Clock 串行时钟信号,由主机产生发送给从机;
(4)SS:Slave Select 片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号。
> 其他制造商可能会遵循其他命名规则,但是最终他们指的相同的含义。以下是一些常用术语;
1. MISO也可以是SIMO,DOUT,DO,SDO或SO(在主机端);
2. MOSI也可以是SOMI,DIN,DI,SDI或SI(在主机端);
3. NSS也可以是CE,CS或SSEL;
4. SCLK也可以是SCK;
本文将按照以下命名进行讲解MISO, MOSI, SCK,NSS,下图显示了单个主机和单个从机之间的典型SPI连接。
SPI总线上的主机必须在通信开始时候配置并生成相应的时钟信号。在每个SPI时钟周期内,都会发生全双工数据传输。
主机在MOSI线上发送一位数据,从机读取它,而从机在MISO线上发送一位数据,主机读取它。
就算只进行单向的数据传输,也要保持这样的顺序。这就意味着无论接收任何数据,必须实际发送一些东西!在这种情况下,我们称其为虚拟数据;
从理论上讲,只要实际可行,时钟速率就可以是您想要的任何速率,当然这个速率受限于每个系统能提供多大的系统时钟频率,以及最大的SPI传输速率。
(2). 时钟极性 CKP/Clock Polarity
除了配置串行时钟速率(频率)外,SPI主设备还需要配置时钟极性。
根据硬件制造商的命名规则不同,时钟极性通常写为CKP或CPOL。时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据;
CKP可以配置为1或0。这意味着您可以根据需要将时钟的默认状态(IDLE)设置为高或低。极性反转可以通过简单的逻辑逆变器实现。您必须参考设备的数据手册才能正确设置CKP和CKE。
CKP = 0:时钟空闲IDLE为低电平 0;
CKP = 1:时钟空闲IDLE为高电平1;
时钟相位 CKE /Clock Phase (Edge)
除配置串行时钟速率和极性外,SPI主设备还应配置时钟相位(或边沿)。根据硬件制造商的不同,时钟相位通常写为CKE或CPHA;
顾名思义,时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿;
CKE = 0:在时钟信号SCK的第一个跳变沿采样;
CKE = 1:在时钟信号SCK的第二个跳变沿采样;
CPOL时钟极性,CPHA(CKP) 时钟相位,根据寄存器中这两者的不同配置,会有不同采样电平和边沿。
(3) 时钟配置总结
综上几种情况,下图总结了所有时钟配置组合,并突出显示了实际采样数据的时刻;
其中黑色线为采样数据的时刻; 蓝色线为SCK时钟信号;
“多NSS形式”是第一种方法 SPI连接。例如,设备1有一个AD转换模块。2号设备上有一个比较器。设备3是一块液晶,他们之间没有联系,初级设备必须从何处管理。和同一件事一样的东西 和同一件事的东西 和同一件事的东西 和同一件事的东西 和同一件事的东西 和同一件事的东西 和同一件事的东西 和同一件事的东西允许从设备转换数据。
菊花链是第二类型 SPI协议。例如,装置1有一个EPROM。设备 2 包含一个 DSP 。3号设备上有一个比较器。该装置提供了三者之间的联系。当主装置的地址信号到来时这是第一次读取EPROM的数据。数据处理系统处理系统处理数据。处理后的数据,第三次设备最后比较