产品概述

spi总线单片机 单片机常用的几种通信接口,I2C,SPI,UART等

小编 2025-07-03 产品概述 23 0

单片机常用的几种通信接口,I2C、SPI、UART等

在嵌入式系统中,板上通信接口是指用于将各种集成电路与其他外围设备交互连接的通信通路或总线。以下内容为常用板上通信接口:包括I2C、SPI、UART、1-Wire:

I2C总线

I2C总线是一种同步、双向、半双工的两线式串行接口总线。这里,半双工的含义是指在任意给定的时刻,只有一个方向上是可以通信的。I2C总线最早由Philips半导体公司于20世纪80年代研发面市。I2C最初的设计目标是为微处理器/微控制器系统与电视机外围芯片之间的连接提供简单的方法。I2C总线由两条总线组成:串行时钟线SCL和串行数据线SDA。SCL线——负责产生同步时钟脉冲。SDA线——负责在设备间传输串行数据。I2C总线是共享的总线系统,因此可以将多个I2C设备连接到该系统上。连接到I2C总线上的设备既可以用作主设备,也可以用作从设备。主设备负责控制通信,通过对数据传输进行初始化/终止化,来发送数据并产生所需的同步时钟脉冲。从设备则是等待来自主设备的命令,并响应命令接收。主设备和从设备都可以作为发送设备或接收设备。无论主设备是作为发送设备还是接收设备,同步时钟信号都只能由主设备产生。在相同的总线上,I2C支持多个主设备的同时存在。图1-1显示了I2C总线上主设备和从设备的连接关系。当总线空闲时,SDA 和SCL 都处于高电平状态,当主机要和某个从机通讯时,会先发送一个开始条件,然后发送从机地址和读写控制位,接下来传输数据(主机发送或者接收数据),数据传输结束时主机会发送停止条件。传输的每个字节为8 位,高位在前,低位在后。

开始条件:SCL 为高电平时,主机将SDA 拉低,表示数据传输即将开始。从机地址:主机发送的第一个字节为从机地址,高7 位为地址,最低位为R/W 读写控制位,1 表示读操作,0 表示写操作。

一般从机地址有7 位地址模式和10 位地址模式两种,如果是10 位地址模式,第一个字节的头7 位是11110XX 的组合,其中最后两位(XX)是10 位地址的两个最高位,第二个字节为10 位从机地址的剩下8 位,如下图所示:

应答信号:每传输完成一个字节的数据,接收方就需要回复一个ACK(acknowledge)。写数据时由从机发送ACK,读数据时由主机发送ACK。当主机读到最后一个字节数据时,可发送NACK(Notacknowledge)然后跟停止条件。数据:从机地址发送完后可能会发送一些指令,依从机而定,然后开始传输数据,由主机或者从机发送,每个数据为8 位,数据的字节数没有限制。重复开始条件:在一次通信过程中,主机可能需要和不同的从机传输数据或者需要切换读写操作时,主机可以再发送一个开始条件。停止条件:在SDA 为低电平时,主机将SCL 拉高并保持高电平,然后在将SDA 拉高,表示传输结束。

SPI总线

