IIC、SPI、USART、RS485、RS232、CAN外设通信总结

您所在的位置:网站首页 usb控制器可以连接几个外设 IIC、SPI、USART、RS485、RS232、CAN外设通信总结

IIC、SPI、USART、RS485、RS232、CAN外设通信总结

2023-10-02 06:46| 来源: 网络整理| 查看: 265

UART串口通信

通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。

串口是“串行接口”的简称,即采用串行通信方式的接口。串行通信将数据字节分成一位一位的形式在一条数据线上逐个传送,其特点是通信线路简单,但传输速度较慢。

UART在发送数据时,将并行数据转换成串行数据来传输;

UART在接收数据时,将接收到的串行数据转换成并行数据。

(1)同步串行通信(Synchronous serial communication),I2C、SPI等有时钟信号的协议,都属于这种通信方式。

(2)异步串行通信(Asynchronous serial communication),串口通信,就是这种通信方式。

在设置好数据格式及传输速率之后,UART负责完成数据的串并转换,而信号的传输则由外部驱动电路实现。电信号的传输过程有着不同的电平标准和接口规范,针对异步串行通信的接口标准有RS232、RS422、RS485 等,它们定义了接口不同的电气特性,如 RS-232 是单端输入输出,而 RS-422/485为差分输入输出等。

COM口是指针对串行通信协议的一种端口,是PC上异步串行通信口的简写,大部分为9针孔D型。COM口里分RS232,RS422和RS485,传输功能依次递增。

当单片机 1 想给单片机 2 发送数据时,比如发送一个 0xE4 这个数据,用二进制形式表 示就是 0b11100100,在 UART 通信过程中,是低位先发,高位后发的原则,那么就让 TXD 首先拉低电平,持续一段时间,发送一位 0,然后继续拉低,再持续一段时间,又发送了一 位 0,然后拉高电平,持续一段时间,发了一位 1……一直到把 8 位二进制数字 0b11100100 全部发送完毕。这里就涉及到了一个问题,就是持续的这“一段时间”到底是多久?由此便引入了通信中的一个重要概念——波特率。

波特率就是发送二进制数据位的速率,习惯上用 baud 表示,即发送一位二进制数据的持续时间=1/baud。在通信之前,单片机 1 和单片机 2 首先都要明确的约定好它们之间的通 信波特率,必须保持一致,收发双方才能正常实现通信。

在 UART 通信的时候,一个字节是 8 位,规定当没有通信信号发生时,通信线路保持高电平,当要发送数据之前,先发一位 0 表示起始位,然后发送 8 位数据位,数据位是先低后高的顺序,数据位发完后再发一位 1 表示停止位。这样本来要发送一个字节的 8 位数据,而实际上我们一共发送了 10 位,多出来的两位其中一位起始位,一位停止位。而接收方呢,原本一直保持的高电平,一旦检测到了一位低电平,那就知道了要开始准备接收数据了,接收到 8 位数据位后,然后检测到停止位,再准备下一个数据的接收。如下图所示:

 

IIC通信(半双工)

在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。

lIC协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯。而SPI协议中没有设备地址,它使用NSS信号线来寻址,当主机要选择从设备时,把该从设备的NSS信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行SPI通讯。所以SPI通讯以NSS线置低电平为开始信号,以 NSS线被拉高作为结束信号。

两线式串行总线,由数据线SDA和时钟SCL构成,可发送或接受数据。

空闲状态:两个信号线均处于高电平。

起始信号:当SCL为高期间, SDA由高到低的跳变。

停止信号:当SCL为高期间, SDA由低到高的跳变。

应答信号:发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节,应答信号为高电平时,规定为非应答位(NACK), 一般表示接收器接收该字节没有成功。对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P。

数据有效性:IIC总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。

数据的传送

I2C中心以启动信号START来掌管总线,以停止信号STOP来释放总线;启动信号START后紧接着发送一个地址字节,其中7位为被控器件的地址码,一位为读/写控制位R/W,R/W位为0表示由主控向被控器件写数据,R/W为1表示由主控向被控器件读数据;当被控器件检测到收到的地址与自己的地址相同时,在第9个时钟期间反馈应答信号。

写操作

读操作

