TTCAN,TimeTriggeredCommunication做一个基本的讲解。T T C A N TTCANTTCAN是基于基本的C A N CANCAN总线协议的一种高层协议,其物理层和数据链路层和基本的C A N CANCAN总线协议是一样的,也就是在一个运行T T C A N TTCANTTCAN的高层网络中,电平状态和帧格式和基本的C A N CANCAN总线协议是一样的。在基本的C A N CANCAN总线协议网络中如果多个节点同时发送数据帧,那么根据总线仲裁规则具有最高优先级的数据帧才能被发送出去,这样最低优先级的节点的数据可能很长一段时间都无法发送出去,因此基本的C A N CANCAN总线协议网络很难保证消息的实时性,正是为了保证消息的实时性要求,T T C A N TTCANTTCAN出现了。实时性要求就是当某个节点发生某个事件,该节点必须在一定的时间范围内通过消息帧将该状态发送出去。
下面的讲解我主要参考了I S O − 11898 − 4 ISO-11898-4ISO−11898−4文档以及其他网路上的参考资料,具体看这里。还有就是下面某些内容的讲解会以某个特定的I P IPIP作为例子,这里这个特定的I P IPIP是B O S C H BOSCHBOSCH半导体公司的M_TTCAN,如图1和图2所示,目前S T STST的H 742 H742H742系列使用了这个I P IPIP。

图1.

图2.
T T C A N TTCANTTCAN从总体上通俗的来说的话就是把什么时候发送消息和什么时候接收消息都规定好了,这样就没有了节点的相互竞争总线而造成无法达到实时性的问题。前面提到T T C A N TTCANTTCAN把消息的发送和接收的时刻都规定好了,那么有时刻 就必然有时间的基准,T T C A N TTCANTTCAN的时间基准一共有两个l e v e l levellevel,l e v e l 1 level1level1和l e v e l 2 level2level2,B O S C H BOSCHBOSCH的那个IP增加了一个l e v e l 0 level0level0。这个l e v e l 0 level0level0不是I S O − 11898 − 4 ISO-11898-4ISO−11898−4文档规定的,而是B O S C H BOSCHBOSCH半导体公司自己加的,这个l e v e l 0 level0level0是在事件触发的通信模式(I S O − 11898 − 1 ISO-11898-1ISO−11898−1)的基础上仅仅保留了l e v e l 2 level2level2的可以通过参考消息的发送而在整个网络中建立校准了的时间基准的这一功能,l e v e l 2 level2level2的其它功能l e v e l 0 level0level0不具有。T T C A N TTCANTTCAN的l e v e l 1 level1level1和l e v e l 2 level2level2是时间触发的通信模式(I S O − 11898 − 4 ISO-11898-4ISO−11898−4)。在T T C A N TTCANTTCAN网络中消息的发送和接收都是基于系统矩阵S y s t e m m a t r i x System\quad matrixSystemmatrix的,如图3所示。系统矩阵是在整个T T C A N TTCANTTCAN网络运行之前就规划好的,一个系统矩阵由多个基本周期组成,如图4所示,基本周期是系统矩阵的一行,一般一个系统矩阵包含2的n次方个基本周期,基本周期的最小值是1。一个基本周期又由多个T i m e S l o t Time\quad SlotTimeSlot组成,T i m e S l o t Time\quad SlotTimeSlot是系统矩阵的列。T i m e S l o t Time\quad SlotTimeSlot也可以叫做时间窗口,一条消息的发送和接收都必须在一个时间窗口内完成,当然某些特别的消息可以横跨多个时间窗口。时间窗口分为三种类型:
- 独占时间窗口:这种时间窗口只分配给特定的某一个消息,因此这种时间串口内只有一个节点的消息的收发,因此不存在节点竞争的问题。
- 自由时间窗口:目前没有使用,保留给未来使用。
- 仲裁时间窗口:这种时间窗口内允许多个节点进行消息的收发,总线的优先权和基本的C A N CANCAN总线协议一样通过仲裁来决定,如果某个节点由于仲裁失败而导致消息没有发送出去,则不允许重传,但是有一种特别的情况,就是多个仲裁时间窗口连接到一起的情况,这样的情况下允许重传,但是也要保证不要影响到接下来的非仲裁时间窗口。

图3.