SPI总线是同步、双向、全双工的4线式串行接口总线,最早由Motorola公司提出。SPI是由“单个主设备+多个从设备”构成的系统。需要说明的是:在系统中,只要任意时刻只有一个主设备是处于激活状态的,就可以存在多个SPI主设备。常运用于EEPROM、FLASH、实时时钟、AD转换器、数字信号处理器和数字信号解码器之间实现通信。为了实现通信,SPI共有4条信号线,分别是:(1)主设备出、从设备入(Master Out Slave In,MOSI):由主设备向从设备传输数据的信号线,也称为从设备输入(Slave Input/Slave Data In,SI/SDI)。(2)主设备入、从设备出(Master In Slave Out,MISO):由从设备向主设备传输数据的信号线,也称为从设备输出(Slave Output/Slave Data Out,SO/SDO)。(3)串行时钟(Serial Clock,SCLK):传输时钟信号的信号线。(4)从设备选择(Slave Select,SS):用于选择从设备的信号线,低电平有效。SPI使用方法:上图所示芯片有2 个SPI 控制器,SPI 控制器对应SPI 主设备,每个SPI 控制器可以连接多个SPI从设备。挂载在同一个SPI 控制器上的从设备共享3 个信号引脚:SCK、MISO、MOSI,但每个从设备的CS 引脚是独立的.主设备通过控制CS 引脚对从设备进行片选,一般为低电平有效。任何时刻,一个SPI 主设备上只有一个CS 引脚处于有效状态,与该有效CS 引脚连接的从设备此时可以与主设备通信。所以,SPI通信方式可以使用“一主多从”的结构进行通信。每个连接到总线上的器件都有唯一的地址,主设备启动数据传输并产生时钟信号,从设备被主设备寻址,同一时刻只允许有一个主设备。从设备的时钟由主设备通过SCLK 提供,MOSI、MISO 则基于此脉冲完成数据传输。SPI 的工作时序模式由CPOL(Clock Polarity,时钟极性)和CPHA(Clock Phase,时钟相位)之间的相位关系决定,CPOL 表示时钟信号的初始电平的状态,CPOL 为0 表示时钟信号初始状态为低电平,为1 表示时钟信号的初始电平是高电平。CPHA 表示在哪个时钟沿采样数据,CPHA 为0 表示在首个时钟变化沿采样数据,而CPHA 为1 则表示在第二个时钟变化沿采样数据。根据CPOL 和CPHA 的不同组合共有4 种工作时序模式:CPOL=0,CPHA=0、CPOL=0,CPHA=1、CPOL=1,CPHA=0、CPOL=1,CPHA=1

UART

UART——通用异步收发传输器,UART 作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。在应用程序开发过程中使用频率较高的数据总线。基于UART的数据传输是异步形式的串行数据传输。基于UART的串行数据传输不需要使用时钟信号来同步传输的发送端和接收端,而是依赖于发送设备和接收设备之间预定义的配置。对于发送设备和接收设备来说,两者的串行通信配置(波特率、单位字的位数、奇偶校验、起始位数与结束位、流量控制)应该设置为完全相同。通过在数据流中插入特定的比特序列,可以指示通信的开始与结束。当发送一个字节数据的时候,需要在比特流的开头加上起始位,并在比特流的末尾加上结束位。数据字节的最低位紧接在起始位之后。UART 串口的特点是将数据一位一位地顺序传送,只要2 根传输线就可以实现双向通信,一根线发送数据的同时用另一根线接收数据。UART 串口通信有几个重要的参数,分别是波特率、起始位、数据位、停止位和奇偶检验位,对于两个使用UART 串口通信的端口,这些参数必须匹配,否则通

起始位:表示数据传输的开始,电平逻辑为“0” 。数据位:可能值有5、6、7、8、9,表示传输这几个bit 位数据。一般取值为8,因为一个ASCII 字符值为8 位。奇偶校验位:用于接收方对接收到的数据进行校验,校验“1” 的位数为偶数(偶校验) 或奇数(奇校验),以此来校验数据传送的正确性,使用时不需要此位也可以。停止位:表示一帧数据的结束。电平逻辑为“1”。波特率:串口通信时的速率,它用单位时间内传输的二进制代码的有效位(bit) 数来表示,其单位为每秒比特数bit/s(bps)。常见的波特率值有4800、9600、14400、38400、115200 等,数值越大数据传输的越快,波特率为115200 表示每秒钟传输115200 位数据。

1-Wire接口

