提问:
我在做一个项目时需要用到2片单片机协同完成工作,可是单片机与其他芯片通
信的方法我学习过,而单片机与单片机之间的通信好像没有人讲过。如果要让2
片单片机相互通信,用什么接口比较好?为什么?
解答:
首先这个问题需要先从观念上有所改进。其实单片机本身也是一种芯片,它和
显示屏驱动芯片、温度传感器芯片一样,都是完成某项任务的芯片。唯一的驱
动是显示驱动芯片、温度传感器芯片是厂家指定用途的,而单片机是通用用途
的。所以面对单片机与单片机的通信,我们可以先理解成单片机与另一个芯片
的通信,只是这个芯片的通信方式由我们自己设置。
理解了这个概念,接下来就是考虑2片单片机之前的工作关系。也就是说2个单
片机是老板跟员工的关系(主对从),还是老板跟老板(主对主),或是员工
和员工(从对从)。
1,主对从:这种关系最为常见。在系统中有一个主单片机,它里面的程序是控
制方方面面完成整个系统的管理。另一个单片机是只负责完成某一小部分工作
任务。拿杜洋工作室出品的寻迹小车为例,在小车OLED显示屏的背面有一片64
脚的主控单片机,它是生成人机界面和各种功能的主控制。而在小车下方有一
个139点高分辨率的循迹传感器,因为这个传感器的分辨率很高,需要很复杂的
算法和很高的采集频率,所以循迹器上有一片专门用于采集数据的单片机。这
时循迹单片机从功能上讲是从单片机,于是循迹单片机给出一个I2C接口,主单
片机只要通过I2C总线通信协议就可以读出循迹器里的数据。就像读其他I2C接
口的功能芯片一样,如LM75A温度传感器。从单片机的特点是永远被动,只要
主单片机不来读写,从单片机是不会主动通信的。
当有主从机区别时,只要从机模拟其他功能芯片的接口就行了。常用的是I2C、
SPI、USART(RS232)、RS485、USB等。其中如果注重扩展性(如想在一个
接口上接多个从单片机与芯片)则用I2C,如果注重通信速度则用SPI,如果注
重编程简单、使用方便则用USART。如果注重远距离通信就用RS485。如果是
有操作系统的高级通信设备可用USB接口。只要在从单片机上开启这些接口并
设置为从设备就可以了。如果硬件上没有的接口也可以软件模拟,但对刷新速
度要求高的不推荐模拟。
2,主对主:如果两片单片机都是主控,每个单片机独立管理一个完整的系统,
且每个单片机都有可能主动发起通信。多主机通信最大的问题是数据冲突,如
果两个(或更多)主机同时发数据,要如何处理谁先谁后呢?这就需要使用带
有多主机功能的接口了,如CAN、以太网等。一般两个主单片机是不会放在一
片电路板上的,大多还是两台设备间的通信,这时可以用专用线缆的接口。
CAN总线会高级很多,有专业的仲裁机制和保护,在多主机的通信中最常用。
以太网就是互联网的通信接口,只是你的系统不一定接入互联网,可能只形成
一个小局域网,那么以太网接口的TCP/IP协议(或其他协议)一样可以使多主
机通信更稳定。另外,还可使用RS232和RS485接口,它们是开放的通信接
口,需要用户自己设计通信的原则和仲裁方案,如果通信不复杂的话可以使
用。
3,从对从:这种情况非常少见,一般都需要另外有一个主单片机在控制它们。
当主单片机需要在从单片机A中读出数据发给从单片机B时,只要主单片机发出
一个信号,从单片机A就会直接向从单片机B发数据,不需要经过主单片机,这
有点像DMA功能。这时能用的接口就很多了,USART、SPI、CAN、RS485都
可以。选择接口就是视关注的重点而定。
以上只是基于现有成熟的接口的方案,还有一种用户自己设计的接口。比如拿
几个普通I/O端口直接用电平高低或者冲突的数量来通信,这种最原始最直观的
通信也是很好用的。如果你的技术水平不高,又急于完成通信,那么这是一个
很好的选择。但如果你能完成以上介绍的任何一个接口的开发,那就请不要用
原始的方案。因为直接用电平表示缺少成熟接口协议的封装,在可靠性和扩展
性上都不高。有时电平方式通信所占用的引脚数量比成熟的I2C、SPI还要多。
这样做很不专业,一看就是初学者。我们不应该被知识打败退而次之,而应该
掌握知识,用专业接口做专业通信。