图4.
那如何确定一个基本周期的开始,如图4所示一种特别的消息帧,参考消息R e f e r e n c e M e s s a g e Reference\quad MessageReferenceMessage,的发送与接收意味着一个基本周期的开始。参考消息是由T i m e M a s t e r Time\quad MasterTimeMaster发送的,参考消息与其他消息帧的不同之处在于其I D IDID不一样,一个T T C A N TTCANTTCAN网络中最多有8个T i m e M a s t e r Time\quad MasterTimeMaster,每一个T i m e M a s t e r Time\quad MasterTimeMaster发送的参考消息的I D IDID基本一样,只是I D IDID的最低三位不一样,这是为了区分不同T i m e M a s t e r Time\quad MasterTimeMaster的优先级,一个T T C A N TTCANTTCAN网络中只能有一个激活的T i m e M a s t e r Time\quad MasterTimeMaster,准备8个T i m e M a s t e r Time\quad MasterTimeMaster的原因是防止当前激活的T i m e M a s t e r Time\quad MasterTimeMaster失效之后其他T i m e M a s t e r Time\quad MasterTimeMaster可以马上替代这个失效的T i m e M a s t e r Time\quad MasterTimeMaster。
在l e v e l 1 level1level1时间基准下,参考消息的数据字节最少1个,在l e v e l 2 level2level2时间基准下,参考消息的数据字节最少4个,参考消息的数据字段的最小要求分别如图5和图6所示。无论是在l e v e l 1 level1level1时间基准下或是在l e v e l 2 level2level2时间基准下,参考消息中都应该包含这个参考消息所开启的基本周期的索引(可选),即这是第几个基本周期,以及N e x t _ i s _ G a p Next\_is\_GapNext_is_Gap状态位(后面会重点讲到)。在l e v e l 2 level2level2时间基准下,参考消息中还额外的包含M a s t e r _ R e f _ M a r k Master\_Ref\_MarkMaster_Ref_Mark(后面会重点讲到)和状态比特位D i s c _ B i t Disc\_BitDisc_Bit(后面会重点讲到)。T i m e M a s t e r Time\quad MasterTimeMaster一般会以一种稳定的时间间隔(就相当于是基本周期的长度)去发送参考消息。从图5和图6中的l e v e l 1 level1level1时间基准下或是在l e v e l 2 level2level2时间基准下的参考消息的数据字段的最小要求下,只为基本周期的索引提供了6个比特位,但是协议中并没有限制说一个系统矩阵中最多只有2 6 = 64 2^6=6426=64个基本周期,也就是说可以在剩余的数据字段的字节中扩展基本周期的索引的比特位。图6中的第二个字节的高3位是l e v e l 2 level2level2时间基准下M a s t e r _ R e f _ M a r k Master\_Ref\_MarkMaster_Ref_Mark的小数部分,协议要求至少是3个比特位,但是也可以扩充至7个比特位。 这里有一点需要注意的是T T C A N TTCANTTCAN协议是先于F D C A N FDCANFDCAN协议出现的,因此T T C A N TTCANTTCAN协议是否支持F D C A N FD\quad CANFDCAN协议的数据帧那就要看具体的芯片IP决定了。B O S C H BOSCHBOSCH半导体公司的这个I P IPIP是支持在T T C A N TTCANTTCAN操作中使用F D C A N FD\quad CANFDCAN数据帧的,如图8所示。

图5.

图6.
事件同步的基本周期的开始(E v e n t s y n c h r o n i s e d s t a r t o f b a s i c c y c l e Event\quad synchronised\quad start\quad of\quad basic\quad cycleEventsynchronisedstartofbasiccycle):这是针对前面讲到的参考消息中的N e x t _ i s _ G a p Next\_is\_GapNext_is_Gap状态位。参考消息一般会以一种稳定的时间间隔进行发送,但是T T C A N TTCANTTCAN协议也允许基本周期的发送重新同步到T i m e M a s t e r Time\quad MasterTimeMaster的某一个事件的开始,这就是N e x t _ i s _ G a p Next\_is\_GapNext_is_Gap状态位的作用,如图7所示。当有这个需求的时候,当前的T i m e M a s t e r Time\quad MasterTimeMaster会将此时发送的参考消息的N e x t _ i s _ G a p Next\_is\_GapNext_is_Gap状态位置1,当从这个参考消息开始的基本周期结束的时候,一个T i m e G a p Time\quad GapTimeGap就会开始,这也就导致了前面的周期发送参考消息的状态结束了,在T i m e G a p Time\quad GapTimeGap期间所有的发送操作停止,整个总线处于静默状态那么这个T i m e G a p Time\quad GapTimeGap多长时间结束呢?只要当前的T i m e M a s t e r Time\quad MasterTimeMaster或者是潜在的另一个T i m e M a s t e r Time\quad MasterTimeMaster发送参考消息之后这个T i m e G a p Time\quad GapTimeGap就结束了,T T C A N TTCANTTCAN网络的通信又开始了。

