简谈对stm32基本外设UART、I2C、SPI、CAN总线的理解

最近找实习的时候,看到好多任职岗位都对CAN总线、SPI、I2C都有要求,之前也有道友问过这些问题,我也不是太理解。虽然在校也学习了相关的知识,但了解的只是很浅显的一部分,通过在家的这段时间,查缺补漏。一天进步一点点,这便已经足够了,先从UART开始吧!
参考以下资料:
https://blog.csdn.net/weiqifa0/article/details/82765892
https://blog.csdn.net/LIJJ1993/article/details/82118483
http://www.elecfans.com/d/694463

首先讲一下同步通信和异步通信的区别:
同步通信需要相同频率的时钟,逐字符发送接收,发一个,收一个,不能有间隙。
异步通信可以任意间隙,接收端任意时刻发送,需要加停止位和开始位。
UART
UART(通用异步收发传输器)是一种通用串行数据总线,是一种异步全双工串行通信协议,有TX(发送)和RX(接收)两根数据线组成,不需要时钟,由起始位、停止位及波特率进行标识,一般硬件上有波特率发生器、串口发送器、串口接收器组成。有检错机制:奇偶校验位。优点:不需要时钟,传输距离远,有检错机制,缺点:需要波特率的支持,速度慢等
I2C(读作I方C)总线协议(半双工)
I2C属于同步串行总线,同步通信是双方有一个共同的时钟,当发送时,接收方同时准备接收。在总线通信上,同步异步主要看有没有时钟线控制数据传输。
IIC总线一共有两条线,一条数据线SDA,一条时钟线SCL。
起始信号(S):SCL为高电平时,SDA从高电平变为低电平,开始传输数据。
结束信号§:SCL为高电平时,SDA从低电平变为高电平,结束传输数据。
如下图:
简谈对stm32基本外设UART、I2C、SPI、CAN总线的理解_第1张图片
数据传输过程中:在SCL时钟的高电平周期内,SDA线上的数据必须保持稳定,数据线仅可以在时钟SCL为低电平时改变 。
如下图:
简谈对stm32基本外设UART、I2C、SPI、CAN总线的理解_第2张图片 SPI总线协议(全双工)
SPI(Serial Peripheral Interface)是串行外围设备接口的缩写,是一种高速、全双工、同步的串行通信总线,并且在芯片管脚上只占用了四根线,节约了芯片的管脚,同时为PCB的布局节省了空间。正因为这种简单易用的特性,越来越多的芯片集成了这种通信协议。
SPI接口主要应用在EEPROM(带电可擦可编程只读存储器)、FLASH(闪存)、实时时钟、AD转换器、数字信号处理器、数字信号解码器之间。
SPI主从模式硬件连接如下图
简谈对stm32基本外设UART、I2C、SPI、CAN总线的理解_第3张图片
SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,三根线也可以(单向传输时)。也是基于SPI设备共有的,它们是SDI(数据输入)、SDO(数据输出)、SCK(时钟)、CS(片选)。

SDO -主设备数据输出,从设备数据输入,对应MOSI
SDI -主设备数据输入,从设备数据输出,对应MISO
SCLK -时钟信号,由主设备产生
CS -从设备使能信号,有主设备控制

CS:其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号(高电位或低电位)时,对此芯片的操作才有效,这就允许在同一总线上连接多个SPI设备成为可能。
**SDI/SDO/SCLK:**通信通过数据交换完成的,这里要知道SPI是串行通信协议,也就是说数据是一位一位传输的。这也是时钟线SCK存在的原因,由SCK提供时钟脉冲,SDI、SDO则基于此脉冲完成数据传输。数据输出通过SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变,就可以完成8位数据的传输。

要注意的时,SCK信号线只由主设备控制,从设备不能控制时钟线。
这样传输方式有一个优点,与普通的串行通信不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停。因为SCK时钟由主控设备控制,当没有时钟跳变是,从设备不采集或传送数据,也就是说,主设备对SCKL时钟线的控制可以完全对通信控制。SPI还是一个数据交换协议。因为SPI的数据输入线和输出线独立,所以可以同时完成数据的输入和输出。

CAN总线通信协议
CAN(Controller Area Network)控制器局域网络是ISO国际标准化的串行通信协议。广泛应用于汽车、船舶等。具有已经被大家认可的高性能和可靠性。
CAN控制器通过组成总线的2根线(CAN-H和CAN-L)的电位差来确定总线的电平,在任一时刻,总线上有2种电平:显性电平和隐性电平。各个节点通过这两条线实现信号的串行差分传输,为了避免信号的反射和干扰,还需在CAN_H和CAN_L之间接上120欧姆的终端电阻。
“显性”具有优先的意味,只要有一个单元输出显性电平,总线上即为显性电平,并且
“隐性”具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平。

CAN收发器
CAN收发器的作用是负责逻辑电平和信号电平之间的转换。即从CAN控制芯片输出逻辑电平到CAN收发器,然后经过CAN收发器内部转换将逻辑电平转换位差分信号输出到CAN总线上,CAN总线上的节点都可以决定自己是否需要总线上的数据。具体的管脚定义如下:简谈对stm32基本外设UART、I2C、SPI、CAN总线的理解_第4张图片
CAN总线关键概念
仲裁
只要总线空闲,总线上任何节点都可以发送报文,如果有两个或两个以上的节点开始传送报文,那么就会存在总线访问冲突的可能。但是CAN使用了标识符的逐位仲裁方法可以解决这个问题。
在仲裁期间,每一个发送器都对发送的电平与被监控的总线电平进行比较。如果电平相同,则这个单元可以继续发送。如果发送的是一"隐性"电平而监视到的是一"显性"电平,那么这个节点失去了仲裁,必须退出发送状态。如果出现不匹配的位不是在仲裁期间则产生错误事件。

CAN总线协议
CAN总线是一个广播类型的总线,所以任何在总线上的节点都可以监听总线上传输的数据。也就是说总线上的传输不是点对点的。而是一点对多点的传输,这里多点的意思是总线上所有的节点。但是总线上的节点如何知道哪些数据是传送给自己的呢?CAN总线的硬件芯片提供了一种叫做本低过滤的功能,通过这种本低过滤的功能可以过滤掉一些和自己无关的数据,而保留一些和自己有关的信息。

CAN消息机制
CAN标准定义了四种消息类型,每条消息用一种叫做比特位仲裁机制来控制进入CAN总线,并且每条消息都标记了优先权。另外CAN标准还定义了一系列的错误处理机制。
CAN报文的四种消息类型:
数据帧:数据帧将数据从发送器传输到接收器。
远程帧:总线单元发出远程帧,请求发送具有同一标识符的数据帧。
错误帧:任何单元检测到总线错误就发出错误帧。
过载帧:过载帧用在相邻数据帧或远程帧之间提供附加的延时。

你可能感兴趣的:(spi,can,嵌入式)