1-Wire接口是由Maxim Dallas半导体公司(首页为http://www.maxim-ic.com)开发的异步半双工通信协议,也称为Dallas 1-Wire®协议。其中,按照主-从通信模型,只使用单条信号线DQ实现通信。1-Wire总线的一个重要特征在于,该总线允许在信号线上传输能量。1-Wire接口支持在总线上连接单个主设备以及一个或多个从设备。

并行接口

板上并行接口(parallel interface)通常用于系统与外围设备之间的通信,其中,外围设备通过存储器映射到系统的主控端。只要嵌入式系统的主控处理器/控制器含有并行总线,支持并行总线的设备就可以直接连接到该总线系统上。外围设备与主控端之间具有控制信号接口,可以控制并行总线上的数据通信。这里,通信的控制信号包括读/写信号和设备选择信号。一般说来,外围设备具有设备选择线;只有当主控处理器选通该线的时候,该设备才是有效的。数据传输的方向可以是从主控端到外围设备,也可以是从外围设备到主控端;这是通过读和写控制信号线进行控制的。只有主控处理器能够控制读控制信号和写控制信号。一般说来,外围设备通过存储器映射到主控处理器,从而可以访问分配的地址范围。此时,设备需要使用地址译码电路来产生芯片选择信号。当处理器选择的地址位于设备指定范围内的时候,译码电路对芯片选择线进行触发,从而激活设备。然后,处理器可以使能相应的控制线(分别是RD\与WD\),从而由设备读出数据,或者是向设备写入数据。为了实现并行通信,系统需要严格遵循时序规范。前面已经提到过,并行通信是由主控处理器启动的。如果某外围设备想要对通信进行初始化,那么可以向处理器发出中断,告知相关信息。为了实现上述功能,设备的中断线需要连接到处理器的中断线上,并且主控处理器需要触发相应的中断。需要说明的是,主控处理器的数据总线宽度决定了并行接口的宽度,可以是4位、8位、16位、32位、64位等。设备支持的总线宽度应该与主控处理器完全相同。

免责声明:本文内容来源于网络,整理者李逍遥;文章版权归原作者所有,意在传播相关技术知识&行业趋势,供大家学习交流,若涉及作品版权问题,请联系删除或授权事宜。

「硬见小百科」趣味SPI总线解析

SPI全称是串行外设接口(Serial Peripheral Interface),是由Motorola提出的一种全双工(全双工指可以同时(瞬时)进行信号的双向传输(A→B且B→A))同步串行通信接口,通信波特率可以高达5Mbps,但具体速度大小取决于SPI硬件。

SPI总线只需四条线就可以完成MCU与各种外围器件的通讯。

1)MOSI(SDI) – Master数据输出,Slave数据输入

2)MISO (SDO) – Master数据输入,Slave数据输出

3)SClK – 时钟信号,由Master产生

4)/CS – Slave使能信号,由Master控制。

Msater为主模式,Slave从模式。SPI通信就是采用这样的主从模式(Master-Slave)架构,一般为一个Master和多个Slave的应用模式。切记,谁为主,谁提供SCLK时钟信号。

在以上四根线中,CS是控制芯片是否被选中的,只有选信号为预先规定的使能信号时,对此芯片的操作才有效。这就允许主模式在同一总线上连接多个SPI设备成为可能。接下来再连接通讯的3根线就可以了。

SPI如何实现通讯

SPI也是串行通讯协议,是说数据是一位一位传输的。这是SCLK时钟线存在的原因,由SCLK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。操作时序很简单,如下:

看见时序图了,就知道怎么通讯了。SPI接口在Master控制下产生的从器件使能信号和时钟信号,两个双向移位寄存器按位传输进行数据交换,传输数据高位在前,低位在后(MSB first)。在SCK的下降沿上数据改变,上升沿一位数据被存入移位寄存器。

换个说法,SPI是一个环形总线结构,主要是在sck的控制下,两个双向移位寄存器进行数据交换。对于主机来说,上升沿发送、下降沿接收、高位先发送。

上升沿到来的时候,sdi上的电平将被发送到从设备的寄存器中。从M_Sbuff寄存器的7位,发送到S_Sbuff寄存器的0位;

