在设计电子电气系统的时候,经常会遇到需要设计两个或两个以上CPU协同工作情况。如果有一款芯片集成有两个CPU,分别能满足要求,CPU之间的通信在芯片内部就能又快又可靠的完成,想象是美好的,但是结局是悲伤的,需求差异太大,只能定制(成本高的无法想象)。我们通过组合不同CPU芯片实现我们想要的功能。
比如说,现在有个安全系统需求,需要一个通信CPU与其他系统通信,这个通信CPU要和本系统内的执行功能算法的CPU交互数据,这时候我们去市场上查找发现:没有这种即能满足通信需求又能满足功能算法的集成双CPU方案!那我们可以通过不同厂家的芯片组合在一起实现:使用TI的DSP实现功能算法,使用ST的ARM实现通信。现在问题来了,两个CPU之间怎么进行通信!下面作者结合自己遇到项目,分析不同CPU通信方案的特点!
1.为什么需要双CPU
(1) 资源限制
电子电气系统使用的嵌入式CPU往往资源非常有限,RAM和Flash一般几百K,内部的外设接口也有限。一个CPU不能完成一个系统所需要的功能,需要两个或以上的不同CPU才能完成。通过多CPU设计,系统的可用的资源可以满足需要。
(2)功能划分
电子电气系统由很多功能是可以独立划分的,比如说,一部分是通信的,一部分是数据采集的,一部分是执行用户逻辑的,一部分是输出的,功能划分有利于分而治之。
(3)保密性
有些公司处于技术保密性,将自己的核心成果封装在一个CPU内,提供给客户,客户只需要知道接口而不必懂的里面的实现。现在有很多无线物联网公司开发自己的无线协议,他们很多使用ARM的M0内核的烧写自己的协议,使用SPI或串口作为接口,提供无线互联解决方案。
(4)行业或标准要求
比如说安全要求比较高的行业,如汽车电子,石油化工等系统,一旦电子系统出现问题,就会造成巨大的生命和财产损失,要求诊断和保护系统需要运行在单独的CPU内,与执行功能的主CPU完全分开解耦,即使在主CPU出现故障,也不会影响执行保护系统。
电梯行业应用单独的CPU诊断电梯的状态就是个典型例子。主CPU负责电梯的升降,辅助CPU负责对电梯的位置,速度等关键信息进行监控,一旦检测到有问题就会报警或停机。
在功能安全领域标准IEC61508,包括汽车电子标准ISO26262,有强制的要求,达到SIL标准的系统必须使用多CPU通道设计,增加系统的可靠性!(该如何使用多CPU设计符合功能安全的标准我会在今后详细分析)
(5)分工需要
在公司开发一套电子电气系统,需要各个不同领域的人,比如说硬件,软件,做硬件的有的人擅长DSP硬件,有的人精通ARM硬件;做软件的人,有的人在无线通讯有经验,有的人专注驱动层开发。如何将团队组织在一起协同工作是个需要思考的问题。有很多时候是为了分工提高劳动效率,尽量减少不同领域之间的不必要的耦合,在出现问题时可以快速找到问题和责任人,绩效考核谁干的好谁干的不行等目的将一套系统划分为多个部分,由不同的CPU执行。
分工产生产生效能!一个人不掌握全部技术,这么干老板很喜欢!
2.双CPU之间通信选择
常见的CPU之间可以通过串口,SPI,双口ram,CAN,以太网
2.1 各方案的比较
2.2 串口方式
激光器,蓝牙芯片
两个CPU之间通过串口通信,简单,速率低,适用于绝大部分交互不是太频繁的领域。比如蓝牙芯片,激光器等提供使用串口和AT指令与主CPU交互。
由于串口的通信波特率一般不大于115200,而且串口数据一个byte一个byte发送,需要在接收方判断收到数据一个延时后没收到下个数据,认为数据已经接收完成,这种方式大大降低了数据的交互速度。
2.3 SPI
spi由于速度快,简单,同步,全双工,占用IO少已经广泛使用在flash,ADC等IC的接口。两个CPU使用SPI通信,需要设计一套两个SPI交互的方案,否则很容易出现数据丢失。spi的波特率一般可以达到20M以上,发送一个数据不到1us,适用于绝大多数场合。
使用spi通信一般可以分为两种:
(1)数据同步交互
spi主在发送数据的同时也接收数据。接收和发送数据的个数和内容完全由主SPI决定。交互的数据格式可以参考spi flash芯片。主spi先拉低数据请求,接着发送命令和地址,接着发送0x0000数据,产生时钟读取从的数据,从发送多少个数据完全由spi主的时钟个数决定。下面看一个同步数据传输实例。
spi主需要发送数据,首先拉低片选,接着发送8bit的命令和8bit的数据,从spi通过中断接收到命令和数据后,解析,准备好数据放到spi 发送寄存器,等待spi主取数据,每8bit clock后spi从就会把下一个发送数据放到寄存器。spi主决定什么时候数据结束,最后拉低片选,告诉从spi数据结束了。整个过程需要注意的是(1)从的数据要提前准备好,放入寄存器等待读取 (2)发送命令和地址后,主需要发送无意义数据通常0x00,产生clock。(3)spi主接收的第三个数据开始才是主需要的第一个数据。
问题:这种模式从不能随心所欲的发送数据,即不能在任何时候发送任何长度的数据。
(2)数据异步交互
使用数据异步方式的过程如下
(1)spi主发送数据 首先拉低Tx_master,开始发送数据,当发送数据接收后,再拉高Tx_master,这时候spi从就会接收到“一帧数据”,从而解析。spi从最好使用中断接收,以免数据丢失。
(2)spi从发送数据 spi从发送数据前,需要将发送数据的长度放入spi从的发送寄存器,然后拉高Tx_salve,spi主检测到Tx_salve高就会产生clock,去取从发送数据的长度N,接着主发送N个clock,每当数据发送完成,从需要将下一个数据放入寄存器。
从上面的两个过程我们可以发送,数据的传输是半双工的,主发送数据的时候,接收从的数据是无用的,从发送数据组发送的数据也是无效的。数据交互效率降低了,但是很多时候,spi从想随心所欲的发送数据,这种方式还是非常实用。
2.3 双口RAM
两个CPU外部接一个双口RAM,CPU就像使用外扩RAM一样
2.3.1 ASCI双口RAM芯片
2.3.2 CPLD/FPGA
2.4 CAN总线方式
CAN总线低成本,高可靠性,具有非破坏仲裁等优势,几乎每个CPU都有一路或以上CAN模块。在交互数据不是很多,又要求数据可靠性很高的场合,选择CAN交互非常合适。我见到过的在风力发电控制系统中使用CAN对采集的两路信号比较,还有石化行业DO板使用CAN总线比较输出。
2.5 以太网
双CPU以太网点对点交互数据,多用于热备和冗余2取1系统。
(1)1OO2冗余2取1系统,主要应用对安全要求极高的系统。在石化行业,有一种紧急停车ESD系统,采集外部的压力,温度,开关等信息,见过冗余双网络送到CPU1和CPU2分别处理,然后通过以太网比较,最后控制阀门的开闭。(数据怎么同步,怎么比较见下次论述)
(2)热备系统
热备系统不仅可以在主机出现问题的时候切换到从机,而且可以在工厂检修时候不用停机,提高了系统的可用性!
未完待续。。。。。。。