图7.
在B O S C H BOSCHBOSCH公司的这个I P IPIP中,如果要使用N e x t _ i s _ G a p Next\_is\_GapNext_is_Gap位相关的功能的话,T T O C F TTOCFTTOCF寄存器的G E N GENGEN位要置1(网络中的所有节点并包括T i m e M a s t e r Time\quad MasterTimeMaster),也就是不是严格的时间触发的操作模式。G a p GapGap操作由T i m e M a s t e r Time\quad MasterTimeMaster发起,I P IPIP中由两种方式可以发起G a p GapGap操作:
- 软件控制:将寄存器T T O C N TTOCNTTOCN的N I G NIGNIG位置1,下一个发送的参考消息中的N e x t _ i s _ G a p Next\_is\_GapNext_is_Gap位会被置1.
- 硬件控制:将寄存器T T O C N TTOCNTTOCN的G C S GCSGCS位置1,如果在发送下一个参考消息中的的时候,事件触发引脚的输入是高电平,那么该参考消息的N e x t _ i s _ G a p Next\_is\_GapNext_is_Gap位会被置1。
根据B O S C H BOSCHBOSCH公司的这个I P IPIP的描述,网络中的Potential time master有四种方式来结束G a p GapGap周期(虽然I P IPIP文档描述是Potential time master进行以下四种操作来结束G a p GapGap周期,但是我总觉得Current time master也可以进行以下四种操作来结束G a p GapGap周期,不知道对不对):
- 软件控制:将寄存器T T O C N TTOCNTTOCN的F G P FGPFGP位置1将会触发参考消息的再次周期性的发送。
- 硬件控制:寄存器T T O C N TTOCNTTOCN的G C S GCSGCS位已经被置1的情况下,事件触发引脚的下降沿将会将寄存器T T O C N TTOCNTTOCN的F G P FGPFGP位置1,进而触发参考消息的再次周期性的发送。
- 寄存器T T O C N TTOCNTTOCN的T M G TMGTMG位已经被置1的情况下,当下一次T T O C N TTOCNTTOCN的T M C TMCTMC位域选择的时间值和寄存器T T T M K TTTMKTTTMK的T M TMTM位域的时间值一致的时候会将寄存器T T O C N TTOCNTTOCN的F G P FGPFGP位置1,进而触发参考消息的再次周期性的发送。
- 当到达T x _ R e f _ T r i g g e r _ G a p Tx\_Ref\_Trigger\_GapTx_Ref_Trigger_Gap的时候会自动触发参考消息的再次周期性的发送。这种情况说明预期的事件没有按时出现。

图8.
前面提到T T C A N TTCANTTCAN的时间基准一共有两个l e v e l levellevel,l e v e l 1 level1level1和l e v e l 2 level2level2。下面我们来看一下这两个l e v e l levellevel具体是如何实现的。如图9所示,简单的说每一个C A N CANCAN节点芯片都有自己的晶振电路,时间基准就是靠这个晶振电路来实现的,晶振的时钟周期t s y s t_{sys}tsys经过分频以后就得到了最基本的时间基准N T U , n e t w o r k t i m e u n i t NTU,network\quad time\quad unitNTU,networktimeunit,分频的参数是T U R , t i m e u n i t r a t i o TUR,time\quad unit\quad ratioTUR,timeunitratio,N T U = t s y s × T U R NTU=t_{sys}\times TURNTU=tsys×TUR。可以看出T U R TURTUR是N T U NTUNTU和晶振的时钟周期的比值。在l e v e l 1 level1level1,N T U NTUNTU是C A N CANCAN总线协议中的比特时间,各个节点的T U R TURTUR值不变。在l e v e l 2 level2level2,N T U NTUNTU大概是一秒钟时间的一个部分,也就是不到一秒钟,各个节点的T U R TURTUR值根据接收到的time master发送的参考消息里面的有关time master节点时间基准的信息不断做出调整,这样可以使得网络中其它节点的时间基准尽量和time master保持一致。因为在l e v e l 2 level2level2,T U R TURTUR的值在不断调整,因此整个网络里面各个节点的时间基准视角比l e v e l 1 level1level1下要精确。