下降沿到来的时候,sdi上的电平将被接收到主设备的寄存器中。从S_Sbuff寄存器的7位,发送到M_Sbuff寄存器的0位;

一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的命令准备数据,主机在下一个8位时钟周期才把数据读回来。

SPI总线比IIC总线传输数据省事。之前用过的IIC通讯,又有起始位,又有停止位的。SPI比较豪爽,对于主机来说,有上升沿就写一位,有下降沿就读一位。因为这样,SPI能够不等8位数据都传完就停止。没有了主机发出的SCLK脉冲,就不再有数据交换了。需要注意的是:我们的主设备能够控制时钟,因为我们的SPI通信并不像UART或者IIC通信那样有专门的通信周期,有专门的通信起始信号,有专门的通信结束信号;所以我们的SPI协议能够通过控制时钟信号线,当没有数据交流的时候我们的时钟线要么是保持高电平要么是保持低电平。

SPI注意事项与实现

SPI总线有四种工作方式(SPI0, SPI1, SPI2, SPI3),其中使用的最为广泛的是SPI0和SPI3方式。

时钟极性CPOL是用来配置SCLK的电平出于哪种状态时是空闲态或者有效态,时钟相位CPHA 是用来配置数据采样是在第几个边沿:

CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时;

CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时;

CPHA=0,表示数据采样是在第1个边沿,数据发送在第2个边沿;

CPHA=1,表示数据采样是在第2个边沿,数据发送在第1个边沿。

如上图,乃SPI四种模式的时序图。

CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。

CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。

CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。

CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。

如果要实现连接通讯,确定单片机(Master MCU1)为主模式,单片机(Slave MCU1)为从模式。各自也配置好了SLCK,MOSI,MISO和SCK的io引脚。选择了默认的SPI0模式。原理图如下:

按图连接好后,Master MCU1单片机发送1—10的数字给Slave MCU1单片机;Slave MCU1收到后,用流水灯作为回应。程序如下:

①:数据发送程序(主机仅发送)

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

//---------------------------

#include <REG52.H>

#include<STDIO.H>

//---------------------------

sbit SPICLK = P1^0; //时钟信号

sbit MOSI = P1^1; //主器件数据输出,从器件数据输入

sbit MISO = P1^2; //主器件数据输入,从器件数据输出

sbit SS = P1^3; //从器件使能信号

void Dat_Transmit(uchar dat) //发送数据程序

{

uchar i,datbuf; //主机数据暂存寄存器

datbuf=dat;

SS=1;

while(SS){;}

for(i=0;i<8;i++) //

{

while(SPICLK){;}

if(datbuf&0x80)

MISO=1;

else

MISO=0;

datbuf=(datbuf<<1);

while(~SPICLK){;}

}

}

void main(void)

{

uchar i;

while(1)

{

for(i=0;i<10;i++)

{

Dat_Transmit(i);

}

}

}

②:数据接收程序(从机仅接收)

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

//---------------------------

#include <REG52.H>

#include<STDIO.H>

//---------------------------

sbit SPICLK = P1^0; //时钟信号

sbit MOSI = P1^1; //主器件数据输出,从器件数据输入

sbit MISO = P1^2; //主器件数据输入,从器件数据输出

sbit SS = P1^3; //从器件使能信号

//---------------------------

void Nop(void)

{

;

}

void Delay(uchar t)

{

while(t--){;}

}

uchar Data_Receive(void) //数据接收程序

{

uchar i,dat=0,temp;

bit bt;

SPICLK=1;

MISO=1;

SS=0; //选中器件

Nop();

Nop();

for(i=0;i<8;i++)

{

SPICLK=1;

Nop();

Nop();

Nop();

SPICLK=0;

Nop();

Nop();

bt=MISO;

if(bt)

temp=0x01;

else temp=0x00;

dat=(dat<<1);

dat=(dat|temp);

}

SS=1;

SPICLK=1;

return dat;

}

