1、CAN OVER SPI ARCHITECTURE,UPS 产品开发部 软件课 张登 2005/6/22,2/40,内容简介,系统架构 功能架构 MGE CAN 协议 SPI性能分析 实现架构 数据流 数据结构 遗留问题和思考 总结,3/40,系统架构,背景介绍 机种 :MGE playmobil 15K/30K 控制板:SCM3 通讯对象:MGE显示板GDEV,4/40,系统架构,5/40,系统架构,通讯端点: GDEV和同一模块内的CORE GDEV和另一模块内的CORE GDEV和GDEV 不同模块的CORE 同一模块内的DSP和MCU,6/40,系统架构,通讯的内容: GDEV获得UP
2、S内部的测量数据 GDEV发送命令给CORE执行相应动作 GDEV执行单机/并机初始化的流程 参数的设置,7/40,功能架构,MCU的主要功能转发DSP和GDEV之间的通讯,不对数据做任何的解释EEPROM的数据的传输与DSP交换相关的采样数据,8/40,功能架构,DSP的主要功能 分析GDEV的数据,做出相应的回复 主动发送数据给GDEV 通过CAN2转发GDEV的数据 接受CAN2收到的数据并转发给GDEV与MCU交换EEPROM的数据 与MCU交换相关的采样数据,9/40,MGE CAN协议,传输特性 波特率: 500Kbit/s 帧格式: CAN 2.0B extended frame
3、 最快传输速度: 3ms/frame,10/40,MGE CAN协议,CAN ID field,11/40,MGE CAN 协议,CAN Data field: 在一帧的8个byte的数据当中,1个byte用来对数据分片进行控制:第一个bit用来表示是否是第一帧数据,后面7个bit用来表示共有几帧数据以及该帧的编号:最长支持7*127=889bytes数据,12/40,MGE CAN 协议,MGE CAN 协议分析 CAN最快的发送速度是每3ms一帧数据,因此,MCU处理CAN数据帧(转发给DSP)的速度必须快于3ms,否则需要做FIFO处理。 在CAN协议中存在两种不同优先级的数据帧,因此每
4、一种优先级必须有独立的FIFO。 由于数据的分片,我们需要对分片的数据进行重组。在重组的过程中,由于两种不同的优先级的数据的存在,可以出现同一ID数据的两个分片当中存在高优先级的其他ID的数据。需要对这种情况进行处理 需要数据的目的地址进行转发或者处理,13/40,SPI协议性能分析,SPI帧格式SPI物理特性 由于MCU的SPI没有硬件的接收Buffer,因此我们采用的底层机制必须在保证系统能够正常工作的基础上提高传输速率,那么我们暂时将波特率定义为100k bits/s,也就是12.5k bytes/s。考虑到其他开销,实际上传送一个byte的时间是100us,就是说,mcu和dsp必须每
5、100us处理一次spi中断。 传送一帧CAN数据的最长时间(不考虑转义字节)为100us(1+1+4+8+1+1)=1.6ms,14/40,SPI协议性能分析,SPI 传输机制 通讯由MASTER(DSP)发起,采用半双工的通讯,每次发送一帧数据,如果不需要发送数据,那么发送一帧空数据。同样,SLAVE如果没有数据要发送,发送一帧空数据。如果需要发送数据,发送的内容由高层来决定。传输机制如图:,15/40,SPI协议性能分析,SPI时间分析 时间对比图如下:,16/40,SPI协议性能分析,SPI时间分析 从整个传输上来看,基本上达到了半双工通讯的极限,额外的开销仅为master和slave
6、的处理时延,该时延应该是us级的时延,一个传送周期如下图示每发送一帧数据最长的时间是1.6ms,因此交换一次数据的最长时间可能是3.2ms。超过gdev的发送间隔,因此,MCU必须通过FIFO来缓存,17/40,CAN2传送能力分析,CAN2的速度决定了是否需要转发的FIFO 对于目前的CAN 协议,传送速度是每4ms 4个byte,因此,需要转发FIFO来处理需要转发的数据。,18/40,实现架构,19/40,数据流 同一模组的GDEV到DSP的数据传输,同一模组的GDEV到DSP的数据传输 选取有两个分片的数据,数据长度为10,数据为0,1,2,3,4,5,6,7,8,9,那么这些数据需要
7、用两个CAN帧来发送,两个CAN帧的数据分别是:CAN FRAME1: CANID 0x82, 0, 1, 2, 3, 4, 5, 6CAN FRAME2 CANID 0x02, 7, 8, 9 如下图示,20/40,数据流 同一模组的GDEV到DSP的数据传输,21/40,数据流 同一模组的GDEV到DSP的数据传输,Step1: MCU接收到第一帧数据,并将其存入接收 FIFOStep2 MCU将第一帧数据封装在SPI的数据区,发 送给DSP,DSP将其存入接收链表。第二帧 数据可能在此之前也可能在此之后被存入 MCU的FIFO buffer.Step3: MCU将第二帧数据通过SPI发送
8、给DSP,DSP 将其加入到接收链表Step4: DSP 搜索整个接收链表,发现有完整的数 据收到,去掉分片的开销,将数据copy到 输出buffer,交给AP层进行解析。,22/40,数据流 同一模组的DSP发送数据给GDEV,同一模组的DSP发送数据给GDEV 当DSP需要发送数据给GDEV的时候,执行如下的动作::我们仍然以以上数据为例,,23/40,数据流 同一模组的DSP发送数据给GDEV,Step1: 用户有数据需要发送,申请数据节点,将用户请求 压入发送队列,可以根据数据类型决定压入高优先 级还是低优先级队列 Step2: 取出当前需要发送的用户请求,高优先级的队列优 先,这时如
9、果还有其他用户数据需要发送,在队列 中排队。发送当前用户请求的第一帧数据。 Step3: 发送当前用户请求的第二帧数据,发送完毕后,释 放用户数据节点。 Step4: 继续取出发送队列中的内容,继续发送数据,24/40,数据流 不同GDEV间的通讯,不同GDEV间的通讯 当AP收到的数据经过filter动作后发现是需要转发的给其他模组的gdev的数据时,需要将所有的数据进行转发,由于内部CAN协议(CAN2)和CAN1的格式不同,因此MGE CAN数据帧的ID也必须在CAN2的数据当中传输 假设需要转发的数据ID=0xCC502 ,数据部分有4个byte,分别为0,1,2,3。共长8 byte
10、,如下图:,25/40,数据流 不同GDEV间的通讯,26/40,数据流 不同GDEV间的通讯,Step1: 将需要转发的数据压入转发队列 Step2: 取出需要转发的数据,把id和数据都当成CAN2的净荷进行发送,CAN2每帧中有4个Byte可以用于传送数据,因此需要两帧进行传送,发送第一帧数据 Step3: 发送第二帧数据,接收的DSP收齐两帧数据后,将数据压入发送队列 Step4: 发送后续数据,27/40,数据结构 memory管理,为节省memory使用,必须使用动态的内存分配,以满足不同请求的需要。在以下场合需要分配ram 插入一个发送请求 插入一个转发请求 插入一个接收数据帧 为
11、提高AP程序的效率和透明性,使用了一种固定大小的动态内存分配方案:每个节点均有一个长度标示和一个数据域用来存储用户的数据,同时利用一个next指针组成单向链表,28/40,数据结构 memory管理,每次需要分配一个节点的时候,取出pFreeList指向的数据节点即可,同时将pFreeList指向下一个节点 当使用完这个节点时,将其插入链表的最前端即可。 对应不同的数据请求,有不同的数据长度,为节省ram的使用,使用三种不同长度的数据节点分别构成三个不同的链表来进行处理。 三种典型的长度分别是8,16 和120分别对应1个分片,2个分片和15个分片的CAN数据。根据AP的需求,三种长度数据的节
12、点个数分别是30,20,2。 对于高层来讲,只看到两个操作,get操作和free操作,会根据需要分配单元的大小自动寻找合适大小的节点。 void *spGetSpiMem(INT16U length); void sFreeSpiMem(void *pnode);,29/40,数据结构 数据请求,在需要发送或者需要转发或者需要接收的时候,需要对数据进行队列处理。队列的内容需要保存CAN的所有数据。存储CAN帧的数据结构如下: ID Field,30/40,数据结构 数据请求,CAN request 一个CAN的数据请求包括一个CAN ID 和一个指向数据节点的指针。通过对REQUEST的队列处
13、理。可以实现CAN数据的缓存,如下图示:,31/40,数据结构 MCU FIFO,由于MCU侧的接收队列仅对一帧CAN数据进行缓存,而不是重组后的数据,因此MCU的接收队列不需要动态的分配节点的大小,而是使用固定的长度为8 的队列。其控制逻辑如下图:D 使用ADD和GET操作插入和取出一个CAN帧,32/40,数据结构 DSP发送队列/转发队列,由于DSP的发送请求和转发请求都是针对用户数据的,是将分片组合后的数据,其长度可能超过8个byte,所以队列的内容不再是固定长度的can数据帧,而是CAN request,控制结构如下: 同样通过add和get操作进行插入和取出,33/40,数据结构
14、DSP接收重组,由于GDEV的数据可能有很多的分片并且可能出现不同ID的分片混杂的现象出现。因此对接收的处理比较复杂。需要对所有接收到的数据进行缓存处理,并且可以根据不同的优先级使用不同的FIFO处理,也可以用使用一个双向的链表保存所有的数据,并通过搜索整个链表来找出已经收齐的数据,同时,对于很长时间没有收齐的数据,需要做超时处理。数据结构如下图:,34/40,数据结构 DSP接收重组,对于这样的链表有两个操作:Add操作和delete操作,往链表中加入一个节点或者删除一个节点。 系统维护两个链表,free链表和busy链表,free链表用来存储未使用的节点,而当接收到数据时,从free链表取
15、出一个节点,加入到busy链表的最后。 每加入一个新的数据,那么就会搜索整个busy链表,根据数据字段的第一个byte去检查是否有完整的数据收到,如果有完整的数据收到,那么将数据去掉该字节后重组,放入输出buffer中。并将属于该ID的所有节点从busy 链表中删除,加入到free链表。如果超过了timer out 仍没有收齐所有分片,那么也将属于该ID的所有节点从busy 链表中删除,加入到free链表。,35/40,遗留问题和思考,以上结构虽然得以实现但比较复杂 越来越多的客户需要CAN通讯,而且很多使用自己的CAN协议,36/40,遗留问题和思考 利用现有平台实现的架构:SCM3/SCM
16、1,SCM1仅有一个CAN BUS的资源,因此必须使用同一个CAN BUS,对于SCM3也可以使用同一个CAN BUS,客户的协议和我们的协议在同一个 CAN BUS上并存,拓扑如下 优点: 不需要额外的资源 缺点: 必须区分用户协议格 式和我们内部的格式或 者修改我们的协议 数据存在冲突,不容 易安排时隙,37/40,遗留问题和思考 利用现有平台实现的架构:SCM3/SCM1,对于SCM3,MCU DJ128仍然有一个CAN BUS,除了我们现在使用的结构,还可以有如下结构:将MCU的CAN BUS都连接在一起 优点 不需要通过CAN2进行 用户数据的转发 缺点 仍然需要SPI协议进行发送,
17、38/40,遗留问题和思考 可能之规划,选用具有双CAN的处理器,拓扑如下: 优点 同一个CPU简化通讯 内部协议和客户协议独立 缺点 对CPU的处理能力和资源要求较高,可能成本较高 需要重新规划硬件,39/40,遗留问题和思考 可能之规划,使用转换板,使用一个具有双CAN的处理器,一个CAN连接到内部的CAN,另一个连接到客户的CAN,拓扑如下:、 优点 可以不修改现有的硬件平台,使用灵活方便 客户协议和内部协议独立 缺点 额外的成本 内部CAN需要传递所有客户需要的信息,40/40,总结,本文在SCM3上实现了和MGE接口板GDEV的通讯,但是结构和实现较复杂,希望以后可以用更好的方式处理越来越多的客户CAN协议谢谢!,