🎀 文章作者:二土电子
🐸 期待大家一起学习交流!
本文是写在即将参加某公司嵌入式C岗位面试的前一天,简单整理一下还算熟悉的SPI和听说过的,在单片机中常用的CAN通信的相关知识,也算是一种梳理和学习。
PS,由于博主不甚了解CAN通信相关知识,所以本文在介绍CAN通信时引用了一些大佬的文章,均已说明出处。
1 什么是SPI和CAN
1.1 什么是SPI
SPI是一种常用的MCU与外设的通信方式,英文全称Serial Peripheral Interface。与之前介绍过的UART不同,SPI是串行,全双工,同步通信方式。
SPI通常有4根物理连接线,分别是CS片选,SCK时钟,MOSI主机输出从机输入和MISO主机输入从机输出。
- CS片选是从机选择信号线,低电平有效。当CS为低电平时认为主机目前选中的本从机。
- SCK是串行时钟线,同步通信需要主从机时钟同步,主机利用SCK线与从机实现时钟同步。时钟由主机产生,决定了通讯的速率。
- MOSI(Master Output Slave Input)主机输出从机输入。主机的信号通过这条线发送给从机。
- MISO(Master Input Slave Output)主机输入从机输出。主机通过这条线接收从机发来的信息。
冲浪了一下,也参考了一下之前看过的时序图,SPI的数据收发时钟通常是上升沿发送下降沿接收,高位先发。这里附上一个之前看过的时序图
首先CS片选被拉低,代表主机与该从机进行通讯。当SCK上升沿时D7(高位数据被发送),依次发送直到最后一位D0发送完成。
1.2 什么是CAN
CAN全称是Controller Area Network,控制器局域网络,是ISO国际标准化的串行通信协议。由于本人对于CAN总线不甚了解,这里参考了一篇大佬的博客,大家可以自行去详细了解一下,博主这里基于原作者的描述做一下简单的总结和理解。博主原文CAN总线(一)——CAN总线是什么,在哪用,怎么用?
CAN总线采用差分信号传输,CAN控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,收发双方通过检测总线电平来实现消息传递。
- 2.0V---------逻辑0------显性电平
- 0V-----------逻辑1------隐性电平
CAN总线遵从“线与”机制,显性电平可以覆盖隐性电平。这就导致只有所有节点都发送隐形电平时总线才处于隐性状态。这也就是CAN总线的显性有限特点。
以发送数据为例,发送数据时CAN控制器把要发送的二进制编码通过CAN_Tx发送给CAN收发器,然后收发器将普通的逻辑电平信号转化成差分信号,通过差分薪CAN_High和CAN_Low传输到CAN总线网络。因此,CAN通信只需要两根线即可。
CAN总线是广播类型的总线,也就是说每一个节点都可以监控总线上所有的报文信息。但是CAN硬件能够提供本地的过滤功能,让每个节点对报文有选择性地做出相应。
2 SPI与CAN的优缺点
2.1 SPI的优缺点
SPI通信优点
- 支持全双工通信
- 通信简单
- 数据传输速率快
SPI通信的缺点
- 没有应答机制,在可靠性方面有一定缺陷
总而言之,SPI通信是一种告诉全双工同步通信。信号是非差分式,没有应答机制,可靠性方面存在缺陷。
2.2 CAN通信的优缺点
这里参考了另一篇博主的文章,这里也贴一下CAN通信详解(全)。
CAN通信的优点
- 多主控制。在总线空闲时所有单元都可以发送消息。当两个以上单元发送消息时,会根据标识符决定发送的优先级。
- 通信速率快,距离远。
- 具有故障检测,错误通知和错误恢复功能。所有单元都可以检测错误,检测出错误的单元会立即同时通知其他所有单元,正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止。
- 故障封闭功能。CAN可以判断出错误的类型是总线上暂时的数据错误还是持续的数据错误。当总线上持续出现数据错误时,可以将引起故障的单元从总线上隔离出去。
CAN通信最大的一个特点时废除了传统的地址编码,报文不包含源地址或目标地址,而是根据标识符来指示功能和优先级。
CAN通信的缺点
- 不一致性
CAN发送器校验的范围可以覆盖到帧结束,如果发现错误,就会按照优先权和状态规定重发。CAN接收器校验错误的范围覆盖到帧结束的前一位。这就会导致,如果由于空间干扰或者电源波动等原因,导致帧的倒数第一位发生错误。此时一部分节点由于直检查到帧的倒数第二位,认为帧没有错误,另一部分认为帧有错误。认为帧错误的节点会通知发送器重发,同时丢弃接收到的帧。而此时认为帧正确的节点会收到重复帧。这就容易造成两个节点收到的信息不同,认为正确的节点收到了两帧信息,认为错误的节点收到了一帧信息,这种情况在转向和制动系统中可能会导致严重的后果。 - 不可预测性
个人简单理解为,每个节点的状态不容易确定。 - 信道出错堵塞
节点可能受干扰或其他因素导致暂时或永久性失效。出错的主机会命令CAN收发器不断发送消息。由于该信息的格式等均合法,而且CAN通信会根据优先权发送帧,就会导致比它优先权低的信息被暂停或者永久堵塞。