void main(void)

{

uchar exdat;

uchar i=0;

uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,

0x7F,0x6F};

P2=0;

while(1)

{

exdat=Data_Receive();

P0=table[exdat];

for(i=0;i<200;i++)

Delay(200);

}

}

SPI总线注意点

1. Master配置SPI接口时钟的时候一定要考虑从设备的操作时序要求,因为Master这边的时钟极性和相位都是以Slave为基准的。因此在时钟极性的配置上一定要确定Slave是在SCK的下降沿还是上升沿输出数据,是在SCK的上升沿还是下降沿接收数据。

2. 当Slave时钟频率小于Master时钟频率时,如果Master的SCK的速率太快,会出现Slave接收到的数据不正确,而SPI接口又没有应答机制确认Slave是否接收到数据从而导致通信传输数据错误。

3. SPI总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。除了MCU,还有FLASHRAM、网络控制器、LCD显示驱动器和A/D转换器等外围设置。

4. 上面的代码所用指令是STC 89C51单片机所用如需用其它芯片请另行更改。

以上所有信息仅作为学习交流使用,不作为任何学习和商业标准。

若您对文中任何信息有异议,欢迎随时提出,谢谢!

相关问答

spi 接口如何跟 单片机 连接?

这要看你用的是硬件SPI还是软件模拟SPI,如果是硬件SPI,也就是单片机自带SPI模块,只要写相应的寄存器就可以,单片机应该有确定的SPI口,与从机(或主机)一一...

单片机 串口通信方式0 和 单片机 用用工作方式0进行 SPI 通信 是...

就是串口通信方式0不是SPI通信这两种通信方式有些相同之处,还有些不同相同:他们都是同步串行通讯。不同的地方:方式0:为同步移位寄存器的输入输出方...

各位大神 单片机 中的 SPI 是什么意思应该怎样理解?

SPI是串行外设接口,串行传输数据。分为主从2部分设备。一般控制字芯片datasheet会有说明。(1)SDI–SerialDataIn,串行数据输入;(2)SDO–SerialData...

spi 和i2c哪个值得入手?

只要搞单片机应用设计,SPI总线和I2C总线都必须掌握,因为单片机的外设有很多使用SPI总线或I2C总线。掌握这两个总线技术的应用,通常需要了解两方面的内容:第...

AU6802N1这款解码芯片的串口通信是IIC 总线 还是 SPI总线 ?指点一下有此芯片接口电路的分享一下,谢谢?

是SPI接口,从模式,SCK时钟倍需外部输入。用普通单片机双向I/o口很容易模拟,不需要什么特别接口电路,如都是5V供电直连I/o口即可,要隔离的话就加光藕,不隔离...

51 单片机 usb驱动器怎么连接?

要连接51单片机与USB驱动器,您可以按照以下步骤进行:1.准备硬件:您需要准备一个51单片机开发板或自己设计的电路板,以及一个USB驱动器(如USB闪存驱动器)...

单片机 哪个接口具有双功能?

SPI是英语SerialPeripheralInterface的缩写,顾名思义就是串行外围设备接口。SPI是一种高速的、全双工、同步通信总线,标准的SPI也仅仅使用4个引脚,.....

单片机 与adc之间如何连接?

单片机与ADC之间可以通过多种方式进行连接,包括并行接口、串行接口、SPI接口等。其中,最常用的方式是通过SPI接口进行连接,通过SPI接口可以实现快速、稳定的数...

单片机 是什么?

单片机不是执行特定逻辑功能的芯片,而是将计算机系统集成到芯片上的芯片。它等效于微型计算机。与计算机相比,单芯片计算机仅缺少I/O设备。简而言之:芯片变成...

51 单片机spi 需要io口配置吗?

需要配置io口的,spi管脚接的哪个io就配置哪个需要配置io口的,spi管脚接的哪个io就配置哪个

猜你喜欢