图9.
下面我们再来介绍几个时间概念L o c a l T i m e Local\quad TimeLocalTime,C y c l e T i m e Cycle\quad TimeCycleTime,G l o b a l T i m e Global\quad TimeGlobalTime:
- L o c a l T i m e Local\quad TimeLocalTime:在l e v e l 1 level1level1时间基准下L o c a l T i m e Local\quad TimeLocalTime是一个16比特的计数器的值,每过一个N T U NTUNTU时间,计数器的值加1。在l e v e l 2 level2level2时间基准下L o c a l T i m e Local\quad TimeLocalTime也是一个计数器的值,但是这个计数器最少19比特,而不是16比特。16比特之外的其它比特位代表一个N T U NTUNTU时间的小数部分。因此在l e v e l 2 level2level2时间基准下,L o c a l T i m e Local\quad TimeLocalTime的计数器每隔N T U 2 n \frac{NTU}{2^n}2nNTU时间计数一次,计数n次之后才表示过去了一个N T U NTUNTU时间,其中n nn表示L o c a l T i m e Local\quad TimeLocalTime的小数位的个数。
- C y c l e T i m e Cycle\quad TimeCycleTime:如图10所示。当节点检测到总线上的一个数据帧的S O F SOFSOF比特位时,它会将此时该节点的L o c a l T i m e Local\quad TimeLocalTime保存为S y n c _ M a r k Sync\_MarkSync_Mark,当该帧接收完毕的时候如果发现这个帧是参考消息则将该S y n c _ M a r k Sync\_MarkSync_Mark保存为R e f _ M a r k Ref\_MarkRef_Mark,那么C y c l e T i m e Cycle\quad TimeCycleTime就是L o c a l T i m e − R e f _ M a r k Local\quad Time-Ref\_MarkLocalTime−Ref_Mark。前面也提到一个参考消息的接收意味着一个基本周期的开始,正因为如此,一个参考消息的接收有意味着C y c l e T i m e Cycle\quad TimeCycleTime重新从0开始。在l e v e l 2 level2level2时间基准下C y c l e T i m e Cycle\quad TimeCycleTime的计算是没有用到小数部分的,因此无论是在l e v e l 1 level1level1时间基准下或在l e v e l 2 level2level2时间基准下,C y c l e T i m e Cycle\quad TimeCycleTime的计算都只用到了表示整数N T U , n e t w o r k t i m e u n i t NTU,network\quad time\quad unitNTU,networktimeunit的16个比特位。这里还有一点需要提到的是后面在涉及到T T C A N TTCANTTCAN网络中的数据帧的发送的时候会有T i m e M a r k Time\quad MarkTimeMark参数,这个T i m e M a r k Time\quad MarkTimeMark参数参数也是以C y c l e T i m e Cycle\quad TimeCycleTime为基础的。
- G l o b a l T i m e Global\quad TimeGlobalTime:如图11所示。在l e v e l 2 level2level2时间基准下,每次T i m e M a s t e r Time\quad MasterTimeMaster在发送参考消息的时候都会将这个参考消息在S O F SOFSOF时刻的G l o b a l T i m e Global\quad TimeGlobalTime的值作为M a s t e r _ R e f _ M a r k Master\_Ref\_MarkMaster_Ref_Mark放到参考消息中发送出去,当其它节点接收到这个参考消息之后,其它节点会将接收到的这个参考消息的S O F SOFSOF时刻的R e f _ M a r k (以 L o c a l T i m e 为基准) Ref\_Mark(以Local\quad Time为基准)Ref_Mark(以LocalTime为基准)保存下来,此时可以得到一个L o c a l _ O f f s e t = ∣ R e f _ M a r k − M a s t e r _ R e f _ M a r k ∣ Local\_Offset=|Ref\_Mark-Master\_Ref\_Mark|Local_Offset=∣Ref_Mark−Master_Ref_Mark∣参数,那么从此开始这些其它节点的G l o b a l T i m e = L o c a l T i m e + L o c a l _ O f f s e t Global\quad Time=Local\quad Time+Local\_OffsetGlobalTime=LocalTime+Local_Offset,当这些其它节点以后接收到参考消息的时候就会不断的去更新L o c a l _ O f f s e t Local\_OffsetLocal_Offset参数。这里需要注意的是在l e v e l 2 level2level2时间基准下,每次T i m e M a s t e r Time\quad MasterTimeMaster在发送参考消息里面发送的M a s t e r _ R e f _ M a r k Master\_Ref\_MarkMaster_Ref_Mark是以G l o b a l T i m e Global\quad TimeGlobalTime为时间基准的,而不是以L o c a l T i m e Local\quad TimeLocalTime为时间基准的,就算对于T i m e M a s t e r Time\quad MasterTimeMaster它的G l o b a l T i m e Global\quad TimeGlobalTime同样满足G l o b a l T i m e = L o c a l T i m e + L o c a l _ O f f s e t Global\quad Time=Local\quad Time+Local\_OffsetGlobalTime=LocalTime+Local_Offset,对于T T C A N TTCANTTCAN网络初始化以来没有发生过T i m e M a s t e r Time\quad MasterTimeMaster失效而被其它T i m e M a s t e r Time\quad MasterTimeMa