在I2C总线上传送的每一位数据都有一个时钟脉冲相对应( 或同步控制),即在SCL 串行时钟的配合下, 在SDA上逐位地串行传送每一位数据。数据位的传输是边沿触发。

IIC可以连接多少个外设?

所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。I2C总线上的每个设备都自己一个唯一的地址,来确保不同设备之间访问的准确性。

IIC总线最多可以挂多少个设备由IIC地址决定,8位地址,减去1位广播地址,是7位地址,2^7=128,但是地址0x00不用,那就是127个地址, 所以理论上可以挂127个从器件。

I2C总线理论上挂接127个器件,但是在实际使用中,通常不会超过8个,一般六七个就到头了,I2C总线的驱动能力有限,太多的器件总线驱动不起来。

我们知道IIC的所有设备是接在一根总线上的,那么我们进行通信的时候往往只是几个设备进行通信,那么这时候其余的空闲设备可能会受到总线干扰,或者干扰到总线,怎么办呢?

为了避免总线信号的混乱,IIC的空闲状态只能有外部上拉, 而此时空闲设备被拉到了高阻态,也就是相当于断路, 整个IIC总线只有开启了的设备才会正常进行通信,而不会干扰到其他设备。

多主机会产生总线裁决问题,当多个主机同时想占用总线时,企图启动总线传输数据,就叫做总线竞争。I2C通过总线仲裁,以决定哪台主机控制总线。

SDA仲裁

SDA线的仲裁也是建立在总线具有线“与”逻辑功能的原理上的。节点在发送1位数据后,比较总线上所呈现的数据与自己发送的是否一致,是,继续发送;否则,退出竞争。SDA线的仲裁可以保证I2C总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失。总线系统通过仲裁只允许一个主节点可以继续占据总线。

I2C总线设备地址:

设备地址标识外设在总线上的唯一性,每一个外设都有唯一的设备地址,设备地址由原理图和芯片手册共同定义!CPU通过设备地址来访问到I2C总线上的某个外设!

IIC主要特点:

通常我们为了方便把IIC设备分为主设备和从设备,基本上谁控制时钟线(即控制SCL的电平高低变换)谁就是主设备。

IIC主设备功能:主要产生时钟,产生起始信号和停止信号。

IIC从设备功能:可编程的IIC地址检测,停止位检测。

IIC的一个优点是它支持多主控(multimastering), 其中任何一个能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。

用途

主要用于近距离低速的芯片之间的通讯,成百上千米远距离的通讯不行,抗干扰能力差,它的成本低,结构简单。

目前主要用于服务管理。 这包括各个组件状态的通信。 例如,管理员可以查询各个组件以管理系统配置,并了解组件(如电源和系统风扇)的功能状态。 可随时监控内存、硬盘、网络和系统温度等多个参数,提高系统安全性,便于管理。 IIC数据传输速度有标准模式100 kbps、快速模式400 kbps、高速模式3.4 Mbps,其他变种实现了低速模式10 kbps、高速模式1 Mbps。

SPI通信(全双工,高速)4条线通信:

每个时钟周期传输一位数据,因此数据传输的速度由时钟信号的频率决定,SPI 通信始终由主机发起,因为主机配置并生成时钟信号。

传输速度

SPI总线的传输速率可以达到几MByte/s且这不是固定的,一般受到以下几个因素影响:

1)SPI的最大时钟频率(一般情况下,其最大时钟频率为系统时钟频率的1/2);

2)CPU处理SPI数据的能力;

3)输出端驱动能力(PCB所允许的最大信号传输速率)等,其最大速率主要看主从器件控制器的性能。

优点:

比 I2C 更高的数据传输速率(几乎是 I2C 的两倍) 独立的 MISO 和 MOSI 线,因此可以同时发送和接收数据。

MISO主设备数据输入, 从设备数据输出。

MOSI主设备数据输出, 从设备数据输入。

SCLK时钟信号,由主设备产生。

CS从设备片选信号(是否工作),由主设备控制。

SPI工作原理总结 硬件上为4根线。主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。串行移位寄存器通过MOSI信号线将字节传送给从机,也将自己的串行移位寄存器中的内容通过MISO信号线返回给主机。这样,两个移位寄存器中的内容就被交换。外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。

1.通讯的起始和停止信号

