在设计电子电气系统的时候,经常会遇到需要设计两个或两个以上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)热备系统

热备系统不仅可以在主机出现问题的时候切换到从机,而且可以在工厂检修时候不用停机,提高了系统的可用性!

未完待续。。。。。。。

双CPU之间的通信方案相关推荐

  1. usb连接不上 艾德克斯电源_工程师,USB与SPI之间如何通信?什么芯片方案可以实现...

    工程师,在研发设计电路项目,可能会使用不同标准协议的通信方式:常见的通信方式类型包含 USB通信,如U盘的接口是采用USB通信: UART通信,如数字温湿度传感器的接口是采用UART通信: SPI通信 ...

  2. 黑马程序员--线程之间的通信,等待与唤醒机制,线程的终止方式,线程中的其他方法,优先级,toString() 守护线程,GUI图形化界面

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  3. java 本地通信_java – 本地JVM之间的通信

    我的问题:我可以/应该采用什么方法在本地运行的两个或多个JVM实例之间进行通信? 问题的一些描述: 我正在为一个项目开发一个系统,该系统需要单独的JVM实例来完全隔离某些任务. 在它运行时,'父'JV ...

  4. 三层交换解决了VLAN之间的通信问题

    开关的转发过程. 开关工作于OSI参考模型的第二层,也就是数据链路层.在每一个端口成功连接时,交换机内部的CPU通过对应MAC地址和端口形成一张MAC表.开关基于MAC地址表来转发数据. 路由转发过程 ...

  5. 组件生命周期管理和通信方案

    随着移动互联网的快速发展,项目的迭代速度越来越快,需求改变越来越频繁,传统开发方式的工程所面临的一些,如代码耦合严重.维护效率低.开发不够敏捷等问题就凸现了出来.于是越来越多的公司开始推行" ...

  6. linux:进程之间的通信

    ipc :进程间通信(InterProcess Communication) 1.管道 同一时间是单向的:父读子写,或父写子读  管道中的数据 ,读走就没了  参数是一个整型数的数组,数组的大小是两个 ...

  7. ESFramework介绍之(14)-- AS与FS通信方案

    前面我们已经多次提到,每个AS都有一组FS为之服务(回顾),AS将接收到的功能请求通过Tcp连接池 或Remoting转发给某个FS处理.下面我们将深入讨论AS和FS之间的通信机制. 首先要解决第一个 ...

  8. Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作

    在Java面试的时候,经常会问到Java并发编程相关的多线程.线程池.线程锁.线程通信等面试必考点,比如: Java并发编程系列:Java线程池的使用方式,核心运行原理.以及注意事项 Java并发编程 ...

  9. 西门子array数据类型_西门子S71200之间以太网通信(图文)

    西门子S7-1200之间以太网通信 一.通信前的准备 首先创建新项目,并命名为"s7-1200之间通信",如下图所示: 然后组态设备,选择s7-1200的CPU 1214C DC/ ...

最新文章

  1. OpenStack Nova 高性能虚拟机之 NUMA 架构亲和
  2. ARM指令寻址方式之: 内存访问指令寻址
  3. python必须使用try except而不是if else的场合
  4. html除左侧浮动,html清除浮动的6种方法示例
  5. activiti dmn_端到端BPM(带有DMN标记)
  6. 如何创造出更优秀的用户体验?
  7. 一进庙会freeeim
  8. Java讲课笔记17:Lambda表达式
  9. LMS.SYSNOISE.v5.6\
  10. 科创板将迎做市商机制,做市商到底是什么?
  11. 新能源汽车的电池寿命
  12. ZT I Believe I Can Fly(我相信我能飞)
  13. 下载最新版本火狐浏览器,并且下载geckodriver.exe
  14. python将后宫佳丽三千做成照片墙
  15. LDO和BUCK降压稳压器对比
  16. maven 解决Cannot access alimaven (httpmaven.aliyun.comnexuscontentrepositoriescentral)
  17. CodeForces 1000A Codehorses T-shirts
  18. 【直通BAT】BAT后端开发36题:Redis、Nosql、Mysql、秒杀题目!含面试经验总结!(优知学院公众号)
  19. Selenium+Python测试键盘操作---全选、复制、剪切、粘贴
  20. Python全栈开发零基础学习通关秘籍:2018新手入门指南

热门文章

  1. Javascript - 实现Javascript控制ScrollBar(滚动条) - 学习/实践
  2. sandstone hypercube超融合一体机知识
  3. AC695X独立输出8路PWM+红外遥控接收
  4. Verilog 与门
  5. python3 文件重命名_Python3 os.rename() 方法
  6. SAP 常见英语 对应中文翻译
  7. 如何禁用 Microsoft Edge 自动更新(Windows、macOS)
  8. pytorch 源_Windows10+CUDA 10.1.0+pytorch安装过程
  9. 高数 | 【概念剖析】一元、二元微分,连续、可微、可偏导、偏导连续的超强通俗解析!
  10. 人脸识别之人脸验证(一)--Deepface