こんにちはtaniと申します。RX231マイコンでCAN通信を行っています。
CANalyzerからCANデータを送信しているのですがACKエラーとなってしまいます。
そこでCANalyzerのSelf ACK機能を用いたところ受信はできるようになりました。
ACKが出ていない原因として何が考えられるでしょうか。(受信はできているのでハードの問題ではないと思うのですが…)
ACKは最後の方に受信側がドミナント(L)を出すものなので、先頭から0/1を追いかけていくと(本来は)判りますが、この解像度ではちょっと判りません。(CANアナライザのメッセージでは、119ビット目がACKスロット:送信側はレセシブ(H), 受信側がドミナント(L)となるポイントだと思われますので、先頭から119ビット目の波形を見れば判るはず)(119→拡張IDでデータ8バイト、ビットスタッフィングなし…
CANバス内に他にノードはいますか?
誰もACKを返してないのではないでしょうか。
誰もACKを返さないとACKエラーになります。Self ACKは自分で出したCAN信号に自分でACKを返すので
ACKエラーにならなくなります。
Noobさん、返信ありがとうございます。
CANalyzerから送信しているので、RXマイコンが受信すればACKを返すものと思っていたのですが誤っているでしょうか。
合ってます。
ただリッスンオンリモードになってると受信はできてもACKを返しません。
この設定は大丈夫でしょうか
リッスンオンリモードではないようです。(CTMS=0)
連続送信ではなく、1shot送信でもACKエラーになるでしょうか。
あとはRXマイコン側で何かエラーフラグが立ってないかを調べるくらいでしょうか。
ごめんなさい。分かりません。
1shot送信でもCANalyzer側でエラーは発生します。
マイコン側のエラーフラグですが複数のエラーが立ったり消えたりします。
B0ERR、B1ERR、FERR,SERR、ALF,BLF,OVLF,BOFFが立ったり消えたりします
こんにちは、taniです。
追加で情報を述べさせていただきます。
同じ種類のマイコンに変えても同じ状態となります。
別の種類のマイコン(ルネサス製)に変えるとSELFACK機能がオフでも通信ができます。
実際にACKが出ていないのか確認するためにオシロスコープで測定を行いました。以下のような波形が測定されるのですがこの画像からACKがでているかどうかはわかりますでしょうか。
手元にはないのですがロジックアナライザを用いないとわからないものなのでしょうか。
CANH
CANL
↓CANalyzerでのエラー表示
ACKは最後の方に受信側がドミナント(L)を出すものなので、先頭から0/1を追いかけていくと(本来は)判りますが、この解像度ではちょっと判りません。(CANアナライザのメッセージでは、119ビット目がACKスロット:送信側はレセシブ(H), 受信側がドミナント(L)となるポイントだと思われますので、先頭から119ビット目の波形を見れば判るはず)(119→拡張IDでデータ8バイト、ビットスタッフィングなし、で丁度計算合いそうな数字ですね)
簡単に調べる方法として、RX231のCTX(CANトランシーバに入る前の信号)にプローブを当てておくと、
ACKを返した場合:パケットの最後の方に1回Lパルスを出す(1Mbpsでは1usのLパルス)
ACKを返さない場合:CTXはHのまま
となります。
ACKを返さない理由ですが、速度(CANアナライザの出力とRX231の設定)が微妙に合っていないのではないかと思います。
RX231は、CANのクロックソースとして「PCLKの1/2」か「メインクロック(XTAL)」のどちらかを選択可能ですが、どちらを選んでいますでしょうか。また、TSEG1とTSEG2をいくつに設定していますでしょうか。
例えばですが、CANアナライザの出力が1Mbpsで、ICLK=54MHz動作で、CANのクロックソースとして「PCLKの1/2」側を選ぶと、速度が合わないはずです。(ICLK=54MHz(最大)に設定し、PCLKをICLK/2=27MHzにした場合、CANのクロックソースとして「PCLKの1/2」側を選ぶとCANのクロックは13.5MHzになり、TSEGをどう設定しても1Mbpsには設定出来ないはずです。)
1/CANのクロック周波数×(1+TSEG1+TSEG2)の値が、送信側のビットレートに合っていない、という事が考えられるかと思います。
こんにちはtaniと申します。
遅ればせながら問題が解決しました。
ボーレートプリスケーラの値が異なる点が原因でした。
ご回答ありがとうございました。