CANの規格では発振器の許容誤差、つまりCLOCK周波数の許容誤差は最大1.58%となっている。
これに対してBoschのVHDL Reference Modelでは1.7%で評価するようになっている。
今日はこの許容誤差について見てみた。
私のtest benchには自作IPが3つとOpenCoresのCAN IPが1つの計4つのNodeがCAN busに
繋がっているが、自作IPに供給している各々のclock周波数についてNode1を-1.7%、Node3を+1.7%
Node2は±0%でsimulationしてみたところ、正常に通信できた。
CAN busではclockは伝送されないため、受信側は受信信号の切替り部を見て内部で生成しているSampling clockの位相調整を行う。従って例えばIDも0、DATAも0のような信号変化が少ないdataの伝送の場合は位相調整が難しくなってしまうことになるが、CAN規格ではbit stuffingという手法で同じ値が5bit連続したらその反転したbitを1bitその後に挿入して、最悪でも6bit期間に2回は信号の切替りが発生するようになっている。
この波形は上記波形の一部を拡大したものだ。b2t_txenはCAN IP内部で生成している送信用clockでb2r_spenは受信用clockだ。(正確にはclock enable信号)
Node1~Node3はそれぞれclock周波数が違うのでの信号変化が無いと徐々にズレていくが、信号変化があると位相が調整されている。
次の波形は信号が1bit毎に反転する場合だ。
ということで、±1.7%は問題ないことが判った。
では1.8%ではどうだろう。。。simulationしてみた。
ErrorでRetryが起きているようだ。
最初のErrorの部分を拡大してみた。
Reference Modelとして使っているOpenCoresのCAN IPが、CRCが一致せずError Flagを送信している。上記の波形を見るとNode3, Node2の信号の受信には成功しているので、マイナス方向の周波数誤差が許容できていないのかも知れない。
Simulationでこういった点が評価できるのは、面白い気がした。
0 件のコメント:
コメントを投稿