在图中的标号1处,NSS信号线由高变低,是SPI通讯的起始信号。NSS是每个从机各自独占的信号线,当从机检在自己的NSS线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。在图中的标号处,NSS信号由低变高,是SPI通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。

2. 数据有效性

SPI使用MOSI及 MISO信号线来传输数据,使用SCK信号线进行数据同步。MOSI及 MISO数据线在SCK的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据传输时,MSB先行(高位先行)或LSB(低位先行)先行并没有作硬性规定,但要保证两个SPI通讯设备之间使用同样的协定,一般都会采用上图中的MSR先行(高位先行)模式。

观察图中的2345标号处,MOSI 及 MISO的数据在SCK的上升沿期间变化输出,在SCK的下降沿时被采样。即在SCK的下降沿时刻,MOSI及 MISO的数据有效,高电平时表示数据"1”,为低电平时表示数据"0"。在其它时刻,数据无效,MOSI及 MISO为下一次表示数据做准备。

SPI每次数据传输可以8位或16位为单位,每次传输的单位数不受限制。

数据帧格式

串行同行数据传输分为 MSB 和 LSB,也就是最高有效位在前,还是最低有效位在前。(注:最左边的比特位即为最高有效位)。

比如传输一个字节:0x95(1001 0101)。

如果按照MSB(高位在前),则发送顺序:1001 0101。

如果按照LSB(低位在前),则发送顺序反过来:1010 1001。

3. CPOL(时钟极性)/CPHA(时钟相位)及通讯模式

上面讲述的图中的时序只是SPI中的其中一种通讯模式,SPI一共有四种通讯模式,它们的主要区别是∶总线空闲时SCK的时钟状态以及数据采样时刻。为方便说明,在此引入"时钟极性CPOL"和“时钟相位CPHA"的概念。

CPOL时钟极性和CPHA时钟相位的组合选择数据捕捉的时钟边沿。

SPI_CR寄存器CPOL和CPHA位,能够组合成四种可能的时序关系。

3.1 CPOL就是决定SCLK这个时钟信号线,在没有数据传输的时候的电平状态。

CPOL(时钟极性)=0:空闲状态时,SCLK保持低电平

CPOL=1:空闲状态时,SCLK保持高电平

3.2 CPHA就是决定数据位传输是从第一个时钟(SCLK)边沿开始,还是第二个从二个时钟(SCLK)边沿开始。

CPHA=0:数据从第一个时钟(SLCK)边沿开始采集

CPHA=1:数据从第二个时钟(SLCK)边沿开始采集

3.3 CPOL和CPHA合体就形成了SPI四种模式。

如果CPHA(时钟相位)位置'1',SCK时钟的第二个边沿(CPOL位为0时就是下降沿,CPOL位为'1'时就是上升沿)进行数据位的采样,数据在第二个时钟边沿被锁存。

如果CPHA位被清'0',SCK时钟的第一边沿(CPOL位为'0'时就是下降沿,CPOL位为'1'时就是上升沿)进行数据位采样,数据在第一个时钟边沿被锁存。

SPI使用过程中,项目中遇到的问题

1、SPI1_SCK时钟引脚始终无法输出时钟信号

分析原因:SPI有些引脚对应的是特殊功能的引脚,以STM32F103C8T6为例,比如:PB3(SPI1_SCK)对应的是 JTDO,如果不配置则默认这个引脚的功能就是 JTDO的功能。芯片上电默认该引脚为调试引脚,电平为高电平,导致芯片的SPI1_SCK是无法拉低的。

找到芯片的复用重映射和调试I/O配置寄存器(AFIO_MAPR)的24:26位,可以看到相关解释说明:即通过修改这3位的配置可以关闭调试引脚配置,释放相应的IO口。实际使用中通过开启AFIO辅助时钟,将SWJ_CFG配置为2或者3即可当做普通IO使用,但如想作为SPI1时钟引脚,还需在MAPR寄存器开启SPI1的重映射!

开启SPI1的重映射才会有时钟信号输出!

具体解决方法,引脚重映射配置过程:

1. 使能GPIO时钟(重映射后的IO);

2. 使能功能外设时钟;

3. 使能AFIO时钟。重映射必须使能AFIO时钟:

RCC->APB2ENR |= 1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3